类中静态/普通/构造初始化顺序

 

 实际上,如果严格区分类的初始化 和 对象的实例化的话,更容易理解:

-- 首先,初始化

   静态代码块

      (注:静态变量在底层实际上是通过静态代码块赋值的 

          如,static int a = 3;   

             实际上,  static int a;     

              static{ a = 3;}   

--  其次,实例化

   实例代码块

   构造函数

     (注:实例代码块永远在构造函数之前执行)

 

如果又继承关系的话,就是, 父的初始化,子的初始化, 父的实例化,子的实例化

初始化永远在实例化之前

https://www.cnblogs.com/jimxz/p/3974939.html

 

一个例子:注意区分 类初始化  和  对象实例化

public class Test {

    public static Test t1=new Test();

    public Test(){
        System.out.println("init");
    }
    
    {
        System.out.println("blockA");
    }
    
    static {
        System.out.println("blockB");
    }
    
    public static void main(String[] args){
        Test t2=new Test();
    }
}

结果:

 

通过例子区分下  初始化 和实例化

class X{
    static Y y = new Y();
    Y y2 = new Y();
}

class Y{
    Y(){
        System.out.println("y");
    }
}
public class Z extends X{

    public static void main(String[] args) {
        
    }
}

 

Z是主线程,所以要初始化Z,但是会先初始化X。    由于X不涉及到实例化,所以  y  只输出了一次

 

posted @ 2019-07-16 11:34  嘿boom  阅读(354)  评论(0)    收藏  举报