昨天我们说到了面向对象编程思想,今天我们来探讨一下对象在内存中的结构是怎么样的。
1、对象在内存中的结构:
java在数据存储过程中一般分为栈区、堆区、常量区等,我们的对象存储一般涉及的栈区和堆区,即在栈内存中存储和堆内存中存储,栈内存是存储基本数据类型和变量名地址的 而堆内存是用来存储对象的。也就是说如果我们new了一个对象,那么他的变量名地址会存放在栈内存中,他的具体指向会存放在对象的堆内存的区域:

内存指向图
大致的指向就长这个样子,画得不好多多见谅。从这个图中我们可以看到,假设我们有一个学生类:Student ,当我们 执行 Student student = new Student(); 时。我们的程序会在栈内存中去申请一个内存空间,然后在内存中存放一个指向堆内存中的空间。而我们对象的属性会存储在堆内存中。同样的 堆内存中依旧存放属性的内存地址。一个指向具体值的地址,指向常量区的地址。
2、对象数属性如何赋值的:
当我们创建一个对象时,我们相当于申请了一个存放数据的地址,但是具体属性是没有值得。那么我们就需要给属性进行赋值。这里我们再说一个区域:常量池。我们为变量赋予的具体值,一般会存放在常量池中。即 student.name = “弓长”; 弓长就会被放在常量池中,而我们的name中存放指向常量池的地址。

指向图
差不多就长成这个样子。我们常量区里面的数据是最多只会有一个相同数据,也就是说,当student1也叫弓长的时候,只会更改指向常量区的地址,常量区不会去新增一个弓长。也就是说变量之间的赋值,也不是常量的赋值,而是引用地址的赋值 如 student1.name = student.name 中,只是将指向”弓长“的引用地址进行了赋予,并不会在常量区中重新分配一个”弓长“。
3、对象之间的赋值
既然说到了变量之间的赋值,那么我们再说说对象之间的赋值。我们前面说了,对象存放数据是在栈内存中存放一个指向堆内存的地址,那么当我们针对对象之间赋值也是地址指向的赋值。
如 :我们让student.name = “弓长” student.age = 12
student1.name = “张” student.age = 15 时
当 student = student1 时:

赋值图
赋值都地址指向大致就会变成这个样子,此时我们student和student1同时指向一个地址,而没有被指向的地址区域中的数据就会被认定为垃圾数据,被垃圾清理机制清理掉。
那么当我们对student.name的值进行修改时,student1.name也会发生变化,这就是对象的赋值。他是一个地址传递的过程,而不是值传递的过程。通俗的例子来说 就是一个人 叫张三,一天他起了个笔名叫弓长,当弓长写了一篇文章时,张三也就写了一篇文章。
都看到这里了,请点个关注再走呗!!