我这个代码,输出是6
,但我认为它应该是4
为什么输出是6
?
答案 0 :(得分:1)
没有。你的假设是错误的。
您正在将数组传递给修改那里的方法,因此指向相同引用和值的数组已被更改。
如果a
是一个原语,那么它没有引用,并且传递给方法的复制值和原始值保持不变。
System.out.println(a+array[0]);
// a is still 1 and array madofied in method which is 5. so 1+5
简而言之:
将基元传递给方法时,更改不会生效 原始变量。
将对象(此处为数组)传递给方法时,更改效果
到原始对象,因为他们指向相同的参考。
答案 1 :(得分:1)
这是使用调试器回答这个问题的地方,但简而言之,你有
int a = 1;
// inside f()
// a = 4 doesn't change the value of a in main()
array[0] = 5;
所以a + array[0]
是1 + 5
或6
答案 2 :(得分:1)
这是因为int数组不是Java中的本机类型,而是Object。
因此,当您调用方法f()时,该方法接收变量a的副本和指向int数组的指针的副本。更改数组内部的值时,您正在修改其接收的指针所引用的对象。但是当你改变a的值时,你只需要修改一个。
的副本答案 3 :(得分:0)
a将作为值的副本传递,而数组将作为引用的副本传递。因此,当您修改可以使用该引用访问的内容时,您可以修改实际的数组。而对于a,您只是修改副本的值,而不会修改原始的。
答案 4 :(得分:0)
在这种情况下,f()中的 a 是通过方法调用传递的值的本地副本。在f()到 a 中执行某些操作不会更改main()中的 a 。另一方面,当您将 array 传递给f()时,您将传递对名为 array 的数组对象的引用。因此,两个数组名称都指向相同的底层对象,并且更改该对象将更改每个数组引用所指向的内容。
答案 5 :(得分:0)
Java中的数组也是按值传递的对象,不通过引用传递。
就像任何其他类对象一样,当一个数组传递给另一个方法时,该方法仍然可以改变数组本身的内容。但是,传递给该方法的是参考地址的 副本,该副本指向数组对象 。
请看一下上面的示例 - 相同的原则适用于数组,因为它们是Java中的对象,并且是按值传递的。