不解为什么下面这段代码输出的是:
4:name4             
4:name4
4:name4
4:name4
4:name4
为什么不是预期的:
0:name0
1:name1
2:name2
3:name3
4:name4import java.util.ArrayList;
public class ArrayListDemo {
public static void main(String args[]){
ArrayList<Person> A=new ArrayList<Person>();
Person p=new Person();
for(int i=0;i<5;i++){
p.setId(i);
p.setName("name"+i);
A.add(p);
}
for(int i=0;i<5;i++){
System.out.println(A.get(i).getId()+":"+A.get(i).getName());
}
}
}

class Person{
public Person(){
this.setName("");
this.setId(0);
}

public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
} public void setId(int id) {
this.id = id;
} public int getId() {
return id;
} private String name;
private int id;
}

解决方案 »

  1.   

    Person p=new Person();
            for(int i=0;i<5;i++){
                p.setId(i);
                p.setName("name"+i);            
                A.add(p);
            }        
    改为        for(int i=0;i<5;i++){
                Person p=new Person();
                p.setId(i);
                p.setName("name"+i);            
                A.add(p);
            }        
      

  2.   

    原因是你只有一个person对象
     Person p=new Person();
            for(int i=0;i<5;i++){
                p.setId(i);
                p.setName("name"+i);            
                A.add(p);
            }        
    虽然经过五次赋值 但是都是针对p这一个对象的 第二次赋值覆盖了第一次赋值 以此类推 最后的结果是id = 4 name = name4
    当i = 0时 id = 0;name = name0;A.get(0).getId() = 0 ;A.get(0).getName() = name0;
    当i = 1时 id = 1; name = name1; A.get(0).getId() = 1 ;A.get(0).getName() = name1; A.get(1).getId() = 1 ;A.get(1).getName() = name1;
    ....
    A 中的5个p的属性一直是保持一致的 只有分别实例化5个person对象 并分别赋值在添加到A中时 才能得到你想要的结果
      

  3.   

    这就是实例化了五次person对象
      

  4.   

    ArrayList在保存person对象的时候,并不是你add之后他就定死了,虽然你add过了。我想arraylist里面只是保存的一个引用而已,而你最终的person里面都是4,所以arraylist里面保存的都是四个相同的person对象的引用,所以值一样