Java 对同一对象的两个引用

Java 对同一对象的两个引用,java,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==" +

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

当您确定值v2=v1时,您正在创建对v1的引用v2。您所做的任何更改都将返回到v1存储在内存中的位置。实际上,您刚刚为一个对象创建了两个名称。

val发生更改的原因是,在Java中,对象本质上是指向内存中该对象的指针。在代码中,您定义了一个新对象和一个名为v1的指针,该指针指向该对象以获取值。然后指定希望值为5。当您创建第二个值对象时,您将创建另一个指针,并且该指针也指向您的第一个对象。因此,当您更改指针指向的值时,您将更改对象本身。因为两个指针都指向这个对象,所以看起来它们是相同的

你应该做的是:

    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
这将创建一个指向值类型的新对象的指针,然后将该对象的值设置为“其他对象”值。这样,当您引用它们时,它们会保持分离,因为它们指向内存中的不同点

以下是图像说明:


左侧显示了要采用的路径,在该路径中,可以使指针指向同一个blob,因此两个引用编辑同一个blob。右手边显示了我的答案,在这里您引用内存中的一个新blob,然后编辑该新blob。请原谅我粗制滥造的绘画,我不是艺术家。

它因为你的改变而改变。这里很好地解释了这一点:你的标题就是答案。你能用图表解释一下吗?图片的链接解释是:左边显示了你正在走的路,你在那里把指针指向同一个斑点,因此,两个引用编辑相同的blob。右手边显示了我的答案,在这里您引用内存中的一个新blob,然后编辑该新blob。请原谅我的素描,我不是艺术家。我已经更新了我的答案,包括这一点。让我知道这是否可以澄清问题,或者我是否可以帮助澄清问题。它不像v2是对v1的引用&v1指向objectv1,v2都是引用。新值是在内存中生成对象的部分。假设此对象位于内存中的地址0000000A。所以,当你说Value v1=新值时,你是说v1引用了0000000A的值。然后创建另一个引用,假设v2=v1,但v1是对内存中对象的引用。所以现在v2也指向0000000A。所以你有v1->0000000A和v2->0000000A。当你说v2.val=6时,就是说取v20000000a引用的位置上的内容,并将其值设置为6。如果你想在内存中创建一个值为v2=new的新对象,那么你可以用v2引用这个新对象。