先定義一個簡單的類:
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