我过去几天一直在关注Lynda.com java教程,我对这一部分非常困惑,特别是涉及该行:
p1 = new Property(230000, "Estate", 2.0, 2, 3)
我现在已经将两次p1添加到ArrayList mls中,但是当我将Property p1对象等同于Property类的新对象时,究竟会发生什么?
我是否更改了p1的初始值或从对象p1'创建新对象?
答案 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中的两个条目都将反映更改(因为两者都引用相同的东西)
这个问题提供了一些相关和有趣的细节:
答案 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
允许重复插入。