2010-07-31 71 views
0

引用考慮下面的繼承示例:質疑在Java中

​​3210

我的問題是在註釋中。這是不同的,從某種意義上說,使用new運算符爲對象b2b2=b1創建新空間只會將b1的數據複製到b2中。因此,對一個對象所做的任何更改都不會影響其他對象。在主內聯代碼中,B b2 = b1將指向b2到分配給b1的空間。因此,這裏的任何更改都會影響對象數據。

我的查詢是,會用new運算符對對象操作有什麼區別?

+0

沒有複製發生。 – whiskeysierra 2010-07-31 10:03:41

回答

9
B b1 = new B(); 
B b2 = b1; 

上面的代碼創建B類型的只有一個對象。 b1和b2是指向同一個對象的引用。他們是別名到同一個對象。

B b1 = new B(); //1 
B b2 = new B(); //2 
b2 = b1;  //3 

在該代碼中,在線路1和2。然而創建B類型的兩個對象,第3行,B2引用相同的對象之後爲B1又都是從而再次別名。現在由b2引用的對象現在變爲符合垃圾回收的條件。

因此,在這兩種情況下,b1和b2指向相同的對象,並且通過這兩個引用都可以看到對該對象所做的任何更改。請記住,b1和b2不是對象本身,而只是對象的引用。 b1 = b2不會將任何值從一個對象複製到另一個對象,它只是重新指定引用。

2

這使得一個A對象和一個B對象。有兩個對B對象的引用。

A a1 = new A(); 
B b1 = new B(); 
B b2 = b1; 

這使得一個A對象和兩個B對象。有兩個對第一個B對象的引用。第二個B對象不再有對它的引用,並且可用於垃圾收集。

A a1 = new A(); 
B b1 = new B(); 
B b2 = new B(); 
B b2 = b1; 

B b2 = b1;在此步驟中沒有任何對象數據被複制。 b2和b1都將指向同一個對象。所以你用它來設置或獲取數據並沒有什麼不同。

B b2 = new B(); 
B b2 = b1; 
b2.setValue("Foo"); 
b1.getValue(); // would return "Foo" 
2
B b1 = new B() 

創建一個新對象和參考分配給它,B1。

B b2 = b1 

創建一個新的引用並將其設置爲等於b1,這是一個引用。

沒有「將b1的數據複製到b2中」。現在兩個參考指向相同的基礎對象。