You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

作业要求使用数组时重复打印单个对象的问题求助

解决数组存储对象重复打印的问题

兄弟,我一眼就看出你大概率踩了两个新手常见坑之一:要么是只创建了一个对象反复复用,要么是错误地用了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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:33:33