Java数组-来自测试
在我的Java测试中,下一个问题是: 还有下一种方法:Java数组-来自测试,java,Java,在我的Java测试中,下一个问题是: 还有下一种方法: public void changer(int[] x, int y) { x[y] = x[y] +3; y = y * 2; } 我们有一个名为a的数组,其值为: 如果b=3 下一次调用后a和b的值是什么: changer(a,b); 我的回答是: b=6 我在BlueJ上测试了它,得到了相同的答案,但测试人员写道:错 你怎么说?从称为changer的范围来看,b没有变化,因为Java是按值传递的,b是一个原语。因
public void changer(int[] x, int y) {
x[y] = x[y] +3;
y = y * 2;
}
我们有一个名为a
的数组,其值为:
如果b=3
下一次调用后a和b的值是什么:
changer(a,b);
我的回答是:
b=6
我在BlueJ上测试了它,得到了相同的答案,但测试人员写道:错
你怎么说?从称为
changer
的范围来看,b
没有变化,因为Java是按值传递的,b
是一个原语。因此b
在方法调用之后仍然是3。changer
中的语句:
y=y*2
更改数组中的值后,实际上什么都不做
你对
a
的回答是正确的。b
仍然应该是3。传递一个整数“按值”传递它,因此它本质上是进入changer
方法的b
的副本。关于数组值,你是对的,但是关于b值,你是错的
当您调用一个方法时,java会按值传递所有内容,这意味着更改y只会在本地更改值,而更改不会反映在b上
但是,在传递数组和对象时,会传递一个表示指向该数组的指针的值。这意味着
x=newint[8]
根本不会改变a,因为y的变化不会反映到a。但是,更改数组成员或对象属性的工作方式与预期相同,因为a和x都指向内存中的同一数组。B不会更改,因为它是作为方法参数传递的原语。在这种情况下,将生成一个本地副本,在这种情况下,该副本将乘以2。但是,原始b不会受到此影响。数组被更改是因为数组(甚至原语数组)是Java中的对象,所以对数组的引用被传递到方法中,对数组的更改(通过引用)反映在一个且唯一的数组中-在这种情况下不进行复制。您混淆了值和引用,把y值当作参考来考虑
第一行
x[y]=x[y]+3代码>
设置数组的yth元素的值。下一行y=y*2代码>
更改参数的值,但不更改数组设置。ohh。。。我很匆忙。。。a呢?让我担心BlueJ如果它说6是正确的。。。(我从未使用过它,所以我不知道你是否正确地使用了它。)你确定你测试过这个并得到了b=6?!
changer(a,b);
a = 2,4,0,4,-6,3,8,7,5