向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
相关产品推荐
相关产品推荐

