0

0

Java 中如何正确调用子类的交互式菜单方法(含完整可运行示例)

心靈之曲

心靈之曲

发布时间:2026-02-12 09:24:56

|

768人浏览过

|

来源于php中文网

原创

Java 中如何正确调用子类的交互式菜单方法(含完整可运行示例)

本文详解如何在 java 主类中成功调用另一个类(如 bankaccount)中的交互式菜单方法,重点解决因缺少输入读取导致菜单“一闪而过”的常见问题,并提供结构清晰、健壮可用的银行账户模拟代码。

在 Java 面向对象编程实践中,将业务逻辑(如银行账户操作)封装到独立类中,再由 main 类负责初始化与驱动,是一种标准且推荐的设计方式。但初学者常遇到一个典型问题:菜单方法(如 menu())看似被调用了,控制台却只显示欢迎信息和选项列表,随后程序立即退出——根本原因在于菜单逻辑未进入持续交互循环,且关键的用户输入未被读取与处理

下面是一段修复后的完整可运行代码,已补充缺失的输入处理、菜单循环、功能分支及边界保护:

import java.util.Scanner;

public class BankApplication {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("Enter your 'Name' and 'CustomerId' to access your Bank account:");
        String name = sc.nextLine().trim();
        String customerId = sc.nextLine().trim();

        // 防止空用户名或ID导致异常
        if (name.isEmpty() || customerId.isEmpty()) {
            System.out.println("Error: Name and Customer ID cannot be empty.");
            return;
        }

        BankAccount obj1 = new BankAccount(name, customerId);
        obj1.menu(); // ✅ 正确触发菜单逻辑
        sc.close(); // 释放资源
    }
}

class BankAccount {
    private double bal = 0.0;           // 初始余额为0
    private double prevTrans = 0.0;     // 上次交易金额(正为存,负为取)
    private final String customerName;
    private final String customerId;

    public BankAccount(String customerName, String customerId) {
        this.customerName = customerName;
        this.customerId = customerId;
    }

    public void deposit(double amount) {
        if (amount > 0) {
            bal += amount;
            prevTrans = amount;
            System.out.println("✓ Deposited: $" + amount);
        } else {
            System.out.println("⚠ Invalid deposit amount.");
        }
    }

    public void withdraw(double amount) {
        if (amount <= 0) {
            System.out.println("⚠ Invalid withdrawal amount.");
        } else if (amount > bal) {
            System.out.println("❌ Insufficient balance. Current balance: $" + bal);
        } else {
            bal -= amount;
            prevTrans = -amount;
            System.out.println("✓ Withdrawn: $" + amount);
        }
    }

    public void getPreviousTrans() {
        if (prevTrans > 0) {
            System.out.println("→ Last transaction: Deposited $" + prevTrans);
        } else if (prevTrans < 0) {
            System.out.println("→ Last transaction: Withdrawn $" + Math.abs(prevTrans));
        } else {
            System.out.println("→ No transaction yet.");
        }
    }

    public void checkBalance() {
        System.out.println("? Current balance: $" + bal);
    }

