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是一个原语。因

在我的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
是一个原语。因此
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