更改java对象而不设置它们

时间:2016-04-20 01:22:24

标签: java arrays loops oop initialization

我想了解以下代码是如何工作的:

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]应该怎么做才能改变。

2 个答案:

答案 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"; 
}