對象引用與對象的區別

先定義一個簡單的類:

public class phone{
    int length;   
    int wide;
    double money;
    String color;
}

如果要創建這個類的一個對象,一般的寫法是

phone p1 = new phone();

你有沒有想過爲什麼要這麼寫?等號兩邊分別表示什麼意思?

我們一步步來說:

1. phone p1 表示在棧區創建了一個phone類的引用變量,關鍵字是引用。

2. new phone() 表示在堆空間創建一個phone類的對象,也就是我們所說的new一個對象,最後的括號表示說通過調用構造函數,對這個對象進行初始化。

3. “=” 操作符表示使得等號左邊的引用變量指向等號右邊新創建的對象。

       我們可以發現新創建的對象連名字都沒有,而新創建的引用變量有自己的名字,所以我們沒有辦法直接對新創建的對象操作(對象沒有名字,就沒有標識符,你就沒辦法寫代碼標識他)。我們只能讓引用變量先去指向對象,我們對引用變量的操作就等同於對對象的操作了。

       參考博客裏面把對象比作氣球,把引用比作線。我們沒辦法去摸高空中的氣球,但是可以摸到綁着氣球的線。一個氣球可以有一根或者多跟線,但是一根線在某一個時刻最多隻能綁一個氣球(或者不綁氣球)。

      再看下面的代碼:

phone p2;
p2 = p1;

      p2也是一個新的引用變量,他在被創建時並沒有被指向哪個對象,因此他的值是NULL。第二行代碼中,他被p1賦值,這表示他也指向了p1指向的對象,因此他也可以操作p1的對象。

    如果此時

p2 = new phone()

    那麼 p2 就不再指向之類的對象,而是指向新創建的這個對象了。

    同時,如果此時

p1 = p2;

   有沒有感覺這是一件很可怕的事情,p1和p2都指向的第二次創建的這個對象,那剛剛第一個創建的對象怎麼辦???他好慘啊,連名字都沒有,好不容易有引用指向他,讓我們方便操作他了,現在一下子找不到了??

   恩,是的,找不到了,據說他是被java回收機制給盯上了,可能不會馬上回收,但是java有一個機制,會回收了他。

   所以我仔細一想,你寫這種代碼:

new phone();

    好像沒多大意義,不過參考資料裏面說:

如果我們僅僅爲了打印而生成一個對象,就不需要用引用變量來指向它。最常見的就是打印字符串:

       System.out.println(“I am Java!”);

字符串對象“I am Java!”在打印後即被丟棄。有人把這種對象稱之爲臨時對象。

 

明白了吧各位大佬。

注:這裏多說幾句,對象儲存在,對象的引用儲存在區,基本數據類型儲存在區!

 

參考:https://blog.csdn.net/rosemayzly/article/details/78753131

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章