2013-02-04 197 views
0

我一直在閱讀很多關於這個的文章,所有的回答都傾向於反駁它之前的答案,他們都似乎是高排名的人,所以我很困惑,只是想知道這是否工作:java:傳遞一個對象

public class Object{  

    private int someNumber = 5; 
    public void setSomeNumber(int newNumber){someNumber = newNumber;} 
} 

public class Main { 

    Object myObject = new Object(); 

public static void main(String[] args){ 

    changeNumber(myObject);  
} 

void changeNumber(Object obj) 
{ 
    obj.setSomeNumber(10); 
} 
} 

這會改變myObject.someNumber爲10?

我的理解是,obj指向與myObject相同的內存位置,因此調用其使用obj的方法與使用myObject調用它相同,因爲obj不僅僅是myObject的副本?

我認爲這是很清楚,我,直到我開始閱讀主題在這裏它笑

編輯:謝謝你糾正碼,我只是寫出來在這裏作爲一個例子,沒有看到錯誤

謝謝你們。另外我被人們稱爲按價值傳遞困惑,所以我不能確定它是否通過了記憶中的地址,或者不是,因爲對我來說這是通過一個參考,所以它變得不清楚。

+1

是的,你是對的。什麼令你困惑? –

+0

你可以糾正你的錯誤,並嘗試運行它。 ('myObject'需要使用'main'或者'static','changeNumber'需要''static'''對象'對於一個類來說是個非常糟糕的名字,除了jlo以外,用'System.err。 println(myObject.getSomeNumber());'。) –

+0

所有的「java是通過值而不是通過引用」在很多帖子中來回讓我發誓。 –

回答

2

你是對的。 changeNumber()會改變傳遞給它的對象的someNumber變量。您正在傳遞對象本身的引用,而不是副本。

0

雖然這段代碼不會編譯(你不能使用Object,也不能從靜態方法非靜態數據字段訪問),但是我有你的問題。

基本上,你是對的,這就是爲什麼:

在Java中,當您將參數傳遞到方法,他們通過引用傳遞,而是引用本身是按值傳遞。 這是爲了我相信的優化原因而完成的。 所以實際上,另一個引用是指向內存中同一個對象的產品。 如果你自己看看這些引用,它們是不同的,但它們都指向同一個對象。所以當你在'changeNumber'方法中改變對象的內部狀態時,它會轉到引用'obj'引用的對象並改變它。

唯一的例外是基元 - 它們不是通過引用傳遞的,而是它們按照您可能已經在其他語言中學習過的值傳遞。

一旦你知道究竟去,當你調用的方法和參數傳遞給它這個上會停止迷惑你:)

希望這有助於

0

你是對的,Java並通過操縱參考對象,所有對象變量都是引用,並且不通過引用傳遞方法參數,而是通過值傳遞。

看看this article,看看提供的示例中的對象和方法參數之間的行爲差​​異。