天天看點

java 引用類型變量_java 成員變量中的引用類型變量如何儲存?

首先要了解應用和對象兩個概念。

對象這個概念,相信會程式設計都了解,對象就是: “資料”加上“操作資料的方法”。對于機器來說,一個對象就是一塊記憶體,裡面存了資料。(類的定義(方法/靜态變量)是單獨存的,這裡不将它認為是對象的一部分)。

這個對象的記憶體裡存了什麼資料呢? 就是這個對象的執行個體變量(或者叫成員變量)。(不考慮java中對象的一些其它的頭資訊)

執行個體變量有些啥?所有的基本類型 和引用類型。一般的Java入門書裡可能不會提到引用類型,一般說java虛拟機的書才會提到。引用類型占4個位元組,存放的資料是對象的引用(記憶體位址)。 學過C的人很容易将引用類型和指針聯系起來。

任何一個對象,都至少有一個引用(沒有引用的對象都将會被垃圾回收器回收)。這些引用的資料類型就是引用類型。

public class Test {

private Object instanceVariable = new Object();

private int instanceVariableInt;

public void method() {

Object localVariable = this.instanceVariable; // 假設程式剛執行完這一行

}

}

我們來看上面的類,簡單的認為這個類有兩個執行個體變量,instanceVariable為引用類型,存放的是一個對象的引用(記憶體位址)。instanceVariable作為執行個體的一部分,存在堆記憶體中, 然而他引用的對象則在堆記憶體中的另外一個塊記憶體區域。

上面類中的localVariable也是引用類型,它是局部變量,它不是對象的一部分,存放在棧幀中。如下圖:

第一個問題: Java中的引用變量儲存在記憶體中的哪塊區域?是堆記憶體還是虛拟機棧的棧幀中?

要看是局部變量還是執行個體變量,局部變量(localVariable)存放在棧幀中,執行個體變量(instanceVariable)是它所屬對象的一部分,存放在對象所在的堆記憶體區域中。

第二個問題:如何了解對象引用儲存在棧中,對象儲存在堆中這句話。

這句話本身不準确。“對象儲存在堆中”絕對正确。 “對象的引用”要看是一個執行個體變量還是局部變量。見第一個問題答案。