你真的了解java对象吗(对象的创建)

1、如果该对象类未被初始化(1),那么执行<clinit>类构造器初始化该类

2、如果初始化对象所属类是,发现其父类未被初始化,则初始化其父类

3、如果该对象所述的类已被初始化,则根据其内存布局中的类型指针找到该类在方法区的类型信息(类元数据信息),根据类中的字段个数及大小在堆中开辟一块内存区域,并对这些字段进行默认初始化(整型为0...)

4、执行构造函数初始化对象

      首先递归执行父类的构造函函数

      然后执行实例构造器init,及按照代码顺序依次执行实例字段的显式赋值、实例代码块

      最后执行构造函数中的剩余代码

ps------------------

(1)类的初始化:执行收集类中的类变量的显示初始化语句和静态代码块形成一个<clinit>()方法,语句和代码块的执行顺序按照代码中从上到下的书写顺序

现在明白了为什么在单例模式的DoubleCheckLocking中要使用volatile修饰单例引用了吧,创建对象的过程极其复杂,很有可能在重排序之后导致该对象的引用被返回而对象的初始化并未完成,这回导致难以理解的空指针异常

猜你喜欢

转载自blog.csdn.net/weixin_37311400/article/details/87201210