【问题标题】:Java - Confused with object assignmentJava - 对对象分配感到困惑
【发布时间】:2016-03-04 04:57:26
【问题描述】:

the program

最近几天我一直在关注 Lynda.com java 教程,我对这一部分特别是涉及该行感到非常困惑:

p1 = new Property(230000, "Estate", 2.0, 2, 3)

我现在已经两次将 p1 添加到 ArrayList mls,但是当我使 Property p1 对象等于 Property 类的新对象时,这里到底发生了什么?

我是在更改 p1 的初始值还是从“对象 p​​1”创建一个新对象?

【问题讨论】:

  • 请勿张贴图片链接以获取代码。在您的帖子中包含代码(使用编辑功能)。确保将代码缩进 4 个空格或突出显示它,然后单击编辑器中的 {} 按钮。

标签: java oop object


【解决方案1】:

Java 中的对象变量始终是引用。

Property p1 = new Property(230000, "Estate", 2.0, 2, 3)

这在堆上分配了一个新的 Property 对象并将 p1 设置为对它的引用。

p1 = some_other_property;

这使得 p1 现在成为对变量 some_other_property 引用的同一属性的引用。我们复制了参考。

someFunction(p1)

这将引用 p1 复制到 someFunction 的参数中。请注意,对引用的这种操作实际上并没有改变 Property 对象,我们只是对它的引用进行了处理。

这也意味着你可以有多个指向同一个底层对象的引用。如果您将 p1 添加到 ArrayList 两次,然后执行改变对象的操作,则 ArrayList 中的两个条目都将反映更改(因为它们都指的是同一件事)

这个问题提供了一些相关且有趣的细节:

Is Java "pass-by-reference" or "pass-by-value"?

【讨论】:

    【解决方案2】:

    您正在创建Property 类的新实例并设置变量p1 来引用它。

    在您的示例代码中,变量 p1 被重复使用。首先它指向第一个创建的对象,然后该引用存储在 ArrayList 中,p1 获得一个新值(对第二个对象的引用)。然后第二个对象引用也存储在 ArrayList 中

    【讨论】:

    • 那么一开始创建的对象p1与创建Property类的新实例的变量p1不同?
    • 是的。当您使用 new 运算符时,您正在堆上创建一个新对象。请记住,您的对象变量实际上是引用:赋值复制引用。新对象的唯一来源是new 运算符。因此,在您的程序中,p1 是指向第 15 行上的“Land”属性的引用,但随后被重新分配以指向第 17 行上闪亮的新“Estate”属性。这两个基础 Property 对象仍然存在点,因为 ArrayList 将持有对它们的引用并防止它们被垃圾收集。(没有引用它的东西会被删除)
    【解决方案3】:

    当您执行p1 = new Property(230000, "Estate", 2.0, 2, 3) 时,会在内存中创建一个新的Property 对象,并在p1 变量中设置它的引用。

    假设指针位置是 100。 所以当你做arrayList.add(p1); 100 is added to the list.

    现在,当您将 p1 更改为另一个 new 时,引用已更改为指向新对象。让我们的指针是200。 所以 arraylist 现在有 200 和 100。

    在这种情况下,即使实际引用变量p1 丢失了旧的对象引用,但列表同时具有引用 100 和 200。所以它会同时具有这两个值。

    注意: ArrayList 允许重复插入。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-29
      • 1970-01-01
      • 2012-09-18
      • 2014-11-28
      • 2018-03-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多