對象給另一個對象賦值,並沒有產生新的對象,只是產生了新的對象的引用,兩個對象共用同一塊內存空間,只是引用不同。
下面給一個例子
public class 測試 { public String 屬性; public 測試(String 屬性){ this.屬性 = 屬性; } public String get屬性() { return 屬性; } public void set屬性(String 屬性) { this.屬性 = 屬性; } }
public class Main { public static void main(String[] args) { 測試 a = new 測試("1"); 測試 b= a; b.set屬性("2"); System.out.println("a的值:"+a.get屬性()+",b的值:"+b.get屬性()); } }
輸出結果:a的值:2,b的值:2
開發中遇到了類似的情況,如果b=a語句,只是把a復制一份,給了b,那么改變b的值,應該不影響a的值啊,但是這里影響到了。得出結論,b=a,只是把a的引用賦值給了b,現在ab兩個對象,公用同一塊內存地址。
但是我又想,如果創建對象b的時候用了new關鍵字,那不是開辟新的一塊內存了嗎,這時候b不會影響a了吧。
實驗如下:
public class Main { public static void main(String[] args) { 測試 a = new 測試("1"); 測試 b = new 測試(""); b = a; b.set屬性("2"); System.out.println("a的值:"+a.get屬性()+",b的值:"+b.get屬性()); } }
輸出結果:a的值:2,b的值:2
結果和剛才一樣,b是開辟了新的內存空間,創建了一個新的空對象,但是執行了b = a語句之后,b又重新指向了a的對象,剛才那個空對象就沒有引用指向它了,至於這個空對象怎么樣了,java的回收機制會處理的。
最后,代碼里的變量名用的中文,只是覺得好玩,希望大家不要模仿。