类的初始化顺序

 示例:

  蓝色块:类字段

  绿色块:实例字段

  紫色块: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);
    }
}
posted @ 2023-09-17 18:54  bkyvv  阅读(2)  评论(0)    收藏  举报