我想了解以下代码是如何工作的:
public class Sample {
public static void main(String[] args) {
Name defaultName = new Name();
defaultName.setFirstName("defaultfirst");
defaultName.setLastName("defaultlast");
Name name1 = new Name();
name1.setFirstName("name1First");
name1.setLastName("name1Last");
Name name2 = new Name();
name2.setFirstName("name2First");
name2.setLastName("name2Last");
List<Name> namesNew = new ArrayList<Name>();
namesNew.add(name1);
namesNew.add(name2);
List<Name> names = new ArrayList<Name>();
for(int i=0;i<2;i++){
Name name = defaultName;
name.setFirstName(namesNew.get(i).getFirstName());
name.setLastName(namesNew.get(i).getLastName());
System.out.println(i+ " name " +name);
names.add(name);
System.out.println(i +" " +names);
}
System.out.println(names);
}
}
当执行第一个循环时,name [0]的值被设置为name1但是在发送循环后执行名称[1]并且名称[0]也变为name2,即使我没有设置名称[0]代码中的任何地方。
有人可以告诉我这是怎么表现的,也可以告诉我名字[0]应该怎么做才能改变。
答案 0 :(得分:2)
不要这样做:
Name name = defaultName;
通过这种方式,您可以不断更改for循环中单个对象的状态,这是不您想要的内容。而是在循环中创建一个新的Name对象:
Name name = new Name();
答案 1 :(得分:0)
这里的问题是你将name设置为对defaultName的引用,而不是将defaultName复制到name。因此,在循环的每次迭代中,您都在谈论同一个对象。
我不知道你是否控制了姓名。但如果你这样做,你可以处理它。这称为复制构造函数。
public class Name {
String firstName;
String lastName;
public Name(Name oldName) {
this.firstName = oldName.getFirstName();
this.lastName = oldName.getLastName();
}
public Name() {
}
}
然后在你的循环中你可以做
Name name = new Name(defaultName);
虽然在我看来,默认名称值实际上并不打算在循环中使用。因此,您可以首先省略对默认名称的任何引用。并做这样的事情。
for (int i = 0; i < 2; i++) {
Name name = new Name();
name.setFirstName(namesNew.get(i).getFirstName());
name.setLastName(namesNew.get(i).getLastName());
names.add(name);
}
虽然我个人而言,我不知道将defaultName作为名称实例的原因,只需将名称参数设置为Name类中的默认值(如果您控制Name类)。
那就像这样做
public class Name {
String firstName = "Firstname";
String lastName = "Lastname";
}