作业要求使用数组时重复打印单个对象的问题求助
解决数组存储对象重复打印的问题
兄弟,我一眼就看出你大概率踩了两个新手常见坑之一:要么是只创建了一个对象反复复用,要么是错误地用了static属性导致所有对象共享数据。咱们一步步拆解解决:
核心问题1:复用同一个对象引用
如果你在循环外面只创建了一次对象,然后循环里只是修改它的属性再塞进数组,那数组里所有元素指向的都是同一个对象——最后打印的时候自然全是最后一次修改的内容!
错误示例(你可能正在这么写)
// 假设你的自定义类叫Student Student[] studentArray = new Student[3]; // 只在循环外创建一个对象 Student stu = new Student(); for (int i = 0; i < studentArray.length; i++) { // 只是修改同一个对象的属性 stu.setId(i + 1); stu.setName("Student " + (i + 1)); // 把同一个对象塞进数组的不同位置 studentArray[i] = stu; }
正确写法:循环内每次创建新对象
要确保数组的每个元素都是独立的对象,必须在循环内部实例化新对象:
Student[] studentArray = new Student[3]; for (int i = 0; i < studentArray.length; i++) { // 每次循环都新建一个对象! Student stu = new Student(); stu.setId(i + 1); stu.setName("Student " + (i + 1)); studentArray[i] = stu; }
核心问题2:误用static属性
如果你的自定义类里,用来存储不同数据的属性被声明为static,那不管你创建多少个对象,这个属性都是类级别的共享变量——所有对象都会共用同一个值,打印出来自然重复。
错误示例(static属性导致共享)
class Student { // static属性:所有Student对象共享同一个id和name static int id; static String name; // getter和setter... }
正确写法:用非static属性
要让每个对象有自己独立的数据,必须把属性声明为非static:
class Student { // 非static属性:每个Student对象有自己的id和name副本 int id; String name; // getter和setter... }
验证方法
你可以在打印的时候顺便输出对象的hashCode(),如果所有输出的hashCode都一样,那说明数组里存的都是同一个对象;如果hashCode不同,那再检查属性是不是static的。
比如:
for (Student stu : studentArray) { System.out.println(stu.hashCode() + " | " + stu.getId() + " " + stu.getName()); }
按照这两步排查,应该就能解决重复打印的问题了!
内容的提问来源于stack exchange,提问作者HelmuticusMaximus
相关产品推荐
相关产品推荐

