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更安全)
    }
}

关键要点总结

Transor
Transor

专业的AI翻译工具,支持网页、字幕、PDF、图片实时翻译

下载
  • 菜单必须是循环结构:使用 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的相关内容,可以阅读本专题下面的文章。

431

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

2026春节习俗大全
2026春节习俗大全

本专题整合了2026春节习俗大全,阅读专题下面的文章了解更多详细内容。

182

2026.02.11

Yandex网页版官方入口使用指南_国际版与俄罗斯版访问方法解析
Yandex网页版官方入口使用指南_国际版与俄罗斯版访问方法解析

本专题全面整理了Yandex搜索引擎的官方入口信息,涵盖国际版与俄罗斯版官网访问方式、网页版直达入口及免登录使用说明,帮助用户快速、安全地进入Yandex官网,高效使用其搜索与相关服务。

584

2026.02.11

虫虫漫画网页版入口与免费阅读指南_正版漫画全集在线查看方法
虫虫漫画网页版入口与免费阅读指南_正版漫画全集在线查看方法

本专题系统整理了虫虫漫画官网及网页版最新入口,涵盖免登录观看、正版漫画全集在线阅读方式,并汇总稳定可用的访问渠道,帮助用户快速找到虫虫漫画官方页面,轻松在线阅读各类热门漫画内容。

90

2026.02.11

Docker容器化部署与DevOps实践
Docker容器化部署与DevOps实践

本专题面向后端与运维开发者,系统讲解 Docker 容器化技术在实际项目中的应用。内容涵盖 Docker 镜像构建、容器运行机制、Docker Compose 多服务编排,以及在 DevOps 流程中的持续集成与持续部署实践。通过真实场景演示,帮助开发者实现应用的快速部署、环境一致性与运维自动化。

7

2026.02.11

热门下载

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

精品课程

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

共23课时 | 3.5万人学习

C# 教程
C# 教程

共94课时 | 9.2万人学习

Java 教程
Java 教程

共578课时 | 63.4万人学习

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

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