用Java构建简单ATM系统

目录

Account.java:管理账户详细信息

ATMSystem.java:管理用户交互

示例实现

代码分析

ATMSystem.java

代码分析

运行流程


在这篇博客中,我们将探讨如何使用Java构建一个简单的ATM(自动取款机)系统。我们将详细分析实现细节,看看这个系统是如何管理用户账户并处理诸如余额查询、存款和取款等基本操作的。

了解核心组件

我们的ATM系统由两个主要组件组成,分别由两个Java文件表示:

  1. Account.java:这个类可能表示单个银行账户,封装账户的详细信息,如余额、账户号码,以及操控这些详细信息的方法。

  2. ATMSystem.java:这个类可能负责管理用户与其账户之间的交互,提供一个用户界面以进行账户操作。

让我们深入了解每个文件,看看它们是如何对整个系统做出贡献的。

Account.java:管理账户详细信息

Account类是我们ATM系统的核心,它封装了每个账户的属性和行为。下面是该类可能包含的功能:

  • 属性

    • accountNumber:账户号码,唯一标识一个账户。
    • balance:账户余额,用于存储当前账户可用的资金。
  • 方法

    • deposit(double amount):用于将一定金额存入账户。
    • withdraw(double amount):用于从账户中取出一定金额。
    • getBalance():返回当前账户余额。
    • getAccountNumber():返回账户号码。

这些方法允许我们对账户执行基本的操作,如存取款和查询余额。

ATMSystem.java:管理用户交互

ATMSystem类是用户与ATM系统进行交互的界面。它可能包括以下功能:

  • 账户管理:允许用户登录和访问其账户。
  • 交易功能:提供存款、取款和余额查询的功能。
  • 用户界面:通过命令行或图形界面与用户交互,接受用户输入并显示结果。

这个类将Account类中的功能整合起来,形成一个完整的用户操作流程。通过ATMSystem类,用户可以方便地进行账户操作,而无需直接与Account类的实现细节打交道。

示例实现

让我们通过示例代码来更具体地了解这两个类是如何协同工作的。

public class Account {
    private int accountNumber;  // 账户号码
    private double balance;     // 账户余额

    // 构造函数:用于初始化账户对象
    public Account(int accountNumber, double initialBalance) {
        this.accountNumber = accountNumber;
        this.balance = initialBalance;
    }

    // 存款方法:将指定金额存入账户
    public void deposit(double amount) {
        if (amount > 0) {
            balance += amount;
        }
    }

    // 取款方法:从账户中提取指定金额,如果余额足够,返回true;否则返回false
    public boolean withdraw(double amount) {
        if (amount > 0 && amount <= balance) {
            balance -= amount;
            return true;
        }
        return false;
    }

    // 获取账户余额
    public double getBalance() {
        return balance;
    }

    // 获取账户号码
    public int getAccountNumber() {
        return accountNumber;
    }
}
代码分析
  1. 类属性

    • accountNumber:用于存储账户的唯一标识符。
    • balance:存储账户的当前余额。
  2. 构造函数

    • Account(int accountNumber, double initialBalance):用于创建一个新的账户对象,初始化账户号码和初始余额。
  3. 方法

    • deposit(double amount):用于将正数金额存入账户,增加余额。
    • withdraw(double amount):用于从账户中提取金额。只有当余额充足且提取金额大于零时,才会执行操作,并返回 true
    • getBalance():返回当前账户的余额。
    • getAccountNumber():返回账户的号码。

ATMSystem.java

ATMSystem.java 是ATM系统的核心部分,负责用户交互和账户管理。以下是对该文件的详细分析:

import java.util.HashMap;
import java.util.Scanner;

public class ATMSystem {
    private HashMap<Integer, Account> accounts;  // 存储账户信息的哈希表
    private Scanner scanner;  // 用于读取用户输入

    // 构造函数:初始化ATM系统
    public ATMSystem() {
        accounts = new HashMap<>();
        scanner = new Scanner(System.in);
    }

    // 添加账户:根据账户号码和初始余额创建新的账户
    public void addAccount(int accountNumber, double initialBalance) {
        Account account = new Account(accountNumber, initialBalance);
        accounts.put(accountNumber, account);
    }

