Java 對象內存分析

一直對堆內存和棧內存搞不明白,最近看了一個視頻,有了新的瞭解,在這裏給你們分享一下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

相關文章
相關標籤/搜索