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

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
    }
}

快速排查步骤

  1. 检查学生类中成绩相关变量是否带有static修饰符
  2. 如果是引用类型变量,确认每个对象是否持有独立的实例,而非共享同一个引用
  3. 调试时可以打印对象的hashCode(),确认你操作的是不同的对象实例

内容的提问来源于stack exchange,提问作者Mu3

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:02:47