    public void menu() {
        Scanner sc = new Scanner(System.in);
        System.out.println("\n" + "=".repeat(40));
        System.out.println("? Welcome, " + customerName + " | ID: " + customerId);
        System.out.println("=".repeat(40));

        char option;
        do {
            System.out.println("\nPlease select an option:");
            System.out.println("a) Check Balance");
            System.out.println("b) Deposit");
            System.out.println("c) Withdraw");
            System.out.println("d) Show Last Transaction");
            System.out.println("e) Exit");
            System.out.print("→ Enter option (a-e): ");

            // ✅ 关键修复:必须读取用户输入,否则菜单无法响应
            String input = sc.nextLine().trim();
            if (input.length() == 0) continue;
            option = input.charAt(0);

            switch (option) {
                case 'a':
                case 'A':
                    checkBalance();
                    break;
                case 'b':
                case 'B':
                    System.out.print("Enter deposit amount: $");
                    try {
                        double amt = Double.parseDouble(sc.nextLine().trim());
                        deposit(amt);
                    } catch (NumberFormatException e) {
                        System.out.println("⚠ Invalid number format.");
                    }
                    break;
                case 'c':
                case 'C':
                    System.out.print("Enter withdrawal amount: $");
                    try {
                        double amt = Double.parseDouble(sc.nextLine().trim());
                        withdraw(amt);
                    } catch (NumberFormatException e) {
                        System.out.println("⚠ Invalid number format.");
                    }
                    break;
                case 'd':
                case 'D':
                    getPreviousTrans();
                    break;
                case 'e':
                case 'E':
                    System.out.println("? Thank you for banking with us. Goodbye!");
                    break;
                default:
                    System.out.println("⚠ Invalid option. Please choose a-e.");
            }
        } while (option != 'e' && option != 'E');

        sc.close(); // 确保菜单内Scanner也关闭(注意:若main中已close,则此处需避免重复关闭;本例中menu独占Scanner更安全)
    }
}

关键要点总结

Gaga
Gaga

曹越团队开发的AI视频生成工具

下载
  • 菜单必须是循环结构:使用 do-while 或 while(true) 持续等待用户选择,而非单次执行后退出;
  • 必须显式读取输入:sc.nextLine()(或 sc.next())不可省略,否则 switch 将无输入可判断;
  • 输入校验必不可少:对空输入、非法字符、非数字金额做防御性处理,提升鲁棒性;
  • 资源管理要规范:每个 Scanner 实例应在使用完毕后 close(),避免资源泄漏;
  • 封装与职责分离:BankAccount 负责状态与行为,BankApplication 仅负责启动与协调,符合单一职责原则。

运行此代码后,你将看到完整的交互式银行菜单,支持反复操作直至主动选择退出。这不仅是语法修正,更是面向对象设计思维的实践落地。

立即学习Java免费学习笔记(深入)”;

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
switch语句用法
switch语句用法

switch语句用法:1、Switch语句只能用于整数类型,枚举类型和String类型,不能用于浮点数类型和布尔类型;2、每个case语句后面必须跟着一个break语句,以防止执行其他case的代码块,没有break语句,将会继续执行下一个case的代码块;3、可以在一个case语句中匹配多个值,使用逗号分隔;4、Switch语句中的default代码块是可选的等等。

550

2023.09.21

Java switch的用法
Java switch的用法

Java中的switch语句用于根据不同的条件执行不同的代码块。想了解更多switch的相关内容,可以阅读本专题下面的文章。

432

2024.03.13

while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

102

2023.09.25

go语言 面向对象
go语言 面向对象

本专题整合了go语言面向对象相关内容,阅读专题下面的文章了解更多详细内容。

56

2025.09.05

java面向对象
java面向对象

本专题整合了java面向对象相关内容,阅读专题下面的文章了解更多详细内容。

58

2025.11.27

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

23

2026.02.13

微博网页版主页入口与登录指南_官方网页端快速访问方法
微博网页版主页入口与登录指南_官方网页端快速访问方法

本专题系统整理微博网页版官方入口及网页端登录方式,涵盖首页直达地址、账号登录流程与常见访问问题说明,帮助用户快速找到微博官网主页,实现便捷、安全的网页端登录与内容浏览体验。

11

2026.02.13

Flutter跨平台开发与状态管理实战
Flutter跨平台开发与状态管理实战

本专题围绕Flutter框架展开,系统讲解跨平台UI构建原理与状态管理方案。内容涵盖Widget生命周期、路由管理、Provider与Bloc状态管理模式、网络请求封装及性能优化技巧。通过实战项目演示,帮助开发者构建流畅、可维护的跨平台移动应用。

7

2026.02.13

TypeScript工程化开发与Vite构建优化实践
TypeScript工程化开发与Vite构建优化实践

本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。

8

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 3.5万人学习

C# 教程
C# 教程

共94课时 | 9.3万人学习

Java 教程
Java 教程

共578课时 | 64.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号