2011-12-16 156 views
1

這裏是Java的新手,請大家幫忙。在java中如何傳遞參數?爲什麼我無法在被調用的方法內更改調用方法中的參數值?在Java中傳遞參數

代碼

public class PassTest { 
    public static void changeInt(int value) 
    { 
     value=55; 
    } 

    int val; 
    val=11; 
    changeInt(val); 
    System.out.println("Int value is:" + val);// calling modifier changeInt 
} 

輸出

Int value is: 11

爲什麼它不是55 ..?

+1

此代碼甚至不會編譯 – stacker 2011-12-16 21:33:52

+0

只是一個片段..不完整..需要問這裏的問題.. – sum2000 2011-12-16 21:35:44

+0

@stacker我不認爲代碼編譯需要問一個問題 – Andy 2011-12-16 21:52:33

回答

1

的Java通過根據值,這意味着你把作爲參數對象的值傳遞,而不是對象本身,因此

val=11; 
changeInt(val); 

不準確同樣的事情,

int val=11; 
int val2=val 
changeInt(val2); 

int是一種原始的,原始數據沒有「包裝」的值,你可以嘗試使用Integer類,或者使自己的類存儲一個整數,然後更改THA t類整數值。如果設置正確,對象的實例有時會傳遞ByReference。這裏有一個例子

MyStringClass.java

public class MyStringClass{ 

    private String string = null; 

    public MyStringClass(String s){ 
     string = s; 
    } 
    public String getValue(){ 
     return string; 
    } 
    public void setValue(String s){ 
     string = s; 
    } 
} 

,然後運作

public static void addTo(String s){ 
    s += " world"; 
} 
public static void addTo(MyStringClass s){ 
    s.setValue(s.getValue() + " world"); 
} 
public static void main(String[] args){ 
    String s = "hello"; 
    MyStringClass s1 = new MyStringClass("hello"); 
    addTo(s); 
    addTo(s1); 
    System.out.println(s);//hello 
    System.out.println(s1);//hello world 
} 

我會想知道爲什麼你需要改變的價值,而不是僅僅恢復了嗎?是不是更容易?

5

Java按值傳遞,而不是引用。在您的方法中,value包含val的值的副本。修改副本不會更改原始變量。

如果您希望您的更改對調用者可見,則可以傳遞包含在對象中的int。例如,您可以使用類org.apache.commons.lang.mutable.MutableInt

1

爪哇經過數值,它使一個拷貝這是完全與原始變量的參考,這意味着它不能訪問改變原有int DIS-相關聯。原語以及對象引用也是如此。

你可以使用AtomicInteger或類似的東西來實現你想要做的事情。

1

原始變量按照您的建議通過值而不是引用傳遞。

1

正如其他人所說,默認情況下,Java通過值傳遞,這意味着您只是獲得函數中的副本。您可以傳遞參考,它將傳遞一個指向該對象的指針並允許您直接編輯,但這不被視爲最佳實踐。我建議做這樣的:

public class PassTest { 
public int changeInt(int value) 
{ 
    value = 55; 
    return value; 
} 
int val; 

val=11; 
val = changeInt(val); 
System.out.println("Int value is:" + val);// calling modifier changeInt 
0

這裏是傳遞一個參數例:

class Test { 
int a,b; 

public Test(int j, int k) { 
    a=j; 
    b=k; 
} 
void change(Test ko){ 
    ko.a=ko.b+ko.a; 
    ko.a=ko.b-12; 


} 

} 


class sdf { 
public static void main(String[] args){ 
Test op=new Test(12,32); 
System.out.println(op.a+" "+op.b); 

op.change(op); 

System.out.println(op.a+" "+op.b); 


} 

}

看看這段代碼::

你可以看到,在這種情況下,內化作用( )已影響傳遞給方法的對象

將對象引用傳遞給方法時,引用本身將傳遞給按值調用的方法。因此,該參數會收到副本。因此,對參數的更改(例如使其指向不同的對象)不會影響用作參數的參考。但是,由於參數和參數都指向同一個對象,因此通過參數進行更改將影響參數所反映的對象。