對象的真相——對象給另一個對象賦值產生的誤會


對象給另一個對象賦值,並沒有產生新的對象,只是產生了新的對象的引用,兩個對象共用同一塊內存空間,只是引用不同。

下面給一個例子

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的回收機制會處理的。

  最后,代碼里的變量名用的中文,只是覺得好玩,希望大家不要模仿。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM