目录
对象实例化的几种方式
对象创建的六个步骤
对象的内存布局
对象的访问定位
对象实例化的几种方式
对象创建的六个步骤
- 第4步的初始化指的是对成员变量进行初始化,比如 有一个成员变量int i;这个默认就会赋个初值0,对象引用就是默认null,如果是方法中的局部变量不手动赋初值是会报错的。
- 第6步的初始化才是我们所熟悉的初始化,构造器的方式、代码块的方式对属性进行初始化。
- 还有一个<cinit>是对类中静态属性的一个初始化,属于是类构造器的方法,理解为类初始化;<init>只能算类的构造器对应的方法,理解为实例初始化
- 总结一下:代码Object object = new Object() 在这句代码中,new就相当于生活中,你画美少女的时候,你已经把轮廓,大概的样子都画完了,但是眼睛啊、颜色啊还没有画上去,这个时候可以说已经有了这个美少女,但是不全面,对应1、2、3、4、5步;Object()初始化就相当于是把眼睛、颜色都画了上去,这时候美少女才是全面的,真正意义上画好了,对应第6步,对象创建就大概是这个例子的意思。
对象的内存布局
- 对象头参考《深入了解java虚拟机》53页
- 对象头范围大的来看就是分为 运行时元数据(Mark Word)和 类型指针(指向元空间中该类的类型信息)
对象的访问定位
- 句柄访问缺点:空间上需要开辟一块专门记录对象实例数据的指针;时间访问对象实例还得先访问指针再访问到实例数据,比较慢
- 句柄访问优点:对象发生移动,只需要更改实例数据指针,而不需要全部更改
- 直接指针就是速度快,而且不用开辟空间专门放个指针 我们默认就是用的这个