您的位置 首页 java

Java对象new初始化顺序

第一次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

图片与文章内容无关

文章来源:智云一二三科技

文章标题:Java对象new初始化顺序

文章地址:https://www.zhihuclub.com/181619.shtml

关于作者: 智云科技

热门文章

网站地图