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

向Player子类对象存储数据后无法读取打印,该如何解决?

解决Player子类数据无法读取的问题

看起来你遇到的问题大概率是Java封装特性导致的——你的Player类里的成员变量都是private修饰的,外部代码根本没法直接读取这些值!别着急,咱们一步步解决:

核心问题:私有字段的访问限制

Java中用private修饰的成员变量,只能在类的内部被访问和修改。如果你尝试在类外部直接写player.id或者player.playerName来读取数据,编译器肯定会报错,因为这些字段对外是隐藏的。

解决方案1:为父类Player添加Getter方法

要让外部代码能读取这些私有字段,你需要为每个字段添加public的Getter方法(也就是以get开头的方法)。如果需要修改字段值,还可以添加Setter方法。这里给你补全Player类的完整示例:

public class Player {
    private int id;
    private String playerName;
    private String teamName;
    private String position;
    private double salary;
    private double commisionRate;

    // 默认构造方法
    public Player() {
        // 可以初始化默认值,比如id=0,playerName=""等
    }

    // 带参数的构造方法(推荐,创建对象时直接赋值更方便)
    public Player(int id, String playerName, String teamName, String position, double salary, double commisionRate) {
        this.id = id;
        this.playerName = playerName;
        this.teamName = teamName;
        this.position = position;
        this.salary = salary;
        this.commisionRate = commisionRate;
    }

    // Getter方法:用于读取私有字段
    public int getId() {
        return id;
    }

    public String getPlayerName() {
        return playerName;
    }

    public String getTeamName() {
        return teamName;
    }

    public String getPosition() {
        return position;
    }

    public double getSalary() {
        return salary;
    }

    public double getCommisionRate() {
        return commisionRate;
    }

    // 可选:Setter方法,用于修改私有字段(如果需要动态修改数据的话)
    public void setId(int id) {
        this.id = id;
    }

    public void setPlayerName(String playerName) {
        this.playerName = playerName;
    }

    // 其他字段的Setter方法以此类推
}

解决方案2:子类BaseballPlayer的适配

如果你的BaseballPlayer有自己的私有字段(比如打击率、本垒打数等),同样要给这些字段添加Getter/Setter方法。另外,子类可以通过super()调用父类的构造方法,来初始化父类的字段:

public class BaseballPlayer extends Player {
    // 子类特有字段示例:打击率
    private double battingAverage;

    // 默认构造方法
    public BaseballPlayer() {
        super(); // 调用父类的默认构造方法
    }

    // 带参数的构造方法,包含父类和子类的所有字段
    public BaseballPlayer(int id, String playerName, String teamName, String position, double salary, double commisionRate, double battingAverage) {
        super(id, playerName, teamName, position, salary, commisionRate); // 初始化父类字段
        this.battingAverage = battingAverage; // 初始化子类字段
    }

    // 子类字段的Getter方法
    public double getBattingAverage() {
        return battingAverage;
    }

    // 子类字段的Setter方法(可选)
    public void setBattingAverage(double battingAverage) {
        this.battingAverage = battingAverage;
    }
}

测试读取数据的示例

现在你可以创建对象,通过构造方法或Setter赋值,然后用Getter方法读取并打印数据了:

public class Main {
    public static void main(String[] args) {
        // 创建BaseballPlayer对象,用带参构造直接赋值
        BaseballPlayer babe = new BaseballPlayer(1, "Babe Ruth", "New York Yankees", "Outfielder", 80000, 0.05, 0.342);

        // 读取并打印所有数据
        System.out.println("球员ID: " + babe.getId());
        System.out.println("姓名: " + babe.getPlayerName());
        System.out.println("球队: " + babe.getTeamName());
        System.out.println("位置: " + babe.getPosition());
        System.out.println("薪资: $" + babe.getSalary());
        System.out.println("佣金比例: " + babe.getCommisionRate() * 100 + "%");
        System.out.println("打击率: " + babe.getBattingAverage());
    }
}

总结

本质上这是Java封装特性的基础应用——private字段保证数据安全性,Getter/Setter方法提供可控的访问入口。只要给每个私有字段添加对应的Getter方法,你就能顺利读取存储在对象里的数据了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:25:39