Java - 对象分配困惑

时间:2016-03-04 04:57:27

标签: java oop object

the program

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

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

我现在已经将两次p1添加到ArrayList mls中,但是当我将Property p1对象等同于Property类的新对象时,究竟会发生什么?

我是否更改了p1的初始值或从对象p1'创建新对象?

3 个答案:

答案 0 :(得分: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"?

答案 1 :(得分:0)

您正在创建班级Property的新实例,并设置变量p1以引用它。

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

答案 2 :(得分:0)

执行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允许重复插入。