第一次new一个对象
最高父类静态初始化块/最高父类静态field声明时初始化 –> … –>直接父类静态初始化块/直接父类静态Field声明时初始化 –> 本类静态初始化块本类静态Field声明时初始化 // 这个主要是初始化类
–> 最高父类非静态初始化块/最高父类非静态Field声明时初始化 –> 最高父类 构造器 –> … –> 直接父类非静态初始化块/非静态Field声明时初始化 –> 直接父类构造器 –> 本类非静态初始化块/本类非静态Field声明时初始化 –> 本类构造器
第n(n >= 2)次new一个对象
最高父类非静态初始化块/最高父类非静态Field声明时初始化 –> 最高父类构造器 –> … –> 直接父类非静态初始化块/非静态Field声明时初始化 –> 直接父类构造器 –> 本类非静态初始化块/本类非静态Field声明时初始化 –> 本类构造器
解释
第一次new一个对象
JVM首先在内存中开辟一块空间,记载类,夹在过程首先是加载最高父类,在加载次高父类,一直加载本类,夹在过程主要是为类分配类的Field以及方法等空间, 因此执行过程是从最高到本类,依次执行类的静态初始化。
然后才是真正的新建对象,首先新开辟一个最高父类的空间,然后依次是非静态初始化和构造器,当创建最高父类后,在同样的创建次高级父类,。。。直到创建本类。
而非第一次创建对象,则会省略加载类,这样就会省去静态初始化。
注意,初始化块和Field声明时初始化是同级别的,谁在前谁先执行,例如:
public class Test { { a = 100; } int a = 10; public static void main(String[] args) { System.out.println(a); //结果是10 } }
而
public class Test { int a = 10; { a = 100; } public static void main(String[] args) { System.out.println(a); //结果是100 } }
静态初始化块和静态Field声明时初始化的优先级和上面类似。
希望本文能对您理解 Java 对象初始化过程有所帮助。
求** 评论、点赞、关注+转发 **
限于笔者知识有限,如果不足之处请帮忙指正,不喜勿喷!
您的支持是我不懈努力的动力,请读者多支持下!
更多文章,请关注微信公众号 CS_Toper 之路,或者头条号 CSToper 。