六、对象内存图
先来复习一下java内存分配:
1.一个对象的内存图
程序从main方法开始执行,首先将TestStudent字节码文件加载到方法区里面,这个时候将main方法进行了临时存储,然后虚拟机会自动调用程序的主入口main方法,main方法会被加载到栈里面,然后执行main方法里面的代码
第一句代码:Student s=new Student();
创建对象(由上图可知需要七步)
(1)加载class文件
在方法区会把Student.class加载到里面临时存储,class里面会有Student的所有信息,比如说所有的成员变量和所有的成员方法,
(2)申明局部变量
其实就是在创建对象时等号左边的代码
在main方法中开创了一块空间,空间名字叫做s,这个空间以后可以存储Student这个类对象的地址值
(3)在堆内存中开辟一个空间
其实就是在创建对象时等号右边的代码
new Student()
由new关键字就是在堆里面开辟了一个空间,而堆里面的空间都是有地址值的.
这个空间的地址值假设是001,这个空间里面会把Student这个类里所有的成员变量拿过来拷贝一份,除此之外,还有所有成员变量存储方法的地址.有地址的原因是以后用对象调用方法的时候,我们能找到对应的方法.此时这个001里面就是我们平时所说的对象
但是这个对象还没有创建完毕,因为name,age还没有值,所以通过4,5,6步骤还要进行赋值
(4)默认初始化
(5)显示初始化
如果在定义成员变量的时候直接给值(下面圈出来的部分),这就叫做显示初始化.没有给出值的时候,可以忽略显示初始化.
(6)构造方法初始化
小括号里面什么都没写,表示调用的是空参构造.空参构造里面什么也没写,所以我们可以忽略构造方法初始化.如果用的是有参初始化构造,此时name和age就有值了.
(7)将堆内存中的地址值赋值给左边的局部变量
此时一个对象创建完毕.
执行过程:
执行完main方法里面的代码之后,main方法出去,main方法里面的变量也消失,变量指向堆内存的对象,由于没有变量去用它(也就是说没有变量指向这个空间了),这个对象也会消失
2.两个对象的内存图
测试类Test2Student字节码文件加载到方法区里面,对main方法进行临时存储,虚拟机调用main方法.
执行main方法里面的代码:
执行第一句的时候参考上面一个对象的内存图的讲解.
在创建第二个对象时,过程如下:
执行完毕之后:
3.两个引用指向同一个对象
执行过程:
重点图:
堆内存中的对象没有人用它的时候,就会消失:
执行完毕之后:main方法出栈
注意:
当两个变量指向同一个空间的时候,只要其中一个变量对这个空间里面的值发生了改变,那么其他的变量再次访问的时候就是改变之后的值.
4.基本数据类型和引用数据类型内存原理
基本数据类型是在变量中存储的是真实的数据值.
引用数据类型记录的是其它空间的地址值.
比如我们在代码中创建的对象,数组;都是引用数据类型.
数组:
总结:
5.this的内存原理图
this的作用:区分局部变量和成员变量
this的本质:所在方法调用者的地址值
案例1:
案例2:
总结:
6.成员变量和局部变量的区别
总结
今天的内容你是否有所收获呢友友们🥰如果有写的不对的地方,欢迎大家帮我指正.最后,希望友友们点赞收藏一下博客关注后续的Java学习内容哦~😘💕💕下篇文章内容是超全的面向对象综合案例哦❤️