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