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

Java 理解程序生命周期中的类引用,java,Java,我试图理解的是类引用,以及该引用在程序运行的生命周期中是如何变化的。比如说 ClassRef ref = new ClassRef(); ref.setVariableOne(1); ref.setVariableTwo(2); 所以我知道这将创建一个名为ref的对象,我可以在我的代码中将它传递到我需要它的地方,我可以使用序列化来保存和加载它,这很好。如果我要创建某种输出,它将显示ref=1,2 但是如果我这么做呢 ArrayList<ClassRef> refArray = ne

我试图理解的是类引用,以及该引用在程序运行的生命周期中是如何变化的。比如说

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);
ArrayList refArray=new ArrayList
重新排列。添加(参考);
参考设定变量一(3);

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

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


因此,当您从
refArray

检索对象时,也会注意到对原始对象的任何更改。您有这种混淆,因为您将
ref
视为对象,而
ref
是对对象的引用。更多的

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

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

因此,输出将是
ref=3,2

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

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

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

new ClassRef();
请注意,创建对象的过程不包括
ClassRef=
部分,因为该部分创建了对对象的引用。该部分表示“
ref
现在将引用新创建的
ClassRef
对象”

ref
添加到数组列表时,就是将引用添加到数组列表。因此,现在数组列表中的唯一元素引用了您在第一个数组中创建的对象,即相同的对象
ref
引用。请注意,不会创建新对象

当您改变
ref
时:

ref.setVariableOne(3);

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

您所说的
ClassRef
类是什么?谢谢您,我仍然把我的头包裹在类和物体周围,所以这很有意义。“福克,我想我的答案可以回答你的问题,请考虑通过点击那个标记来接受它。