【Java项目实战】Java实现ATM模拟系统(附完整源码)

一、项目概述

通过控制台实现一个具备完整金融功能的ATM系统,包含以下核心功能:

✅ 用户管理
✅ 存款/取款(限额控制)
✅ 跨账户转账
✅ 密码修改
✅ 账户销户
✅ 信息查询

技术栈:面向对象编程、集合框架、流程控制

二、核心功能演示

1. 开户流程

控制台输入姓名->性别->密码->生成唯一卡号

2. 转账验证

采用双重验证机制:

2. 核心业务逻辑

ATM类包含:

  1. 目标账户存在性校验

  2. 转账人姓氏二次确认

    // 转账验证代码片段
    System.out.println("请输入"+loginUser.getName().substring(1)+"姓氏:");
    String Nam = scanner.next();
    if(Nam.charAt(0) == loginUser.getName().charAt(0)){
        // 执行转账逻辑
    }

    三、关键技术实现

    1. 面向对象设计

    Account类(原Accent类)封装账户实体:

    public class Accent {
        private String num;
        private String name;
        private char sex;
        private String passWord;
        private double money;
        private double limit;
    
        public Accent() {
        }
    
        public Accent(String num, String name, char sex, String passWord, double money, double limit) {
            this.num = num;
            this.name = name;
            this.sex = sex;
            this.passWord = passWord;
            this.money = money;
            this.limit = limit;
        }
    
        public String getNum() {
            return num;
        }
    
        public void setNum(String num) {
            this.num = num;
        }
    
        public String getName() {
            return name + (sex =='男'?"先生":"女士");
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public char getSex() {
            return sex;
        }
    
        public void setSex(char sex) {
            this.sex = sex;
        }
    
        public String getPassWord() {
            return passWord;
        }
    
        public void setPassWord(String passWord) {
            this.passWord = passWord;
        }
    
        public double getMoney() {
            return money;
        }
    
        public void setMoney(double money) {
            this.money = money;
        }
    
        public double getLimit() {
            return limit;
        }
    
        public void setLimit(double limit) {
            this.limit = limit;
        }
    }
    

    2. ATM核心逻辑(ATM.java)

    import java.util.ArrayList;
    import java.util.Objects;
    import java.util.Random;
    import java.util.Scanner;
    
    public class ATM {
        private ArrayList<Account> accounts = new ArrayList<>();
        private Account loginUser;
        private Scanner scanner = new Scanner(System.in);
    
        public void start() {
            // 主菜单逻辑(完整实现)
            while (true) {
                System.out.println("\n===欢迎使用ATM系统===");
                System.out.println("1. 用户登录");
                System.out.println("2. 用户开户");
                System.out.print("请选择:");
                
                int choice = scanner.nextInt();
                switch (choice) {
                    case 1:
                        login();
                        break;
                    case 2:
                        createAccount();
                        break;
                    default:
                        System.out.println("输入错误,请重新输入!");
                }
            }
        }
    
        // 开户功能完整实现
        private void createAccount() {
            System.out.println("\n===开户功能===");
            Account acc = new Account();
            
            // 姓名输入
            System.out.print("请输入姓名:");
            acc.setName(scanner.next());
            
            // 性别校验
            while (true) {
                System.out.print("请输入性别(男/女):");
                char gender = scanner.next().charAt(0);
                if (gender == '男' || gender == '女') {
                    acc.setSex(gender);
                    break;
                }
                System.out.println("输入错误,请重新输入!");
            }
            
            // 密码校验
            while (true) {
                System.out.print("设置密码:");
                String pw = scanner.next();
                System.out.print("确认密码:");
                if (pw.equals(scanner.next())) {
                    acc.setPassWord(pw);
                    break;
                }
                System.out.println("两次密码不一致!");
            }
            
            // 设置限额
            System.out.print("设置单笔取现限额:");
            acc.setLimit(scanner.nextDouble());
            
            // 生成唯一卡号
            acc.setNum(generateCardNumber());
            
            accounts.add(acc);
            System.out.println("开户成功!卡号:" + acc.getNum());
        }
    
        // 登录功能完整实现
        private void login() {
            System.out.println("\n===登录功能===");
            if (accounts.isEmpty()) {
                System.out.println("系统暂无账户!");
                return;
            }
            
            Account acc;
            while (true) {
                System.out.print("输入卡号:");
                String cardNum = scanner.next();
                if ((acc = getAccount(cardNum)) != null) break;
                System.out.println("卡号不存在!");
            }
            
            while (true) {
                System.out.print("输入密码:");
                if (scanner.next().equals(acc.getPassWord())) {
                    loginUser = acc;
                    System.out.println("欢迎," + acc.getName());
                    showUserMenu();
                    return;
                }
                System.out.println("密码错误!");
            }
        }
    
        // 用户菜单完整实现
        private void showUserMenu() {
            while (true) {
                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.println("7. 注销账户");
                System.out.print("请选择:");
                
                switch (scanner.nextInt()) {
                    case 1: showBalance(); break;
                    case 2: deposit(); break;
                    case 3: withdraw(); break;
                    case 4: transfer(); break;
                    case 5: changePassword(); break;
                    case 6: logout(); return;
                    case 7: deleteAccount(); return;
                    default: System.out.println("无效输入!");
                }
            }
        }
    
        // 转账功能完整实现示例
        private void transfer() {
            System.out.println("\n===转账功能===");
            if (accounts.size() < 2) {
                System.out.println("系统账户不足,无法转账!");
                return;
            }
            
            Account targetAcc;
            while (true) {
                System.out.print("输入对方卡号:");
                String cardNum = scanner.next();
                if ((targetAcc = getAccount(cardNum)) != null) break;
                System.out.println("卡号不存在!");
            }
            
            // 验证姓氏
            System.out.print("验证您的姓氏:");
            if (!scanner.next().equals(loginUser.getName().substring(0, 1))) {
                System.out.println("验证失败!");
                return;
            }
            
            // 转账金额处理
            System.out.print("输入转账金额:");
            double amount = scanner.nextDouble();
            if (amount > loginUser.getMoney()) {
                System.out.println("余额不足!");
            } else if (amount > loginUser.getLimit()) {
                System.out.println("超过单笔限额!");
            } else {
                loginUser.setMoney(loginUser.getMoney() - amount);
                targetAcc.setMoney(targetAcc.getMoney() + amount);
                System.out.println("转账成功!当前余额:" + loginUser.getMoney());
            }
        }
    
        // 其他方法实现(篇幅限制部分展示)
        private String generateCardNumber() {
            Random rand = new Random();
            String cardNum;
            do {
                cardNum = String.format("%08d", rand.nextInt(100000000));
            } while (getAccount(cardNum) != null);
            return cardNum;
        }
        
        private Account getAccount(String cardNum) {
            for (Account acc : accounts) {
                if (acc.getNum().equals(cardNum)) return acc;
            }
            return null;
        }
        
        // 其他功能方法(存款、取款等)...
    }

    3. 启动类(test.java)

    public class test {
        public static void main(String[] args) {
            ATM atm = new ATM();
            atm.start();
        }
    }

    三、代码解析

    1. 实体类设计

    Account类使用封装原则:

  3. 所有字段private

  4. 通过Getter/Setter访问

  5. 业务逻辑方法(如带称谓的getName())

  6. ArrayList<Account> 存储账户

  7. Scanner处理用户输入

  8. 状态管理(loginUser)

  9. 运行效果

    ===欢迎使用ATM系统===
    1. 用户登录
    2. 用户开户
    请选择:2
    
    ===开户功能===
    请输入姓名:张三
    请输入性别(男/女):男
    设置密码:123456
    确认密码:123456
    设置单笔取现限额:2000
    开户成功!卡号:67453921

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值