JavaRush /Java Blog /Random-TW /Java 中的參考資料類型

Java 中的參考資料類型

在 Random-TW 群組發布
不了解Java語法,就不可能成為認真的開發人員,所以今天我們繼續學習文法。 在之前的文章中我們討論了原始變量,但由於變數有兩種類型,所以今天我們將討論第二種類型——Java中的引用類型。那麼它是什麼?為什麼 Java 中需要引用資料型別? Java 中的參考資料類型 - 1假設我們有一個具有某些特徵的 TV 對象,例如頻道號、音量和標誌:
public class TV {
   int numberOfChannel;
   int soundVolume;
   boolean isOn;
}
像 , 這樣的簡單類型如何int儲存這些資料?讓我們記住:一個變數int是 4 個位元組。但裡面有兩個相同類型的變數(4 位元組 + 4 位元組),還有boolean(+1 位元組)...總計 - 4 到 9,但通常,物件中儲存更多資訊。怎麼辦?您不能將物件放入變數中。在我們故事的這一點上,參考變數出現了。 引用變數儲存特定物件所在的記憶體位置的位址。也就是說,這是一張帶有地址的“名片”,透過它我們可以在共享記憶體中找到我們的物件並用它執行一些操作。Java 中任何物件的參考都是引用變數。這就是我們的 TV 物件的樣子:
TV telly = new TV();
我們設定一個 TV 類型的變量,其名稱telly是指向所建立的 TV 類型物件的連結。也就是說,JVM 在堆上為 TV 物件分配內存,創建它及其在內存中的位置地址,將其放入變數 中telly,該變數存儲在堆疊中。您可以在本講座中閱讀有關內存的更多信息,即堆疊和許多其他有用的信息。TV類型的變數和TV類型的對象,你注意到了嗎?這並不是沒有道理的:某種類型的物件必須有相應的相同類型的變數(不包括繼承和介面實現,但現在我們不考慮這一點)。畢竟,我們不會將湯倒入玻璃杯中,不是嗎?事實證明,我們的物件是一台電視,它的引用變數就像一個控制面板。使用這個遙控器,我們可以與我們的物件及其資料進行互動。例如,設定我們電視的特徵:
telly.isOn = true;
telly.numberOfChannel = 53;
telly.soundVolume = 20;
這裡我們使用點運算子.來存取並開始使用變數所引用的物件的內部元素。例如,在第一行中,我們告訴變數telly:「給我們一個isOn您正在引用的物件的內部變量,並將其設為 true」(為我們開啟電視)。

重新定義參考變數

假設我們有兩個引用類型的變數以及它們引用的物件:
TV firstTV = new TV();
TV secondTV = new TV();
如果我們寫:
firstTV = secondTV;
這意味著我們將第一個變數作為地址副本(地址位的值)分配給第二個對象,現在兩個變數都引用第二個對象(換句話說,兩個遙控器用於同一對象)電視) 。同時,第一個物件沒有引用它的變數。結果,我們有一個無法存取的對象,因為該變數對於它來說是一個條件線程,沒有它,它就會變成垃圾,只存在於記憶體中並佔用空間。該物件隨後將被垃圾收集器從記憶體中銷毀。 Java 中的參考資料類型 - 2您可以中斷與物件的連接線程,而無需另一個連結:
secondTV = null;
結果,將只有一個指向該物件的連結 - firstTV,並且secondTV將不再指向任何人(這並不妨礙我們將來為它分配一個指向某些物件(如電視)的連結)。

字串類

另外,我想提一下String類別。這是一個基類,設計用於儲存和處理以字串形式儲存的資料。例子:
String text = new String("This TV is very loud");
這裡我們傳遞了一個字串來儲存在物件的建構子中。但沒有人這樣做。畢竟,可以創建字串:
String text = "This TV is very loud";
方便多了,對吧?從使用流行度來看,String它並不遜於原始類型,但它仍然是一個類,引用它的變數也不是原始類型,而是引用類型。我們String有連接字串的奇妙能力:
String text = "This TV" + " is very loud";
結果,我們將再次獲得文本:This TV is very loud,因為這兩行將合併為一個整體,並且變數將引用此全文。一個重要的細微差別是String這是一個不可變的類別。這是什麼意思?讓我們來看這個例子:
String text = "This TV";
text = text + " is very loud";
看起來一切都很簡單:我們聲明一個變量,給它一個值。在下一行我們改變它。但我們並沒有真正改變。由於這是一個不可變的類,因此第二行的初始值不會更改,但會創建一個新的值,該新值又包含第一個+ " is very loud".

參考常數

在有關基本類型的文章中,我們談到了常量的主題。當我們將引用變數宣告為final時,它會如何表現?
final TV telly = new TV();
您可能認為這將使物件變得不可變。但不,事實並非如此。 Java 中的參考資料類型 - 3帶有修飾符的引用變數final將綁定到特定對象,而無法以任何方式解除綁定(重新定義它或將其等於null)。也就是說,設定這樣一個變數的值後,程式碼如下:
telly = new TV();
或者
telly = null;
會導致編譯錯誤。即final只作用於鏈接,對對象本身沒有影響。如果我們最初讓它可變,我們可以毫無問題地改變它的內在狀態:
telly.soundVolume = 30;
有時,即使在方法參數中,變數也被指定為最終變數!
public void enableTV (final TV telly){
   telly.isOn = true;
}
這樣做是為了在編寫方法的過程中這些參數不能被覆蓋,從而減少混亂。如果我們表示final一個引用不可變物件的引用變數怎麼辦?例如String
final String PASSWORD = "password";
結果,我們將得到一個常數,一個基本類型常數的類似物,因為在這裡我們既不能重新定義引用,也不能改變物件的內部狀態(內部資料)。

讓我們總結一下

  1. 簡單變數儲存值位,而引用變數儲存表示如何檢索物件的位元。
  2. 僅針對一種類型的物件聲明物件引用。
  3. Java 中的任何類別都是引用型別。
  4. Java 中任何引用變數的預設值為null
  5. String是引用類型的標準範例。這個類別也是不可變的。
  6. 帶有修飾符的引用變數final僅綁定到一個對象,無法重新定義。
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION