Java数组方法(混淆)

时间:2016-01-11 19:07:07

标签: java arrays methods

我对这个方法很困惑。我通常认为你需要归还一些东西。或者在我看来,我会想到需要一个for循环,它将元素从每个元素加5的方法中传回。

但是当数组传递给方法时,数组本身会改变,但为什么呢?

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;
        }
    }

2 个答案:

答案 0 :(得分:0)

在Java中,所有对象都通过引用传递,而数组是对象。这意味着您的change方法接收到在main中创建的相同数组 - 而不是它的副本,即同一个对象。因此,当您修改它时,main方法也会看到更改。

答案 1 :(得分:0)

Java是基元的值传递,并且是其他所有内容(包括数组)的传递引用(值)。

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

这基本上意味着你的函数没有得到数组的副本,它会得到数组本身。

尝试使用int(原始值不会改变,因为它是原始的)。

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

   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;
    }
}