2016-01-11 78 views
0

我很困惑這個方法。我通常認爲你需要回報一些東西。或者在我的腦海裏,我會想到需要一個for循環,以便將方法中的元素傳回給每個元素。Java數組方法(混亂)

但是,當數組傳遞給方法時,數組本身會改變,但爲什麼?

public static void main(String[] args) { 
     int ray[]={3,4,5,6,7}; 
     change(ray); 

     for(int y: ray){ 
      System.out.println(y); 
     } 
    } 
    public static void change(int x[]){ 
     for(int counter = 0; counter < x.length;counter++){ 
      x[counter]+=5; 
     } 
    } 

回答

0

在Java中,所有對象都通過引用傳遞,和數組是對象。這意味着您的change方法會接收到在main中創建的相同陣列 - 不是它的副本,也是同一個對象。所以當你修改它的時候,main方法也會看到這個改變。

+0

[Java是*始終*傳遞按值(http://stackoverflow.com/questions/40480/is-java-通過引用或按值傳遞) –

0

Java對基元傳遞值,對其他所有元素(包括數組)傳遞引用(值)。

http://javadude.com/articles/passbyvalue.htm

什麼,基本上意味着你的功能沒有得到陣列的副本,它得到了數組本身。

嘗試一個int(原始值不會改變,因爲它是一個原語)。

public static void main(String [] args){int {ray} = {3,4,5,6,7}; change(ray);

for(int y: ray){ 
     System.out.println(y); 
    } 


} 

public static void change(int i){ 
     i = i + 10; 
} 



public static void change(int x[]){ 
    for(int counter = 0; counter < x.length;counter++){ 
     x[counter]+=5; 
    } 
} 

有人會說,Java的總是按值傳遞,但那是因爲定義一個糟糕的選擇,當涉及到的引用。

對象在概念上是按引用傳遞的,而基元是按值傳遞的。你可以稱它爲你喜歡的,但它看起來像一隻鴨子,像鴨子一樣走路,像鴨子一樣嘎嘎叫。

試試這個,你會得到一個更好的主意:

/** 
* Main 
* 
*/ 
public class Main { 

    static class IntegerClass { 
     int internal; 

     public IntegerClass(int i) { 
      internal = i; 
     } 

     public void setInternal(int i) { 
      internal = i; 
     } 

     public int getInternal() { 
      return internal; 
     } 
    } 

    public static void main(String[] a) { 
     int x = 10; 
     changeInteger(x); 
     System.err.println(x); 

     IntegerClass ic = new IntegerClass(10); 
     changeIntegerClass(ic); 
     System.err.println(ic.getInternal()); 
    } 

    public static void changeIntegerClass(IntegerClass ic) { 
     ic.setInternal(500); 
    } 

    public static void changeInteger(Integer i) { 
     i = 500; 
    } 
} 
+1

[Java總是*通過值傳遞](http://stackoverflow.com/questions/40480/is-java-pass-by-reference-或者按值傳遞) –

+0

實際上,java並不是通過對象的引用。它是通過價值。唯一改變的是,在對象中,引用通過值傳遞,所以你不能修改對象本身,但是你可以修改對象的每個屬性。因此,在數組的情況下,您將無法更改數組本身,您可以更改存儲在數組中的值。在你的例子中,這意味着你不能用一個新數組重新賦值'x',你只能改變它的內容。 – BackSlash

+0

看到我的編輯,說java永遠傳遞價值就像說飛機不能飛,但不告訴任何人,飛你真的是游泳。 – mikeb