Java二维数组传递给方法而没有更改

时间:2015-02-28 15:14:31

标签: java arrays 2d

关于传递给方法的2D数组的问题出现在课堂上。有人可以解释为什么在调用doStuff()之后原始数组d没有改变吗?我调试了代码并看到该方法正在反转值,但是当返回时,原始数组保持不变。我认为将数组传递给方法,并且更改该方法中的值会影响原始数组。这不是这种情况,原始数组不变。我的第一个想法是,orignal将被颠倒。但没有。

  1. 初始化数组d并调用doStuff as 如下:

        int d[][] = { {-1,0,1},  
                      {5,6,7},  
                      {2,3,4} };  
        doStuff(d);    
    
    
        public static void doStuff (int [][] frst)    
        {    
            int len = frst.length;    
            int sec[][] = new int[len] [];    
            for (int j=0; j<len; j++)  
            {        
                sec[j] = frst[len –j -1];     
            }       
            frst = sec;      
        }    
    

3 个答案:

答案 0 :(得分:0)

Java是按值传递的

返回您的值并将其设置为您的值。

        int d[][] = { {-1,0,1},
                      {5,6,7},
                      {2,3,4} };
        d = doStuff(d);


        public static int[][] doStuff (int [][] frst)
        {
            int len = frst.length;
            int sec[][] = new int[len] [];
            for(int j=0; j<len; j++)
                sec[j] = frst[len-j-1];
            return sec;
        }

}

您也可以直接设置传递数组的值(数组变量是对数组的引用,因此编辑传递的数组引用的元素将起作用:

public static void doStuff (int [][] frst)
            {
                int len = frst.length;
                int sec[][] = new int[len] [];
                for(int j=0; j<len; j++)
                    sec[j] = frst[len-j-1];
                for(int j=0; j<frst.length;j++)
                    frst[j] = sec[j]
            }

答案 1 :(得分:0)

这里发生了什么。 在doStuff方法中创建了2个数组,初始第二

代码中的数组有3个引用(变量):

  • 外部(方法):d

  • 内部:第一和第二

在doStuff方法中,第二数组确实填充为初始的反向,但完全没有改变。

在doStuff方法结束时,第一个 sec 引用相同的对象,第二个,而不是原始对象 - 因此你看到的行为

答案 2 :(得分:0)

你已经有了一些很好的答案,但是这里有一些代码显示了两个可能看起来不一致的情况,但确实是因为java是按值传递这一事实。棘手的一点是,在数组的情况下,它是对数组的引用,它是通过值传递的,而不是数组本身。

因此,被调用函数接收与调用函数相同的相同数组的引用的副本,并且可以修改该数组中的元素。但是当被调用的函数将引用本身修改为引用不同的数组时,它正在修改一个副本,这对调用者没有影响 - 也就是说,在调用者环境中该变量仍在引用到原始阵列。

使用方框和箭头更容易解释:-),但希望下面的代码和输出会有所帮助:

$ cat PBV.java
class PBV
{
    private static void modfiyArrayElement(int[] intArray) {
        // intArray is referring to the same array as in main
        intArray[0] = 17;
    }

    public static void main(String[] args) {
        int[] a = new int[]{ 1, 2, 3 };
        System.out.println(a[0]);

        modifyArrayElement(a);
        System.out.println(a[0]);
    }
}

$ java PBV
1
17

$ cat PBV2.java
class PBV2
{
    private static void modfiyArrayReference(int[] intArray) {
        System.out.println("\nIn modifyArrayReference:");
        System.out.println("intArray[0] is " + intArray[0]);
        System.out.println("ref value of intArray is: " + intArray);

        intArray = new int[] { 100, 200, 300 };            

        // intArray is no longer referring to the same array as in main!
        // at this point munging with intArray won't have an effect in main

        System.out.println("\nintArray[0] is now " + intArray[0]);
        System.out.println("ref value of intArray is: " + intArray +"\n");
    }

    public static void main(String[] args) {
        System.out.println("in main:");
        int[] a = new int[]{ 1, 2, 3 };
        System.out.println("a[0] is " + a[0]);
        System.out.println("ref value of a is: " + a);

        modfiyArrayReference(a);

        System.out.println("back in main:");
        System.out.println("a[0] is still " + a[0]);
        System.out.println("ref value of a is still: " + a);
    }
}

$ java PBV2
in main:
a[0] is 1
ref value of a is: [I@55a6c368

In modifyArrayReference:
intArray[0] is 1
ref value of intArray is: [I@55a6c368

intArray[0] is now 100
ref value of intArray is: [I@37670cc6

back in main:
a[0] is still 1
ref value of a is still: [I@55a6c368