我在for循环的帮助下在列表中添加了五个对象。我正在for循环外初始化我的对象。在for循环体中,我正在更改对象setter属性并将其添加到列表中。这样的输出是:它将添加五个对象,但即使在为属性设置不同的值之后,它们也具有相同的属性。
请参阅以下代码
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class ASD {
public static void main(String args[]) {
List list = new ArrayList<A>();
System.out.println("Before Insert List is " + list);
A obj = new A();
for (int i = 0; i < 5; i++) {
obj.setA(new Random().nextInt(10));
list.add(obj);
}
System.out.println("After Insert List is " + list);
for (int i = 0; i < 5; i++) {
A prObj = (A) list.get(i);
System.out.println("Values are" + prObj.getA());
}
}
}
class A {
int a;
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
}
如果我在for循环中初始化A的对象,那么它将添加五个对象,并且还会更改对象的属性。任何人都可以解释这种行为
答案 0 :(得分:3)
您只创建了一个实例并在for
循环中多次设置它。在A
循环内创建for
的新实例,而不是在其外部
for (int i=0;i<5;i++) {
A obj = new A();
obj.setA(new Random().nextInt(10));
list.add(obj);
}
答案 1 :(得分:2)
当你这样做时 -
A obj = new A();
for (int i=0;i<5;i++) {
obj.setA(new Random().nextInt(10));
list.add(obj);
您实际上是在更改了属性 setA 后添加对同一对象的引用。
这样,所有列表元素都引用了同一个对象(具有相同的值a
)。
如果您想拥有不同的值,则需要添加新对象 -
for (int i=0;i<5;i++) {
obj = new A(); // new object
obj.setA(new Random().nextInt(10));
list.add(obj);