一、对象的实例化

1、创建对象的方式

2、创建对象的步骤

 

JVM详解(六)——对象的实例化、内存布局与访问定位_创建对象

3、对象属性赋值的步骤

  ①属性的默认初始化——对应脑图中"创建对象的步骤"4

  ②显式初始化——对应脑图中"创建对象的步骤"6

  ③代码块中初始化——对应脑图中"创建对象的步骤"6

  ④构造器中初始化——对应脑图中"创建对象的步骤"6

  注意:②、③是并列的,执行顺序取决于在代码中的先后顺序。

  代码示例:演示②、③执行顺序



1 public class Main {
2
3 {
4 // ③代码块中初始化: num = 200
5 num = 200;
6 }
7
8 // ①属性的默认初始化: num = 0
9 // ②显式初始化: num = 10
10 int num = 10;
11
12 public static void main(String[] args) {
13 Main m = new Main();
14
15 System.out.println(m.num); // 10
16 }
17 }
18
19
20 public class Main {
21
22 int num = 10;
23
24 {
25 num = 200;
26 }
27
28 public static void main(String[] args) {
29 Main m = new Main();
30
31 System.out.println(m.num); // 200
32 }
33 }


4、从字节码看对象实例化过程

JVM详解(六)——对象的实例化、内存布局与访问定位_数据_02

二、对象的内存布局

1、对象头

2、实例数据

3、对齐填充

  脑图:https://www.processon.com/view/link/6170441d63768961e9dc38fc

JVM详解(六)——对象的实例化、内存布局与访问定位_JVM详解_03

  代码示例:演示对象内存布局



1 public class Customer {
2 int id = 1001;
3 String name;
4 Account acct;
5
6 {
7 name = "匿名客户";
8 }
9
10 public Customer() {
11 acct = new Account();
12 }
13
14 }
15
16 class Account {
17
18 }
19
20 // 测试类
21 public class Main {
22 public static void main(String[] args) {
23 Customer cust = new Customer();
24 }
25 }


JVM详解(六)——对象的实例化、内存布局与访问定位_数据_04

三、对象的访问定位

1、介绍

  Java虚拟机规范中,并没有明确的规定,采用哪种访问方式。Hotspot采用的是直接指针。

  脑图:https://www.processon.com/view/link/6170d2cf1e0853446e56c089

JVM详解(六)——对象的实例化、内存布局与访问定位_显式_05

2、句柄访问

JVM详解(六)——对象的实例化、内存布局与访问定位_数据_06

3、直接指针(Hotspot采用)

JVM详解(六)——对象的实例化、内存布局与访问定位_数据_07

  注:个人感觉这里有点不对。这里的"对象实例数据"和上面图中的应该不是一回事,不然看起来好像实例数据里面包含了到对象类型数据的指针一样。这里应该叫"对象数据"比较合理一点。

  这个指针,应该是放在对象头里的。


作者:Craftsman-L