【问题标题】:Two references to same object [closed]对同一对象的两次引用[关闭]
【发布时间】:2014-08-10 10:54:17
【问题描述】:

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

【问题讨论】:

标签: java


【解决方案1】:

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。请原谅我粗糙的绘画,我不是艺术家。

【讨论】:

  • 你能用图表解释一下吗
  • 图片说明的链接在这里:imgur.com/eKJAc71 左侧显示了您所走的路径,您将指针指向同一个 blob,因此两个引用编辑同一个 blob。右手显示我的答案,您在其中引用内存中的新 blob,然后编辑该新 blob。请原谅我粗糙的绘画,我不是艺术家。我已经更新了我的答案以包括这个。让我知道这是否可以解决问题,或者我是否可以帮助解决问题
  • 它不像 v2 是对 v1 的引用 & v1 是指向对象
  • v1 和 v2 都是参考。 new Value() 是在内存中创建对象的部分。假设这个对象在内存中的地址 0000000A。因此,当您说Value v1 = new Value() 时,您是在说 v1 引用了 0000000A 处的任何内容。然后创建另一个引用,并说v2 = v1,但 v1 是对内存中对象的引用。所以现在v2也指向0000000A。所以你有 v1->0000000A 和 v2->0000000A。当你说v2.val = 6时,它是在说Take what is at the location referenced by v2 (0000000A) and set the value of it to 6.
  • 你想用Value v2 = new Value()在内存中创建一个新对象,然后你可以用v2引用这个新对象。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2018-09-03
    • 2016-07-01
    • 1970-01-01
    • 2010-09-19
    • 1970-01-01
    • 2013-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多