我写了一个使用ArrayList集合的小程序:
import java.util.Scanner;
import java.util.ArrayList;
class MyClass {
String name ;
String surname ;
int age ;
MyClass () {}
MyClass (String name,String surname,int age){
this.name = name;
this.surname= surname;
this.age=age;
}
void showAll () {
System.out.println("----------------------------------------------------------------------------------------");
System.out.println("Name: "+name+"n"+"Surname: "+surname+"n"+"Age: "+age);
}
}
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
ArrayList<MyClass> arrayData = new ArrayList<>();
MyClass obj= new MyClass();
int index ;
for (int i=1;i<=5;i++) {
System.out.println("-------------------------------------------------------------------------------------");
System.out.println("Data of person No "+i+" : ");
System.out.println("Name: ");
obj.name = input.nextLine();
System.out.println("Surname: ");
obj.surname = input.nextLine();
System.out.println("Age: ");
obj.age = input.nextInt();
input.nextLine();
arrayData.add(obj);
}
while(true) {
System.out.println("Put index: ");
index = input.nextInt();
input.nextLine();
arrayData.get(index).showAll();
}
}
}
但它并没有按预期工作,因为arrayData
在其所有元素中只存储最后接收到的对象obj
。这条线上似乎有一个问题:
arrayData.add(obj);
因此,我在谷歌上做了一些研究,找到了一种修复代码的方法,将引用obj
替换为Myclas
的实例,如流:
arrayData.add(new MyClass(obj.name, obj.surname, obj.age));
它成功了!但我仍然不明白为什么arrayData.add(obj);
不起作用,而它看起来和arrayData.add(new MyClass(obj.name, obj.surname, obj.age));
一样?
您正在循环外部初始化"obj",因此实际上只有一个"MyClass"对象。因此,通过将其添加到ArrayList,您每次都试图添加相同的对象,正因为如此,它更新了列表中所有对象的数据,这导致了您的问题。尝试将'obj=new MyClass()'移动到循环内部。