Setter方法意外为类中所有对象赋值的问题求助
解决Setter方法修改所有对象值的问题
兄弟,我太懂这种踩坑的憋屈感了!你遇到的这个问题十有八九是两个常见原因导致的,咱们一步步拆解:
最可能的原因:成员变量被声明为static
如果你的学生类里,成绩相关的变量加了static修饰符,那所有学生对象都会共享这个变量的值——因为static变量属于类本身,不是每个对象单独拥有的属性。每次调用setter都会覆盖这个类级别的值,最后所有对象自然都显示最后一次设置的成绩。
错误示例代码
public class Student { private String name; // 这里的static是罪魁祸首! private static int score; public void setScore(int score) { this.score = score; } public int getScore() { return score; } }
解决方法
直接去掉static修饰符,让每个Student对象拥有自己独立的score成员:
public class Student { private String name; // 去掉static,每个对象单独持有这个值 private int score; public void setScore(int score) { this.score = score; } public int getScore() { return score; } }
第二种可能:引用类型变量共享实例
如果你的成绩是用数组、自定义对象这类引用类型存储的,且所有学生对象都指向了同一个引用实例,那修改其中一个的内容,所有对象的内容都会跟着变。
错误示例代码
// 所有学生共用同一个成绩数组 int[] sharedScore = new int[1]; Student s1 = new Student("张三"); s1.setScoreArray(sharedScore); Student s2 = new Student("李四"); s2.setScoreArray(sharedScore); // 修改s2的成绩时,s1的成绩也会变 sharedScore[0] = 90;
解决方法
在setter方法里做深拷贝,让每个对象持有独立的引用实例:
import java.util.Arrays; public class Student { private String name; private int[] scoreArray; public void setScoreArray(int[] scoreArray) { // 创建新数组复制原内容,避免共享引用 this.scoreArray = Arrays.copyOf(scoreArray, scoreArray.length); } }
验证用的完整正确示例
public class Student { private String name; private int score; public Student(String name) { this.name = name; } public void setScore(int score) { this.score = score; } public String getName() { return name; } public int getScore() { return score; } @Override public String toString() { return "学生:" + name + ",成绩:" + score; } } // 测试代码 public class Test { public static void main(String[] args) { Student alice = new Student("Alice"); alice.setScore(85); Student bob = new Student("Bob"); bob.setScore(92); System.out.println(alice); // 输出:学生:Alice,成绩:85 System.out.println(bob); // 输出:学生:Bob,成绩:92 } }
快速排查步骤
- 检查学生类中成绩相关变量是否带有
static修饰符 - 如果是引用类型变量,确认每个对象是否持有独立的实例,而非共享同一个引用
- 调试时可以打印对象的
hashCode(),确认你操作的是不同的对象实例
内容的提问来源于stack exchange,提问作者Mu3
相关产品推荐
相关产品推荐

