java array pass by reference does not work?
伙计们,我认为几乎所有的语言,包括Java PASS数组都可以作为参考(可修改的)
但不知何故,它在这里不起作用。测试数组仍然是1,2,3,大小为3
奇怪的是,当我把结果[i]=2改为[1]=2时,它就起作用了。它确实通过了引用
这个代码有什么问题?
最后,我得到了一个=结果(更新了a)。结果是否从堆栈中移除?这就是为什么A仍然可以得到原来的A?
我很困惑。
谢谢
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | class Test { public static void main(String[] args) { int[] testArray = {1,2,3}; equalize(testArray, 6); System.out.println("test Array size :" + testArray.length); for(int i = 0; i < testArray.length; i++) System.out.println(testArray[i]); } public static void equalize(int[] a, int biggerSize) { if(a.length > biggerSize) throw new Error("Array size bigger than biggerSize"); int[] result = new int[biggerSize]; // System.arraycopy(a, 0, result, 0, a.length); // int array default value should be 0 for(int i = 0; i < biggerSize; i++) result[i] = 2; a = result; } } |
数组是按引用传递的,但引用是按值传递的。也就是说,可以更改
Java是按值传递的。这就是代码不起作用的原因。一个好的做法是将
从函数返回参数"a",并在主函数中分配给testerray。当通过引用传递对象时,将复制引用并将其提供给函数。因此对象现在由2个引用引用引用。通过第二个引用对对象所做的任何更改都将反映在第一个引用中,因为这两个引用引用的对象相同。但是,当您更改引用(不是通过引用来更改对象)时,情况就不同了。您已更改第二个引用以指向另一个对象(int[]result)。因此,通过第二个引用所做的任何更改都只会更改"result"对象。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | class Test { public static void main(String[] args) { int[] testArray = {1,2,3}; testArray = equalize(testArray, 6); System.out.println("test Array size :" + testArray.length); for(int i = 0; i < testArray.length; i++) System.out.println(testArray[i]); } public static int[] equalize(int[] a, int biggerSize) { if(a.length > biggerSize) throw new Error("Array size bigger than biggerSize"); int[] result = new int[biggerSize]; // System.arraycopy(a, 0, result, 0, a.length); // int array default value should be 0 for(int i = 0; i < biggerSize; i++) result[i] = 2; a = result; return a; } } |
当您执行a=result;object a dosnt时,再指向testerray,bc您将更改其对result地址的引用。这就是为什么它不再影响测试阵列的原因。事实上,你所做的就是你在做一个和结果一样的反应,所以无论你在结果中做了什么改变,结果也会改变。
希望这有帮助…
可以修改
Java总是通过值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | public class test { public static void main(String[] args){ int[] a = {15, 2, -3}; printArray(a); changeArray(a); printArray(a); } private static void changeArray(int[] a){ for(int i = 0; i < a.length; i++){ a[i]++; } } private static void printArray(int[] a){ for(int i = 0; i < a.length; i++){ System.out.print(a[i] +""); } System.out.println(); } } |
-----输出-----
15 2—3
16 3—2
数组是Java中的对象。如果已使用大小(实际长度)初始化数组,则无法修改它。您可以创建一个大小不同的新数组(正如您当前在函数中所做的那样),并将旧数组中的所有值复制到新数组中。在您的案例中,您有2个对象和3个引用。如果要在调用函数中访问更大的数组,请使函数返回更大数组的引用。