[java] public class Field1{ public Field1(){ System.out.println("Field1构造方法"); } } public class Field2{ public Field2(){ System.out.println("Field2构造方法"); } } public class Field1{ public Field1(){ System.out.println("Field1构造方法"); } } public class Field2{ public Field2(){ System.out.println("Field2构造方法"); } }
下面是演示初始化顺序的代码:
[java] class InitClass2{ static{ System.out.println("运行父类静态代码"); } public static Field1 f1 = new Field1(); public static Field1 f2; }
class SubInitClass2 extends InitClass2{ static{ System.out.println("运行子类静态代码"); } public static Field2 f2 = new Field2(); }
public class Test2 { public static void main(String[] args) throws ClassNotFoundException{ new SubInitClass2(); } } class InitClass2{ static{ System.out.println("运行父类静态代码"); } public static Field1 f1 = new Field1(); public static Field1 f2; }
class SubInitClass2 extends InitClass2{ static{ System.out.println("运行子类静态代码"); } public static Field2 f2 = new Field2(); }
public class Test2 { public static void main(String[] args) throws ClassNotFoundException{ new SubInitClass2(); } } 上面的代码中,初始化的顺序是:第03行,第05行,第11行,第13行。第04行是声明操作,没有赋值,所以不会被运行。而下面的代码:
[java] class InitClass2{ public static Field1 f1 = new Field1(); public static Field1 f2; static{ System.out.println("运行父类静态代码"); } }
class SubInitClass2 extends InitClass2{ public static Field2 f2 = new Field2(); static{ System.out.println("运行子类静态代码"); } }
public class Test2 { public static void main(String[] args) throws ClassNotFoundException{ new SubInitClass2(); } } class InitClass2{ public static Field1 f1 = new Field1(); public static Field1 f2; static{ System.out.println("运行父类静态代码"); } }
class SubInitClass2 extends InitClass2{ public static Field2 f2 = new Field2(); static{ System.out.println("运行子类静态代码"); } }
public class Test2 { public static void main(String[] args) throws ClassNotFoundException{ new SubInitClass2(); } }
[java] class InitClass{ static { System.out.println("初始化InitClass"); } public static String a = null; public final static String b = "b"; public static void method(){} }
class SubInitClass extends InitClass{ static { System.out.println("初始化SubInitClass"); } }
public class Test4 {
public static void main(String[] args) throws Exception{ // String a = SubInitClass.a;// 引用父类的静态字段,只会引起父类初始化,而不会引起子类的初始化 // String b = InitClass.b;// 使用类的常量不会引起类的初始化 SubInitClass[] sc = new SubInitClass[10];// 定义类数组不会引起类的初始化 } } class InitClass{ static { System.out.println("初始化InitClass"); } public static String a = null; public final static String b = "b"; public static void method(){} }
class SubInitClass extends InitClass{ static { System.out.println("初始化SubInitClass"); } }
public class Test4 {
public static void main(String[] args) throws Exception{ // String a = SubInitClass.a;// 引用父类的静态字段,只会引起父类初始化,而不会引起子类的初始化 // String b = InitClass.b;// 使用类的常量不会引起类的初始化 SubInitClass[] sc = new SubInitClass[10];// 定义类数组不会引起类的初始化 } }