类的初始化顺序

示例:
蓝色块:类字段
绿色块:实例字段
紫色块:xxx,class

- M类中定义了静态变量与静态块,和实例变量,实例块以及构造函数
1. 如果在M类中,定义了静态对象且为其初始化
staitc C c = new C();

由于静态变量和静态块的初始化顺序,取决于在代码中的书写顺序,所以M蓝色块内的顺序要看代码的具体情况
2. 如果在M类中定义了实例变量且为其初始化
C c = new C();

3. 如果在M类中的实例代码块中,定义了实例变量且为其初始化
{C c = new C();}

4. 如果在M类中的构造函数中,定义了实例变量且为其初始化
public M(){C c = new C();}

M类初始化时,对于实例绿色块顺序为:变量->块->构造函数,可见先执行了块,之后执行构造函数时初始化了实例C
- 总结:

代码说明:
public class Class_Init_Order { static { System.out.println("In Class_Init_Order"); } public Class_Init_Order() { System.out.println("In Class_Init_Order_con"); } public static void main(String args[]){ MyClass mc1 = new MyClass(); } } class ClassA{ static { System.out.println("In ClassA Static"); } { System.out.println("In ClassA"); } public ClassA(){ System.out.println("ClassA()"); } } class ClassB extends ClassA{ static { System.out.println("In ClassB Static"); } { System.out.println("In ClassB"); } public ClassB(){ System.out.println("ClassB()"); } } class ClassC extends ClassB{ //访问类的常量,不会初始化类 //public final static int b = 1; //通过 类名. 访问 类的 静态变量时,不执行类的构造方法 // public static String a; static{ System.out.println("In ClassC Static"); //a = "...str"; //静态语句块只能给静态变量赋值,里面不能出现方法,同样,静态方法里面也不能出现静态语句块 } { System.out.println("In ClassC"); } public ClassC(){ System.out.println("ClassC()"); } } class MyClass { // static{ // System.out.println("In Static MyClass"); // } //static int i = 1; // ClassC ca = new ClassC(); //类加载过程中的准备阶段,会为类变量(static)分配内存,设初值(null) // ClassC cc = new ClassC();//变量赋值 早于 {} 块执行 { i = 10; //ClassC ca = new ClassC(); System.out.println("In MyClass"); } static{ System.out.println("In Static MyClass"); } public MyClass(){ //i = 100; ClassC ca = new ClassC(); System.out.println("MyClass()"+i); } }

浙公网安备 33010602011771号