两个对同一对象的引用

时间:2014-06-19 19:04:44

标签: java

解释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
    }
}

2 个答案:

答案 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。请原谅我的原油画,我不是艺术家。