Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
传递给方法且未更改的Java二维数组_Java_Arrays_2d - Fatal编程技术网

传递给方法且未更改的Java二维数组

传递给方法且未更改的Java二维数组,java,arrays,2d,Java,Arrays,2d,这个关于将2D数组传递给方法的问题在课堂上出现。有人能解释一下为什么在调用doStuff()后原始数组d没有改变吗?我调试了代码,发现该方法正在反转值,但当返回时,原始数组保持不变。我认为将数组传递到方法中并更改该方法中的值会影响原始数组。在这里,情况并非如此,原始数组是不变的。我的第一个想法是原来的字母会颠倒过来。但是没有 初始化数组d并调用doStuff作为 如下: intd[][]={{-1,0,1}, {5,6,7}, {2,3,4} }; 多斯塔夫(d); 公共静态无效doSt

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

  • 初始化数组d并调用doStuff作为 如下:

    intd[][]={{-1,0,1},
    {5,6,7},  
    {2,3,4} };  
    多斯塔夫(d);
    公共静态无效doStuff(int[][]frst)
    {    
    int len=第一个长度;
    整数秒[][]=新整数[len][];
    对于(int j=0;jJava是传递值

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

            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;
            }
    
    }
    
    intd[][]={{-1,0,1},
    {5,6,7},
    {2,3,4} };
    d=doStuff(d);
    公共静态int[]doStuff(int[]frst)
    {
    int len=第一个长度;
    整数秒[][]=新整数[len][];
    对于(intj=0;j这里发生了什么。
    创建了两个数组,初始一个和第二个,在doStuff方法内部创建

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

    • 外部(用于方法):d

    • 内部:第一和第二

    在doStuff方法中,第二个数组实际上是作为初始的反向填充的,这一点没有任何改变


    在doStuff方法的末尾,第一个第二个引用同一个对象,第二个对象,而不是原始对象-因此,您看到的行为

    您已经有了一些很好的答案,但这里有一些代码显示了这两种情况,这两种情况似乎不一致,但确实由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
    

    这是有道理的,但我也看到过其他情况,即只需更改方法中的值(对于数组或ArrayList)在没有返回语句的情况下更改了数组。这是如何一致的?@BrettPenza已编辑以解决您的问题Java是按值传递的,因此您需要返回值并将函数
    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];
                    for(int j=0; j<frst.length;j++)
                        frst[j] = sec[j]
                }
    
    $ 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