Java 将数组赋值给新变量,更改原始变量会更改新变量
第一个System.out打印2,它应该打印,但第二个打印65。我已经用这种语言编程一年多了,据我所知,这是不应该发生的!有什么帮助吗Java 将数组赋值给新变量,更改原始变量会更改新变量,java,arrays,Java,Arrays,第一个System.out打印2,它应该打印,但第二个打印65。我已经用这种语言编程一年多了,据我所知,这是不应该发生的!有什么帮助吗 int[] test = {0,1,2,3,4,5}; int[] before = test; System.out.println(before[2]); test[2] = 65; System.out.println(before[2]); 上面的代码在两行上都打印9。当您执行before=test时,之前只是对测试数组
int[] test = {0,1,2,3,4,5};
int[] before = test;
System.out.println(before[2]);
test[2] = 65;
System.out.println(before[2]);
上面的代码在两行上都打印9。当您执行
before=test时代码>,之前只是对测试
数组的引用,没有新数组已创建并分配给测试
。因此,当您在[i]
之前查看的值时,您基本上会查看测试[i]
的值,反之亦然before
只是test
的别名。这就是为什么在第二次印刷中你得到65
查看《Java思考》一书中的这一点,它肯定会对您有所帮助。为什么您不希望发生这种情况。您只需将两个变量赋值给同一个数组,然后将该数组的索引#2赋值为65,因此,下次打印索引#2时应该得到65
参见中的示例这是正常行为。如果要复制数组,则需要复制它
int first = 9;
int second = first;
System.out.println(second);
first = 10;
System.out.println(second);
通过对于int,您是正确的,它们彼此不引用。但是,当您使用数组时,它们被视为对象,因此当您执行before=test
时,它们在内存中指向同一个对象。在这两种情况下,这都按预期工作。您正在为变量分配值,而变量正在打印分配给它们的值。我希望您不要混淆Java的C风格引用(int*)。我不懂C,事实上我只使用Java。谢天谢地,我在一个悠闲的项目中遇到了这个问题,而不是什么重要的事情。
class ArrayCopyDemo {
public static void main(String[] args) {
char[] copyFrom = { 'd', 'e', 'c', 'a', 'f', 'f', 'e',
'i', 'n', 'a', 't', 'e', 'd' };
char[] copyTo = new char[7];
System.arraycopy(copyFrom, 2, copyTo, 0, 7);
System.out.println(new String(copyTo));
}
}