Java 对象的详细创建过程

大家先看这张图啊,学习Java的大佬们相信都能看得懂上面半部分的代码,下半部分是我们Java的汇编代码,也就是我们Java写出来代码,最后会变成Java的汇编码执行,大家可能有的童鞋看不懂汇编码,不要着急下面我会针对Java对象创建过程来做一下解释,

当我们Java在new一个对象出来的时候,首先他的成员变量是什么样子的呢?成员变量会有一个中间态,当我们在执行 T t = New T();的时候,在Java汇编码上,先执行第一条汇编语句,会先在内存申请一块空间,内存里面 m 的值是一个默认值,默认值为 0 ,大家看下面这张图

基本上所有的基础变量默认值都为 0 ,如果是引用型的变量,那么默认值是 null 值,然后才会执行构造方法,此时 m 的值才是 8 ,就是下面这张图

 执行完构造方法之后执行aastore_1,这句话就是把 t 指向 m = 8,最后把结果返回,到此Java对象创建成功。

中间我们有一条汇编指令没有介绍,就是dup指令,解释起来估计有的小伙伴听不懂,我在下面做个补充,dup指令全称duplicate,这条指令的作用是,当new一个对象的时候,其实会在自己的栈里面存一个引用,这个引用指向这个对象,dup的作用就是再复制一个自己的栈里面的引用,此时栈里面有两个引用,而invokesspecial指令会消耗一个引用,他会把栈里面的一个引用弹出来,把这个引用指向 m 这个对象,然后调用后面的构造方法,然后astore_1把栈里面剩下的引用弹出来 ,赋值给局部变量表排在第一个位置的 t ,说到这里不知道童鞋们有没有理解。。。(注:astore_0是 this )

其实直白点说就是,invokesspecial需要消耗一个引用,因为栈里面一开始只有一个引用,invokesspecial消耗完之后就没有引用指向 t 了,所有dup就是复制一个引用,在invokesspecial消耗完一个引用之后,把另外一个引用指向 t,然后astore_1 把 t 指向 m = 8;

到此,Java创建对象的以后Java汇编语言创建对象的过程结束,不知道小伙伴们理解了没有

理解了的话小伙伴可以思考一个问题,

DCL单例(Double Check  Lock)到底需不需要加volatitle?下一章和大家分享一下这个问题的解释,谢谢大家啦!

 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值