import static net.mindview.util.Print.*
class Insect{ private int i=9; protected int j; Insect(){ print("i="+i+",j="+j); j=39; } private static int x1=printInit("static Insect.x1 initialized"); static int printInit(String s){ print(s); return 47; } } public class Beetle extends Insect{ private int k=printInit("Beetle.k initialized"); public Beetle(){ print("k="+k); print("j="+j); } private static int x2=printInit("static Beetle.x2 initialized"); public static void main(String[] args){ print("Beetle constructor"); Beetle b=new Beetle(); } } 输出结果是: static Insect.x1 initialized static Beetle.x2 initialized Beetle constructor i=9,j=0 Beetle.k initialized k=47 j=39 因为是静态方法。
JAVA初始化顺序 1、调用顺序: JAVA类首次装入时,会对静态成员变量或方法进行一次初始化,但方法不被调用是不会执行的,静态成员变量和静态初始化块级别相同,非静态成员变量和非静态初始化块级别相同。 先初始化父类的静态代码--->初始化子类的静态代码--> (创建实例时,如果不创建实例,则后面的不执行)初始化父类的非静态代码--->初始化父类构造函数--->初始化子类非静态代码--->初始化子类构造函数 其他说明: 2 、类只有在使用New调用创建的时候才会被JAVA类装载器装入 3、创建类实例时,首先按照父子继承关系进行初始化 4、类实例创建时候,首先初始化块部分先执行,然后是构造方法;然后从本类继承的子类的初始化块执行,最后是子类的构造方法 5、类消除时候,首先消除子类部分,再消除父类部分 static{ System.out.print("1"); } public A(){ System.out.print("2"); } } class B extends A { static{ System.out.print("a"); } public B(){ System.out.print("b"); } } public class Hello{ public static void main(String[] arge){ System.out.println(" "); A ab = new B(); System.out.println(" "); ab = new B(); } } 最后输出是1a2b 2b 変一下
class a{ public class d { } 結果為:
空格
1 2 空格 a 2 b
最后為什么會多一個a呢?
再來一個例子
|
|