2011-03-20 50 views
2

爲什麼沒有這種改變初始對象:Java引用類型的參數

public class Foo 
{ 
Bar item = new Item(5); 

public changeBar(Bar test){ 
    test = new Item(4); 
} 

public run(){ 

    changeBar(item); 

} 
} 

在這種情況下item沒有得到改變。這怎麼可能?我的意思是,你在方法中傳遞參數作爲參數,所以我會說分配一個新的值,意味着初始item也將被改變。

有人可以向我解釋這是如何工作的。

=======================================

然而,我問題是以下幾點:

以下確實工作正確嗎?

public changeBar2(Bar test){ 
test.parameter = "newValue"; 
} 

我看不出有什麼不同。

回答

2
public changeBar(Bar test){ 
    test = new Item(4); 
} 

changeBar(item); 

在這裏,在複製到testitem值。截至目前,兩個item, test都指向相同的對象。在該方法中,test指向一個不影響item的不同位置。你是傳遞價值而不是通過引用。


public changeBar2(Bar test){ 
    test.parameter = "newValue"; 
} 

上述修改,因爲無論是testitem都指代相同的對象傳遞的對象。

因此,test可以完全指向一個新的對象或修改對象之前提到的。兩者都不同並且有效。

+0

好的,謝謝,我明白了。但是,我在問題中增加了第二部分。我想我現在真的明白了,但是你們能否在我的兩個例子之間解釋我的不同? – 2011-03-20 19:04:18

3

考慮一個思想實驗:

changeBar(null); 

請問你的代碼上述變化的null價值?

的回答你的問題是,雖然你Bar對象「引用」傳遞,這是按值傳遞的引用本身不同。在Java中,所有參數都是按值傳遞的,即使它們本身是對其他對象的引用。

+0

謝謝!最後一段對我來說非常有意義! – 2011-03-20 19:03:26

1

參數總是通過傳值。

函數的初始化changeBar()test是對項目的引用,但是隨後您會使用對新創建的項目的引用來覆蓋它。因此,您只能使用不同的引用覆蓋局部變量,但不要更改由對象引用的局部變量。

0

您正在給該方法引用此對象,也就是說,它的地址可以這麼說。所以這個地址存放在一個名爲test的變量中。

然後,您的方法將刪除寫在test變量中的內容,而是寫入它創建的新對象的地址Item。這裏沒有任何東西改變了最初的Item對象,也沒有改變對方法範圍之外的引用。

我想我很喜歡這裏,我會很樂意得到糾正。