2012-08-16 31 views
0

這裏是我的代碼更改方法中對象的值會在全局範圍內更改它的值嗎?

Class A

public class A { 
    private int a; 

    public int getA() { 
     return a; 
    } 

    public void setA(int a) { 
     this.a = a; 
    } 
} 

Class Change

public class Change { 
    public void changeSomething(A a){ 
     a.setA(13); 
    } 
} 

Class Learn

public class Learn { 
    public static void main(String[] args) { 
     A a = new A(); 
     Change change = new Change(); 
     change.changeSomething(a); 
     System.out.println(a.getA()); 
    } 
} 

輸出爲13.現在,當我傳遞一個對象到changeSomething方法,在ternally對象A的價值已被改變,但爲什麼我看到這種功能以外的功能?

這不等於在C中傳遞值,除非您返回該變量/對象,否則不會獲取更新後的值。

即不要我需要做a=changeSomething(a);並將此方法的返回類型設置爲A?

感謝

+0

還有一個類似的問題就像那http://stackoverflow.com/questions/40480/is-java-pass-by-reference – swemon 2012-08-16 09:27:59

回答

2

你傳遞一個參考原來的對象周圍。當你寫一個方法

void someMethod(A param) { ... } 

param參考原來的對象。原始對象不被複制。因此,當您更改此對象時,無論在何處觀察對象,都可以看到更改。

當你寫:

private A a = new A(); 

它認識到變量是參考反對A類型,而不是一個實際的對象類型A很重要。這是一個很好的區別,授予。

上述行爲可能會在您的系統中引起意外的影響,並且它是不變性的參數,特別是在可以從多個線程觸發更改的線程環境中。

1

簡稱:所以,如果你是指相同的情況下,你將得到相同的值

changeSomething()將更新對象值回

位長的解釋:

//an Object of A created and its reference is set to a 
A a = new A(); 
//instance of Change is created and its reference is set to change 
Change change = new Change(); 
//it passes reference's (a) 's value to the changeSomething method 
//which invokes `setA()` on instance referred by a (which is the same instance that waas crated in line 1 

change.changeSomething(a); 

//so you will get the changed value here 
System.out.println(a.getA()); 
1

那麼你提供的代碼工作ks直接在A的實例上。無論您是否返回,此實例都會更改。它仍然是你的對象的同一個實例。而這個實例變量反映了新的價值。

-3

這是因爲您傳遞對象,並且Java中的對象始終通過引用傳遞。只有原始(int,double,char,long ...)按值傳遞。

在C則可能是:

public void changeSomething(A& a){ 
a.setA(13); 
} 
+1

對象沒有被傳遞,只有參考值被傳遞 – 2012-08-16 08:54:03

+3

我會爭論(和*有*),一切都按值傳遞,包括對象引用 – 2012-08-16 08:57:52

+2

C代碼示例對我來說看起來不像C。 – maba 2012-08-16 09:02:04