Java基础-面向对象复习知识5
一、对象的内存图
1.1 Java内存分配介绍
每一个软件都会占用一块内存区域,虚拟机也会占用一块空间,只不过为了更好的利用这个内存,提供效率,我们把这块内存分了很多的空间。
在JDG7之前,方法区和堆空间是连在一起的,在真实的物理空间上也是连续的一块空间。但是有某些方面存在缺陷不足,后续补充。JDK8之后取消了这种模式。
1.2 一个对象的内存图
创建一个对象的时候,会进行如下的操作:
举例:
语句1:首先程序从main()方法开始执行,会把.class的字节码文件加载到方法区中,这里就会对main()方法进行临时存储。
语句2:
虚拟机此时就会自动的调用main()方法。所以此时main()方法就会被调用到栈内存中,然后执行后续代码。
然后就会执行main()方法中的第一条语句:Student s =new Student();
会至少执行7条步骤:
①加载Student.class到方法区临时存储,在这里面会有class定义的所有的变量和方法。
② 申明局部变量,在mian()方法中会开辟一块空间名称为s,能存储这个对象的地址值。
③ 在堆内存中开辟了一个空间,假设其地址值为001,那么它就会把Student.class中所有的成员变量拷贝一份过来,除此之外还会有成员方法的地址值,方便我们调用方法的时候能找到对象。
④ 默认初始化根据系统的设定。
⑤ 显式初始化,假如我们在写Student类文件的成员变量的时候默认赋值了初始值,比如name = “张三”,那么在这一步就会显示出来。那么则默认初始化不会覆盖。
⑥ 我们new Student()括号中什么都没有写,代表调用的是空参构造,空参构造中也没有写代码,此步骤也可以忽略。有参构造的话就会执行有参构造的调用。
⑦ 将堆内存中的地址001赋值给左边的局部变量。自此一个对象才创建完毕。
当这些话打印完毕之后,study方法就要出栈,当main()方法完成之后也会出栈,程序结束。系统将会自动清理剩余的残留数据。
1.3 两个对象的内存图
其实就是把一个对象的内存图的流程重复两次而已,不再详细赘述。
答案是不需要的,直接用就可以了。
1.4 两个引用指向同一个对象
原来开辟001地址空间会赋值给临时变量stu2,那么在对此进行赋值操作就会改变001空间的原有的数据。stu1和stu2实际上指向的同一块堆内存中的地址,指向的是同一个空间。
给stu1 = NULL,相当于将地址寻址的路径给截断,那么打印时编译器就找不到相应的数据。
1.5 基本数据类型和引用数据类型
以前我们只会记忆口诀如图,这其实是强行记忆,没有找到本质区别。
int a = 10;在内存中开辟了一块空间真实的存储了10数据。并没有去其他的内存空间,比如方法区啊找或者说引用数据,我们就称之为基本数据类型。
引用数据类型,就是对其他的内存空间中的变量和方法进行引用。
1.6 this内存原理
举个例子:
这里的method()方法是被s调用的(地址为001),而this也是001,第一个sout(age)前面没有this触发就近原则,就会打印10,打印sout(this.age)相当于获取001.age。
同理set()方法中也是这样,本质上是将参数中的字符串赋值给001.age,那么真是赋值到了右边的堆内存中空间去。
1.7 局部变量和成员变量的区别
除了这一点之外,还有五点区别,不需要强行记忆,了解即可:
声明:
以上均来源于B站@ITheima的教学内容!!!
本人跟着视频内容学习,整理知识引用。