标签:10 num 创建对象 脑图 详解 内存 JVM Main public
一、对象的实例化
1、创建对象的方式
2、创建对象的步骤
脑图:https://www.processon.com/view/link/61701a927d9c087040525226
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、从字节码看对象实例化过程
二、对象的内存布局
1、对象头
2、实例数据
3、对齐填充
脑图:https://www.processon.com/view/link/6170441d63768961e9dc38fc
代码示例:演示对象内存布局
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 }
三、对象的访问定位
1、介绍
Java虚拟机规范中,并没有明确的规定,采用哪种访问方式。Hotspot采用的是直接指针。
脑图:https://www.processon.com/view/link/6170d2cf1e0853446e56c089
2、句柄访问
3、直接指针(Hotspot采用)
注:个人感觉这里有点不对。这里的"对象实例数据"和上面图中的应该不是一回事,不然看起来好像实例数据里面包含了到对象类型数据的指针一样。这里应该叫"对象数据"比较合理一点。
这个指针,应该是放在对象头里的。
标签:10,num,创建对象,脑图,详解,内存,JVM,Main,public 来源: https://www.cnblogs.com/originator/p/15435378.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。