2011-09-08 63 views
3

在我的Java测试是下一个问题:Java数组 - 从测试

有下一个方法:

public void changer(int[] x, int y) { 

    x[y] = x[y] +3; 
    y = y * 2; 
} 

我们已经阵列命名a,与值:

2,4,0,1,-6,3,8,7,5 

如果B = 3

将是什么a和b值后,下一个电话:

changer(a,b); 

我的回答是: B = 6

a = 2,4,0,4,-6,3,8,7,5 

我上测试它BlueJ得到了同样的答案,但测试人员写道:错了!

你说什么?

+0

让我担心BlueJ如果说6是正确的...(我从来没有用过它,所以我不知道你是否正确使用它。) – Poodlehat

+0

你确定你测试了这个并得到b = 6吗? ! – Daniel

回答

7

你是对的数组值,但错误的b值。

当你调用一个方法时,java按值传递所有的东西,这意味着改变y只会在本地改变这个值,并且这个改变不会反映在b上。

但是,当传递数组和对象时,会传递一个表示指向数组的指针的值。这意味着x = new int[8]完全不会改变,因为它发生在y上,所以这个改变不会反映到a中。但是,更改数组成员或对象属性的工作方式与您的预期相同,导致a和x都指向内存中的相同数组。

+0

很好的解释。确切地说,它为什么/不起作用。 – Nicholas

+0

感谢您的明确回答。 – Oshrib

4

changer被称为b的范围不会改变,因为Java是通过值并且b是原语。所以b在方法调用后仍然是3。在changer声明:数组中修改完毕

y = y * 2

有效地什么也不做。

您的回答为a是正确的。

2

b应该仍然是3.传递一个整数将“按值”传递它,所以它本质上是b的副本,它进入changer方法。

+0

哦......我很匆忙......怎么样? – Oshrib

2

B不会被更改,因为它是作为方法参数传递的基元。在这种情况下,制作一个本地副本,在这种情况下,乘以2。原来的b不会受到这个影响。因为数组(即使是基元数组)也是Java中的对象,所以对数组的引用被传递到方法中,并且对数组的更改(通过引用)被反映到唯一的数组中 - 没有副本是在这种情况下制作。

2

你在混淆值和引用,并且认为y值就像是引用。第一行 x[y] = x[y] +3; 设置数组的第y个元素的值以下行y = y * 2; 更改参数的值,但不会更改阵列设置。