一直对堆内存和栈内存搞不明白,最近看了一个视频,有了新的了解,在这里给大家分享一下
对象内存与引用
对象
好多刚入门学习 Java 的人总是搞不清楚类和对象的关系,在这里简要说明一些。
类:顾名思义,一类东西,比如女孩、男孩、人、狗狗,都是类(class),莹莹、小明、团团,则是对象(object)。
也可以理解为对象是类的具体化(实例),类是泛指,对象是有具体指向。
class Dog 中,Dog 是类
public class Dog {
public String color;
public String name;
public Integer age;
}
tuan = new Dog 中,tuan 是对象,是 Dog 类的实例,每个狗狗的名字,颜色、年龄,都不一样。
tuan = new Dog();
tuan->color = "white";
tuan->name = "tuan";
tuan->age = 3;
这样我们就定义了一个完整的对象 tuan,可以看到,类只是定义了狗应该有的属性,名字,年龄,颜色,但是并没有说明是什么样的狗,对象则指向具体是哪只狗狗,狗狗名字是什么,年龄多少,颜色是什么。
内存
可以简单的理解一个电影院,有多少位置。比如有100个位置,则内存就是100。
堆内存:保存对象的具体信息,比如:第三排,第三号的座位 C,则 C 的具体信息(座椅大小、材质、柔软度、颜色,能否调节),就保存在堆内存中
栈内存:保存对象的位置,比如:第三排,第三号(位置为 33 号),则 33 号存储在栈内存中
关系如上图,一个座位号对应一个座位。eg: public class Site{}, Site 是位置信息,c = new Site()。当我们 new 一个对象时,就会在堆内存中开辟一个空间,存储对象信息。比如,在电影院里3排3座放一个椅子,这个椅子叫做 c,他的位置是3排3号(电影票,在取票箱中),我们可以根据电影票找到对应的座椅。座椅是有属性的,c->size = 23,则对应的存储信息如下图:
引用
可以简单暴力的理解为引用对象的地址,即栈内存中的地址,比如:
c = new Site();
c->size = 23;
// c1 引用 c 的地址
c1 = c;
// return c1->size; 输出: 23
c1->size = 24;
//return c->size; 输出: 24
// 由于 c 和 c1 指向的都是同一个对象,因此改动之后都会变化
内存垃圾
c = new Site();
d = new Site();
d = c; // d 和 c 指向一个对象
垃圾内存不能再被使用,但仍然占据内存空间不放,在随后的一个不确定的时间被垃圾回收器收走(释放掉
如下图:
本文参考视频: Java 面向对象编程