gpt4 book ai didi

Java Arraylist 改变影响其他变量

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:32:13 24 4
gpt4 key购买 nike

我正在使用 java fx,下面的代码没有什么特别之处,并捕获文本字段的 focusedProperty 以覆盖下面新输入的值。下面的代码更改了在文本字段中输入的人名,当用户单击取消按钮时,它会将旧名称放回文本字段中。但是由于某种原因,魔术发生了,每当我设置此人的名字时,它都会覆盖 cancelPerson 变量中的字段。想不通为什么会这样?在设置新值之前,我从人员列表中获取了 cancelPerson。那么人员列表中的变化怎么会影响自变量。知道为什么会发生这种情况吗?谢谢。

 private ObservableList<Person> persons;
private Person person;
private Person cancelPerson;

personName.focusedProperty().addListener((observable, oldValue, newValue) -> {
if (!newValue) {
final int index = personIdCombo.getSelectionModel().getSelectedIndex();
cancelPerson = persons.get(index);
final Person person = persons.get(index);
person.setName(personName.getText());
persons.set(index, person);
}
}
);


class Person{
private final StringProperty name;
public Person() {

this.name = new SimpleStringProperty("testName");

}

public SystemParams(Person person) {

this.name = person.name;
}
}

最佳答案

Jim Garrison's answer (suggesting the copy constructor) is correct; I just wanted to add another answer to give a helpful way of thinking about references in Java.

我发现将 = 赋值视为 REFERS TO 赋值很有帮助。所以,cancelPersons = persons.get(index); 基本上是在说:

cancelPerson REFERS TO persons.get(index);

现在,你的第二行说 final Person person = persons.get(index);,把它想象成

final Person person REFERS TO persons.get(index);

看看他们如何引用相同的 persons.get(index)?现在,无论您使用 cancelPerson 还是仅使用 person,Java 都指向相同的整体对象,而不是不同的对象。

除非您在某处有一个 new 关键字,否则您实际上并不是在创建一个新对象。

关于Java Arraylist 改变影响其他变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51811522/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com