一直对堆内存和栈内存搞不明白,最近看了一个视频,有了新的了解,在这里给你们分享一下java
好多刚入门学习 Java 的人老是搞不清楚类和对象的关系,在这里简要说明一些。
类:顾名思义,一类东西,好比女孩、男孩、人、狗狗,都是类(class),莹莹、小明、团团,则是对象(object)。
也能够理解为对象是类的具体化(实例),类是泛指,对象是有具体指向。
class Dog 中,Dog 是类编程
public class Dog { public String color; public String name; public Integer age; }
tuan = new Dog 中,tuan 是对象,是 Dog 类的实例,每一个狗狗的名字,颜色、年龄,都不同。less
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,则对应的存储信息以下图:
code
能够简单暴力的理解为引用对象的地址,即栈内存中的地址,好比:视频
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 面向对象编程blog