Java主类如何访问并输出子类实例录入的参数值
问题修复方案
你当前无法获取子类输入内容的核心原因:
- Java方法为值传递,你在
name()、race()中修改传入的形参,仅会修改方法栈内的临时副本,方法执行结束后副本销毁,值不会留存 - 子类没有定义成员变量存储用户输入的内容,方法执行完输入结果直接丢失
- 现有
getStatArray()存在逻辑bug:属性值未完整存入数组、点数校验后未重置计数、总点数计算逻辑错误
修正后的完整代码
首先调整抽象类定义,移除不需要的形参,补全属性访问、信息输出的抽象方法:
public abstract class Player { // 录入姓名的方法,不需要外部传参 public abstract void inputName(); // 录入种族的方法,不需要外部传参 public abstract void inputRace(); // 录入属性数组的方法 public abstract void inputStats(); // 输出所有角色信息的方法 public abstract void printCharacterInfo(); }
然后修正子类实现,新增成员变量存储输入值,修复原有输入逻辑bug:
import java.util.Scanner; public class ChildPlayer extends Player { // 成员变量:存储所有用户输入的内容,对象全局可访问 private String playerName; private int playerRace; private int[] statArray; private final Scanner sc = new Scanner(System.in); // 种族映射,输出时可直接转换为对应文字 private final String[] raceNameMap = {"", "Human", "Elf", "Orc", "Angel", "Demon"}; @Override public void inputName() { System.out.print("Enter your name: "); // 处理前面nextInt遗留的换行符,避免输入被跳过 sc.nextLine(); playerName = sc.nextLine(); } @Override public void inputRace() { System.out.println("Race options: "); System.out.println("\t 1 - Human \n\t 2 - Elf \n\t 3 - Orc \n\t 4 - Angel \n\t 5 - Demon"); System.out.print("Enter character's race: "); playerRace = sc.nextInt(); // 输入合法性校验 while (playerRace <1 || playerRace >5) { System.out.print("Invalid option, please enter character's race again: "); playerRace = sc.nextInt(); } System.out.println(" "); } @Override public void inputStats() { statArray = new int[3]; int totalPts; System.out.println("Enter character's stats (3 values, total points no more than 10):"); do { totalPts = 0; for (int i = 0; i < 3; i++) { System.out.print("Enter stat " + (i+1) + " value: "); statArray[i] = sc.nextInt(); totalPts += statArray[i]; } if (totalPts > 10) { System.out.println("Total points exceed 10, please input again."); } } while (totalPts >10); } @Override public void printCharacterInfo() { System.out.println("===== Character Info ====="); System.out.println("Name: " + playerName); System.out.println("Race: " + raceNameMap[playerRace]); System.out.print("Stats: ["); for (int i = 0; i < statArray.length; i++) { System.out.print(statArray[i]); if (i != statArray.length-1) System.out.print(", "); } System.out.println("]"); } }
主类调用逻辑如下,创建实例后依次调用输入方法,最后直接调用输出方法即可展示所有输入值:
public class Main { public static void main(String[] args) { // 创建子类实例 ChildPlayer player = new ChildPlayer(); // 依次调用输入方法,所有输入会自动存在player对象的成员变量里 player.inputRace(); player.inputName(); player.inputStats(); // 执行末尾输出所有录入的参数 player.printCharacterInfo(); } }
逻辑说明
- 所有用户输入的内容都存在子类的私有成员变量中,只要对象没被销毁,随时可以通过getter方法或者类内部方法访问
- 修复了原代码中Scanner输入的换行符残留问题,避免姓名输入被跳过
- 修复了属性输入的校验逻辑,循环输入直到总点数符合要求再退出
- 类名、方法名遵循Java驼峰命名规范,可读性更强
内容的提问来源于stack exchange,提问作者trese
相关产品推荐
相关产品推荐

