java 在静态代码块之前加个静态变量的构造方法 该怎么执行

 

执行结果:

 

有没有大佬知道 第一次加载类的时候,静态代码块是个什么状态?

静态代码块:用于给类初始化,类加载时就会被加载执行,只加载一次。

构造代码块:用于给对象初始化的。只要建立对象该部分就会被执行,且优先于构造函数。

构造函数: 给对应对象初始化的,建立对象时,选择相应的构造函数初始化对象。

创建对象时,三者被加载执行顺序:静态代码块--->构造代码块--->构造函数

/**
     * 1.static test t1 = new test();
     * 输出:
     *      代码块
     *      0 //c 还没赋值默认0
     *      构造方法
     * 
     * 2.static {
     *         c = 2;
     *         System.out.println("静态代码块");
     *     }
     *  输出:
     *      静态代码块
     *
     * 3.test t2 = new test();
     *     代码块
     *     2 //c已经赋值
     *     构造方法 
     *
     *
     */

 

加载的时候不能单看静态代码块,而是把静态的部分当成 静态域 这个一个整体,静态域包括静态变量,静态方法,静态块 , 加载的时候把他们看成一个整体

1.static test t1 = new test(); 先去加载 test 类,

2.初始化第一个静态变量 t1, 这时候会调用构造块和构造方法 输出:0,代码块、构造方法

代码块始终会在构造函数之前执行,因为没有构造函数,所以走默认的构造函数,为啥静态块没有走?像我们刚才说的静态域已经执行了静态变量,如果再执行静态代码块就属于静态域重复执行,这样加载就会混乱!

3.静态变量初始化完毕了,然后执行静态代码块 , 输出:静态代码块

4.test t2 = new test(); 会调用无参构造,所以代码块会先执行 输出:2,代码块、构造方法