    // 启动ATM系统:处理用户输入并执行相应的操作
    public void start() {
        while (true) {
            System.out.println("欢迎使用ATM系统");
            System.out.print("请输入账户号码:");
            int accountNumber = scanner.nextInt();

            if (accounts.containsKey(accountNumber)) {
                Account account = accounts.get(accountNumber);
                boolean exit = false;

                while (!exit) {
                    System.out.println("1. 查询余额");
                    System.out.println("2. 存款");
                    System.out.println("3. 取款");
                    System.out.println("4. 退出");
                    System.out.print("请选择操作:");
                    int choice = scanner.nextInt();

                    switch (choice) {
                        case 1:
                            System.out.println("当前余额:" + account.getBalance());
                            break;
                        case 2:
                            System.out.print("请输入存款金额:");
                            double depositAmount = scanner.nextDouble();
                            account.deposit(depositAmount);
                            System.out.println("存款成功!");
                            break;
                        case 3:
                            System.out.print("请输入取款金额:");
                            double withdrawAmount = scanner.nextDouble();
                            if (account.withdraw(withdrawAmount)) {
                                System.out.println("取款成功!");
                            } else {
                                System.out.println("余额不足!");
                            }
                            break;
                        case 4:
                            exit = true;
                            break;
                        default:
                            System.out.println("无效选项,请重新选择!");
                            break;
                    }
                }
            } else {
                System.out.println("账户不存在!");
            }
        }
    }
}
代码分析
  1. 类属性

    • accounts:使用 HashMap 来存储账户信息,其中键为账户号码,值为对应的 Account 对象。
    • scanner:用于读取用户输入的 Scanner 对象。
  2. 构造函数

    • ATMSystem():初始化 accounts 哈希表和 scanner
  3. 方法

    • addAccount(int accountNumber, double initialBalance):用于创建并添加新账户到系统。
    • start():主方法,负责系统的交互逻辑和操作流程:
      • 询问用户输入账户号码。
      • 验证账户是否存在,存在则允许用户进行操作。
      • 提供操作选项:查询余额、存款、取款、退出。
      • 根据用户选择执行相应的账户操作。

运行流程

  1. 用户启动ATM系统并输入其账户号码。
  2. 系统验证账户存在性。
  3. 用户根据提示选择操作:查询余额、存款、取款。
  4. 系统根据用户的选择执行相应的操作,并显示结果。
  5. 用户可以选择继续其他操作或退出系统。

通过这样的设计,我们可以简单有效地模拟一个ATM系统,利用Java的面向对象特性,实现账户管理与用户交互的分离。这种结构使得代码易于维护和扩展,比如可以进一步添加账户验证、历史记录等功能。

相关推荐
charlie1145141911 分钟前
C++ STL CookBook
开发语言·c++·stl·c++20
袁袁袁袁满1 分钟前
100天精通Python(爬虫篇)——第113天:‌爬虫基础模块之urllib详细教程大全
开发语言·爬虫·python·网络爬虫·爬虫实战·urllib·urllib模块教程
ELI_He9998 分钟前
PHP中替换某个包或某个类
开发语言·php
m0_7482361115 分钟前
Calcite Web 项目常见问题解决方案
开发语言·前端·rust
倔强的石头10623 分钟前
【C++指南】类和对象(九):内部类
开发语言·c++
ProtonBase27 分钟前
如何从 0 到 1 ,打造全新一代分布式数据架构
java·网络·数据库·数据仓库·分布式·云原生·架构
Watermelo61728 分钟前
详解js柯里化原理及用法,探究柯里化在Redux Selector 的场景模拟、构建复杂的数据流管道、优化深度嵌套函数中的精妙应用
开发语言·前端·javascript·算法·数据挖掘·数据分析·ecmascript
乐之者v33 分钟前
leetCode43.字符串相乘
java·数据结构·算法
半盏茶香2 小时前
在21世纪的我用C语言探寻世界本质 ——编译和链接(编译环境和运行环境)
c语言·开发语言·c++·算法
Evand J3 小时前
LOS/NLOS环境建模与三维TOA定位,MATLAB仿真程序,可自定义锚点数量和轨迹点长度
开发语言·matlab