ArrayList.get 如何返回它的对象?

上下文:我正在制作一个小型解释器式计算器。我认为保存符号表的最佳方法是创建一个我定义的对象的 ArrayList(对象的名称是 WiP)。设置 ArrayList 看起来像。


ArrayList<miniVariable> vList = new ArrayList<miniVariable>();

足够简单,miniVariable对象包含以下变量


    public String name;

    public double value; 

    public boolean initialized;

它们是公开的,因为我已经使用 ArrayList 在类中创建了 setter/getter,当时我没有意识到你可以创建一个对象,而且我不想把所有东西都移过去。我大概应该。


问题:如果我调用vList.get(index) .value = 5;它实际上会改变存储在vList(index)'svalue变量中的值吗?或者.get(index)只是返回数据的副本,因此更改此副本实际上并没有做任何事情?


潇潇雨雨
浏览 322回答 3
3回答

慕码人2483693

所有集合对象都存储对对象的引用,如果您直接(通过集合访问)或间接(已经拥有它的引用)更改对象上的任何内容,它将更改存储在集合中的对象的状态

侃侃尔雅

您存储在 中的ArrayList不是对象本身,而是对对象的引用。因此,当您这样做时,vList.get(i)它会返回您之前放入的引用。这意味着您将访问之前放入列表中的同一个对象,而不是它的副本。让自己熟悉 Java 的基本概念之一,即引用和原始类型。一些题外话的建议:确保您了解 Java 的命名约定。例如,对于类名,它应该是MiniVariable而不是miniVariable。更准确地说:“并且 miniVariable 对象包含以下变量”,MiniVariable是一个类,而不是一个对象。您可能会说“并且一个 MiniVariable 对象(实例)包含这些成员字段”,或者“在 MiniVariable 类中定义了以下成员字段”

12345678_0001

正如人们所期望的那样,它会更改原始实例上的值。在 Java 中创建对象的副本只会显式地发生(并且通常会遇到一些困难)。其他一些注意事项:中的类名应该是CapitalCase.在持有对象列表的对象上实现 getter 和 setter 是不好的做法,因为它违反了封装。如果您正在实现 getter 和 setter,最好将它们放在它们适用的类中。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java