物件和物件引用

2022-09-15 18:54:15 字數 1763 閱讀 6741

class vehicle

有了這個模板,就可以用它來建立物件:

vehicle veh1 = new vehicle();

通常把這條語句的動作稱之為建立乙個物件,其實,它包含了四個動作。

1)右邊的「new vehicle」,是以vehicle類為模板,在堆空間裡建立乙個vehicle類物件(也簡稱為vehicle物件)。

2)末尾的()意味著,在物件建立後,立即呼叫vehicle類的建構函式,對剛生成的物件進行初始化。建構函式是肯定有的。如果你沒寫,j**a會給你補上乙個預設的建構函式。

3)左邊的「vehicle veh1」建立了乙個vehicle類引用變數。所謂vehicle類引用,就是以後可以用來指向vehicle物件的物件引用。

4)「=」操作符使物件引用指向剛建立的那個vehicle物件。

我們可以把這條語句拆成兩部分:

vehicle veh1;

veh1 = new vehicle();

效果是一樣的。這樣寫,就比較清楚了,有兩個實體:一是物件引用變數,一是物件本身。

在堆空間裡建立的實體,與在資料段以及棧空間裡建立的實體不同。儘管它們也是確確實實存在的實體,但是,我們看不見,也摸不著。不僅如此,我們仔細研究一下第二句,找找剛建立的物件叫什麼名字?有人說,它叫「vehicle」。不對,「vehicle」是類(物件的建立模板)的名字。乙個vehicle類可以據此建立出無數個物件,這些物件不可能全叫「vehicle」。

物件連名都沒有,沒法直接訪問它。我們只能通過物件引用來間接訪問物件。

為了形象地說明物件、引用及它們之間的關係,可以做乙個或許不很妥當的比喻。物件好比是乙隻很大的氣球,大到我們抓不住它。引用變數是一根繩,可以用來系汽球。

如果只執行了第一條語句,還沒執行第二條,此時建立的引用變數veh1還沒指向任何乙個物件,它的值是null。引用變數可以指向某個物件,或者為null。它是一根繩,一根還沒有系上任何乙個汽球的繩。執行了第二句後,乙隻新汽球做出來了,並被系在veh1這根繩上。我們抓住這根繩,就等於抓住了那只汽球。

再來一句:

vehicle veh2;

就又做了一根繩,還沒繫上汽球。如果再加一句:

veh2 = veh1;

系上了。這裡,發生了複製行為。但是,要說明的是,物件本身並沒有被複製,被複製的只是物件引用。結果是,veh2也指向了veh1所指向的物件。兩根繩繫的是同一只汽球。

如果用下句再建立乙個物件:

veh2 = new vehicle();

則引用變數veh2改指向第二個物件。

從以上敘述再推演下去,我們可以獲得以下結論:(1)乙個物件引用可以指向0個或1個物件(一根繩子可以不繫汽球,也可以系乙個汽球);(2)乙個物件可以有n個引用指向它(可以有n條繩子繫住乙個汽球)。

如果再來下面語句:

veh1 = veh2;

按上面的推斷,veh1也指向了第二個物件。這個沒問題。問題是第乙個物件呢?沒有一條繩子繫住它,它飛了。多數書裡說,它被j**a的垃圾**機制**了。這不確切。正確地說,它已成為垃圾**機制的處理物件。至於什麼時候真正被**,那要看垃圾**機制的心情了。

由此看來,下面的語句應該不合法吧?至少是沒用的吧?

new vehicle();

不對。它是合法的,而且可用的。譬如,如果我們僅僅為了列印而生成乙個物件,就不需要用引用變數來系住它。最常見的就是列印字串:

system.out.println(「i am j**a!」);

字串物件「i am j**a!」在列印後即被丟棄。有人把這種物件稱之為臨時物件。

物件與引用的關係將持續到物件**。

物件和物件引用

每天都在變化,每天都在進步 基礎情況 a a new a a a 建立了個a 型別的引用a,此時指向null new a 在堆中建立了乙個類a的物件,返回其引用位址 將物件的位址給予引用 情景1a a new a 01 a b a 02 a null 03 此時b仍然有資料,因為 02 的時候,發生...

Java 物件和物件引用

為了接下來進行更好的分析,我先建立乙個demo類,用於後面的分析。public class demo 接下來,我們用demo類來建立乙個物件。demo demo newdemo 這一條語句,其實包括了四個動作 1 右邊的 new demo 是以demo類為模板,在堆空間裡建立乙個demo物件。2 末...

物件和物件的引用

stringbffer strb new stringbuffer abc new stringbuffer abc 是呼叫stringbuffer類的建構函式建立了乙個物件 strb是new stringbuffer abc 這個物件的引用 new方法建立的才是真正的物件 引用只是指向物件的乙個變...