對象和對象引用

每天都在變化,每天都在進步

本篇博客從例子出發講解對象和對象引用的關係


  1. 基礎情況

    
    A a=new A();
    
    A a; //創建了個A 類型的引用a,此時指向null
    
    new A(); //在堆中創建了一個類A的對象,返回其引用地址
    
    = //將對象的地址給予引用
    

  2. 情景1

    A a=new A(); //(01)
    A b=a;//(02)
    a=null;//(03)

    此時b仍然有數據,因爲(02)的時候,發生了複製行爲,引用發生了複製,也就是此時a,b 同時指向了(01)的時候創建的對象,此時即使執行了(03),原有的內容仍在,b的引用仍然在。


  3. 情景2

    public void test(A test){
    test=new A();
    }
    
    A a=new A();//(01)
    test(a); //(02)
    

    結論: (01)步驟的a引用仍是原來的,並沒因爲(02 )發生變化,因爲方法傳參的時候也發生了引用的複製,所以此時(02),對第二個test引用進行了修改並不影響(01)的內容


  4. 情景3

    public void test(A test){
    test.setB("dd");
    }
    
    A a=new A();//(01)
    test(a); //(02)
    

    結論:此時a的引用對象內容改變,因爲引用和複製後的引用都指向相同的對象,此時會發生變化


  5. 情景4

    對於List、Map 是等同的

    A a=new A();
    List<A> test=new ArrayList<>();
    test.add(a);
    a=null;  

    結論:這個情況和情景2類似,發生了方法傳參

總結:對於對象引用來說 “=” 和傳參會導致引用複製,此時就相當於多個引用對應於一個對象,此時其中的一個引用更換引用或者設置爲null並不會影響其他的引用,如果修改了對象,則對於所有引用,其內容都是一致的。

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