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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 07:09:15