2017-09-01 90 views
-5
class TestEntity { 
    public int x; 
    public int y; 

    public TestEntity(int x, int y) { 
     this.x = x; 
     this.y = y; 
    } 

    public String toString() { 
     return super.toString() + ", x -> " + x + ", y -> " + y; 
    } 
} 

TestEntity t = new TestEntity(666, 777); 
List<TestEntity> list = new ArrayList<>(); 
list.add(t); 
t = null; 
System.out.println(list.get(0)); 

爲什麼正確的打印list.get(0)列表後,添加一些對象,並設置對象空

@ XXXXX,X - > 666,Y - > 777

如果我刪除t = null;,做t.x = 888,打印看起來是正確的。

+2

你能在問題上更清楚一點嗎? – Stultuske

+0

't = null;'只是取消引用變量't',但不會改變它之前引用的TestEntity對象上的任何內容。你應該學習/搜索關於「java參考」 – Joel

+0

你能定義你的結果,以及你的期望嗎? – Nathan

回答

0

當您在list,t中添加t時,list的第一個元素引用同一個對象。

但是,當您編寫t = null時,它會將null分配給t變量。
因此,現在tlist的第一個元素不再指向同一個對象。
因此,打印第一個或第二個將產生不同的結果。

在編寫t.x = 888,tlist的第一個元素時,仍指向同一個對象。
您只更改對象字段的值。
因此,打印第一個或第二個給出完全相同的結果。

0

您沒有將對象設置爲null。您正在將參考設置爲null。

t是對對象的引用。當撥打list.add(t)時,您將在此列表中存儲該參考文件的副本(我們稱之爲t2)。所以你最終與

t -----> theObject 
     ^
      |   
ArrayList [t2] 

兩個引用都指向同一個對象。

現在,當您執行t = null時,您只需更改t指向的內容即可。存儲在列表中的副本不關心這一點。現在只有t指向沒有對象(null)。所以你最終

t--> nothing theObject 
       ^
        |   
     ArrayList [t2] 

所以,打印在列表的第一個元素仍打印由t2,列表內部陣列中的第一參考引用的對象。

相關問題