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?下一章和大家分享一下这个问题的解释,谢谢大家啦!