解释v1和v2的val值从5变为6如何更改实例
class Value {
int val;
}
class Test {
static void main(String[] args) {
int i1 = 3;
int i2 = i1;
i2 = 4;
System.out.print("i1==" + i1);// 3
System.out.println(" but i2==" + i2);// 4
Value v1 = new Value();
v1.val = 5;
Value v2 = v1;
v2.val = 6;// how val changes from 5 to 6
System.out.print("v1.val==" + v1.val);// 6
System.out.println(" and v2.val==" + v2.val);// 6
}
}
答案 0 :(得分:2)
当您执行Value v2 = v1
时,您正在为v2
创建参考v1
。您所做的任何更改都将返回到v1
存储在内存中的位置。实际上,您刚刚为1个对象创建了2个名称。
答案 1 :(得分:2)
val发生变化的原因是因为在Java中,"对象"本质上是指向内存中该对象的指针。在您的代码中,为Value定义一个NEW对象(以及一个指向它的v1指针)。然后指定您希望该值为5.当您创建第二个值对象时,您将创建另一个POINTER,并使该指针也指向您的第一个对象。因此,当您更改指针指向的值时,您将更改对象本身。由于两个指针都指向此对象,因此看起来两者都是相同的。
你应该做的是:
Value v1 = new Value();
v1.val = 5;
Value v2 = new Value();
v2.val = v1.val;
v2.val = 6;// how val changes from 5 to 6
这将创建一个指向Value类型的NEW对象的指针,然后将该对象的值设置为其他对象值。这种方式,当你引用它们时,它们保持分离,因为它们指向内存中的不同位置。
以下是图片说明:
左侧显示您正在进行的路径,您将指针转到同一个blob,因此两个引用都会编辑相同的blob。右手显示我的答案,您在其中引用内存中的新blob,然后编辑该新blob。请原谅我的原油画,我不是艺术家。