ATM柜员机模拟程序 (Java实现)
下面是一个完整的ATM柜员机模拟程序的Java实现,包含基本功能如存款、取款、查询余额、转账等。

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
public class ATM {
// 存储所有账户信息
private static Map<String, Account> accounts = new HashMap<>();
// 当前登录的账户
private static Account currentAccount = null;
// 扫描器用于用户输入
private static Scanner scanner = new Scanner(System.in);
public static void main(String[] args) {
// 初始化一些测试账户
initializeAccounts();
while (true) {
if (currentAccount == null) {
showLoginMenu();
} else {
showMainMenu();
}
}
}
// 初始化测试账户
private static void initializeAccounts() {
accounts.put("123456", new Account("123456", "123456", 1000.0));
accounts.put("654321", new Account("654321", "654321", 2000.0));
}
// 显示登录菜单
private static void showLoginMenu() {
System.out.println("\n===== ATM系统 =====");
System.out.println("1. 登录");
System.out.println("2. 退出");
System.out.print("请选择操作: ");
int choice = scanner.nextInt();
scanner.nextLine(); // 消耗换行符
switch (choice) {
case 1:
login();
break;
case 2:
System.out.println("感谢使用ATM系统,再见!");
System.exit(0);
break;
default:
System.out.println("无效的选择,请重新输入。");
}
}
// 登录功能
private static void login() {
System.out.print("请输入卡号: ");
String cardNumber = scanner.nextLine();
System.out.print("请输入密码: ");
String password = scanner.nextLine();
Account account = accounts.get(cardNumber);
if (account != null && account.getPassword().equals(password)) {
currentAccount = account;
System.out.println("登录成功!");
} else {
System.out.println("卡号或密码错误,请重试。");
}
}
// 显示主菜单
private static void showMainMenu() {
System.out.println("\n===== 主菜单 =====");
System.out.println("1. 查询余额");
System.out.println("2. 取款");
System.out.println("3. 存款");
System.out.println("4. 转账");
System.out.println("5. 交易记录");
System.out.println("6. 退出登录");
System.out.print("请选择操作: ");
int choice = scanner.nextInt();
scanner.nextLine(); // 消耗换行符
switch (choice) {
case 1:
checkBalance();
break;
case 2:
withdraw();
break;
case 3:
deposit();
break;
case 4:
transfer();
break;
case 5:
showTransactionHistory();
break;
case 6:
logout();
break;
default:
System.out.println("无效的选择,请重新输入。");
}
}
// 查询余额
private static void checkBalance() {
System.out.println("\n当前余额: " + currentAccount.getBalance());
}
// 取款
private static void withdraw() {
System.out.print("请输入取款金额: ");
double amount = scanner.nextDouble();
scanner.nextLine(); // 消耗换行符
if (amount <= 0) {
System.out.println("取款金额必须大于0。");
return;
}
if (amount > currentAccount.getBalance()) {
System.out.println("余额不足。");
return;
}
currentAccount.withdraw(amount);
System.out.println("取款成功!当前余额: " + currentAccount.getBalance());
}
// 存款
private static void deposit() {
System.out.print("请输入存款金额: ");
double amount = scanner.nextDouble();
scanner.nextLine(); // 消耗换行符
if (amount <= 0) {
System.out.println("存款金额必须大于0。");
return;
}
currentAccount.deposit(amount);
System.out.println("存款成功!当前余额: " + currentAccount.getBalance());
}
// 转账
private static void transfer() {
System.out.print("请输入转入账户卡号: ");
String targetCardNumber = scanner.nextLine();
Account targetAccount = accounts.get(targetCardNumber);
if (targetAccount == null) {
System.out.println("转入账户不存在。");
return;
}
if (targetAccount == currentAccount) {
System.out.println("不能向自己转账。");
return;
}
System.out.print("请输入转账金额: ");
double amount = scanner.nextDouble();
scanner.nextLine(); // 消耗换行符
if (amount <= 0) {
System.out.println("转账金额必须大于0。");
return;
}
if (amount > currentAccount.getBalance()) {
System.out.println("余额不足。");
return;
}
currentAccount.withdraw(amount);
targetAccount.deposit(amount);
System.out.println("转账成功!当前余额: " + currentAccount.getBalance());
}
// 显示交易记录
private static void showTransactionHistory() {
List<Transaction> history = currentAccount.getTransactionHistory();
System.out.println("\n===== 交易记录 =====");
if (history.isEmpty()) {
System.out.println("暂无交易记录。");
return;
}
for (Transaction transaction : history) {
System.out.println(transaction);
}
}
// 退出登录
private static void logout() {
currentAccount = null;
System.out.println("已退出登录。");
}
}
// 账户类
class Account {
private String cardNumber;
private String password;
private double balance;
private List<Transaction> transactionHistory;
public Account(String cardNumber, String password, double balance) {
this.cardNumber = cardNumber;
this.password = password;
this.balance = balance;
this.transactionHistory = new ArrayList<>();
}
public String getCardNumber() {
return cardNumber;
}
public String getPassword() {
return password;
}
public double getBalance() {
return balance;
}
public List<Transaction> getTransactionHistory() {
return transactionHistory;
}
public void withdraw(double amount) {
balance -= amount;
transactionHistory.add(new Transaction("取款", -amount));
}
public void deposit(double amount) {
balance += amount;
transactionHistory.add(new Transaction("存款", amount));
}
}
// 交易记录类
class Transaction {
private String type;
private double amount;
private String timestamp;
public Transaction(String type, double amount) {
this.type = type;
this.amount = amount;
this.timestamp = java.time.LocalDateTime.now().toString();
}
@Override
public String toString() {
return String.format("%s - 金额: %.2f - 时间: %s", type, amount, timestamp);
}
}
功能说明
这个ATM模拟程序包含以下功能:
- 用户登录:使用卡号和密码登录系统
- 查询余额:查看当前账户余额
- 取款:从账户中提取现金
- 存款:向账户存入现金
- 转账:向其他账户转账
- 交易记录:查看所有交易历史
- 退出登录:安全退出系统
使用方法
- 运行程序后,会显示登录菜单
- 输入"1"进行登录,初始测试账户:
- 卡号: 123456, 密码: 123456, 余额: 1000
- 卡号: 654321, 密码: 654321, 余额: 2000
- 登录成功后显示主菜单,可以执行各种操作
- 选择"6"退出登录回到登录界面
扩展建议
如果需要进一步增强这个程序,可以考虑:
- 添加账户创建功能
- 实现密码修改功能
- 添加账户锁定机制(多次输错密码)
- 实现更详细的交易记录分类
- 添加定期存款等功能
- 实现GUI界面(使用Swing或JavaFX)
这个程序使用了面向对象的设计,将账户和交易记录封装为类,使代码结构清晰,易于维护和扩展。

