了解程序生命周期中的类引用

时间:2017-03-19 12:15:05

标签: java

我想要了解的是类引用以及该引用如何在程序运行的生命周期中发生变化。例如

ClassRef ref = new ClassRef();
ref.setVariableOne(1);
ref.setVariableTwo(2);

所以我知道这将创建一个名为ref的对象,我可以在我的代码中传递给我需要的对象,我可以使用序列化来保存和加载它,这很好。如果我要创建某种输出,则会显示ref = 1,2

但是,如果我这样做呢

ArrayList<ClassRef> refArray = new ArrayList<ClassRef>
refArray.add(ref);
ref.setVariableOne(3);

我已经将我的对象添加到数组中,然后更改了其中一个变量,数组中的对象是否也更新了,或者是否执行了#34; save&#34;这是在添加时的快照,所以如果我从数组中输出它会给ref = 1,2或者它会显示ref = 3,2

3 个答案:

答案 0 :(得分:1)

您遇到了这种困惑,因为您将ggplot(df_all, aes(x=TOTAL_Estimated_Collateral_value_sum, color=cluster)) + geom_histogram(alpha = 0.7, position="dodge") 视为对象,而ref对象的引用 。更多内容,here

因此,当您将ref传递给方法时,您没有传递对象,而是 对该对象的引用 。因此,ref包含对象的引用。现在,即使您对对象进行了更改,引用也保持不变

因此,当您执行ArrayList时,更改引用。由于引用是我们传递的内容,因此更改甚至会影响ref.setVariableOne(3)

因此,输出将为ArrayList

答案 1 :(得分:1)

  

我已将我的对象添加到数组中,然后更改了其中一个变量,数组中的对象是否也更新,或者在添加时将其“保存”为快照,所以如果我是从数组输出它会给ref = 1,2或者它会显示ref = 3,2

数组列表中的对象也将更改,因此输出ref=3,2

要了解此行为,您需要了解对象和引用是什么。对象是您可以使用new创建的对象。在这里,您创建了一个新对象:

new ClassRef();

请注意,创建对象的过程不包括ClassRef ref =部分,因为该部分会创建对该对象的引用。该部分说“ref现在将引用新创建的ClassRef对象”。

ref添加到数组列表时,您将添加对数组列表的引用。所以现在数组列表中的唯一元素是指您在第一个对象ref引用的对象中引用的对象。请注意,不会创建任何新对象。

当你改变ref时:

ref.setVariableOne(3);

它会改变ref引用的对象,它恰好与数组列表中唯一元素引用的对象相同。如果您现在执行refArray.get(0),则只相当于ref

答案 2 :(得分:0)

输出将为ref

您需要了解的是,当您将refArray添加到ref时,您只需保留对象的引用(由refArray指向)在refArray列表内。

因此,当您从{{1}}检索对象时,也会注意到对原始对象的任何更改。