实际上,如果严格区分类的初始化 和 对象的实例化的话,更容易理解:
-- 首先,初始化
静态代码块
(注:静态变量在底层实际上是通过静态代码块赋值的
如,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 只输出了一次