设计并实现一个小型银行系统,使用Java面向对象编程技术

news2024/11/26 20:37:00

在某个社交平台上刷到了,大学生的一个小练习,关于编写一个小的银行案例,下面具体分享一下代码,希望大佬多来指正,我们互相学习。
在这里插入图片描述
基本要求:类设计:Account类: 包含账户ID、余额、账户类型等属性,以及存款、取款、转账方法。Customer类:包含客户信息,如姓名、ID和其Account列表。Bank类: 管理所有Customer,包括添加客户、开设账户、关闭账户、处理交易等。
功能实现:
实现多种账户类型(如储蓄账户、支票账户),它们继承自Account类,但具有不同的服务费(存款和取款都会收取服务费)实现基础的交易处理功能,如转账、存款、取款。
实现交易历史记录功能,记录客户的所有交易。
实现简单的利息计算功能,定期更新账户余额。
添加数据持久化功能,如将客户和账户信息保存到文件。
数据存储:
使用集合类(如ArrayList)存储系统中的客户和账户信息
异常处理:
添加适当的异常处理,例如在处理交易时检查余额不足或输入错误。测试类:
创建一个测试类,演示银行系统的各种功能。

首先看一下目录结构

在这里插入图片描述
Account.java

package com.account;

/**
 * @program: BnakDemo
 * @description:
 * @author: Casey Hu
 * @create: 2023-11-26 13:58
 **/

public class Account {
    //账户ID
    String accountId = null;

    //账户余额(单位 元 )
    Double accountBalance = 0.00;

    //账户类型属性
    String accountType = null;

    //账户状态 true是打开,false是关闭
    boolean accountStatu = false;

    public Account(String accountId,String accountType) {
        this.accountId=accountId;
        this.accountType=accountType;
        this.accountStatu=true;
    }
    //存款
    public Double deposit(Double money){
        if(money>0){
            accountBalance=accountBalance+money;
        }
        return accountBalance;
    }

    //取款
    public Double withdraw(Double money){
        if(money>0){
            if(money<accountBalance){
                accountBalance=accountBalance-money;
            }else {
                new Exception("取款金额不得超过当前账户余额!");
            }
        }
        return accountBalance;
    }

    //转账
    public void transfer(Account account, Double money){
        Double balance = account.getAccountBalance();
        if(money>0){
            if(money<accountBalance){
                balance=balance +money;
                accountBalance=accountBalance-money;
            }else {
                new Exception("转账金额不得超过当前账户余额!");
            }
        }
        account.setAccountBalance(balance);
        System.out.println("向账户"+account.getAccountId()+"转账"+money+" 成功!");
    }

    public String getAccountId() {
        return accountId;
    }

    public void setAccountId(String accountId) {
        this.accountId = accountId;
    }

    public Double getAccountBalance() {
        return accountBalance;
    }

    public void setAccountBalance(Double accountBalance) {
        this.accountBalance = accountBalance;
    }

    public String getAccountType() {
        return accountType;
    }

    public void setAccountType(String accountType) {
        this.accountType = accountType;
    }

    public void settlementInterest() {
    }
}

saveAccount.java

package com.account;

/**
 * @program: BnakDemo
 * @description: 储蓄账户
 * @author: Casey Hu
 * @create: 2023-11-26 14:17
 **/

public class saveAccount extends Account {

    Double commission=0.001;

    public saveAccount(String saveAccountId) {
        super(saveAccountId, "save");
    }

    //重写存款方法
    @Override
    public Double deposit(Double money){
        if(money>0){
            money=money-money*commission; //扣除手续费
        }else {
            money=0.00; //金额异常 不进行操作
        }
        return super.deposit(money);
    }
    //重写取款方法
    @Override
    public Double withdraw(Double money) {
        if(money>0&&accountBalance>0){
            if (accountBalance-(money*commission)>0) {
                money=money+money*commission; //扣除手续费
            }else {
                money=0.00; //金额异常 不进行操作
            }
        }else {
            money=0.00; //金额异常 不进行操作
        }
        return super.withdraw(money);
    }
    //重写转账方法
    @Override
    public void transfer(Account account, Double money) {
        super.transfer(account, money);
    }

    //结算利息 按年利率算的
    public void settlementInterest(){
        accountBalance=accountBalance+accountBalance*0.011;
    }
}

checkAccount.java

package com.account;

/**
 * @program: BnakDemo
 * @description: 支票账户
 * @author: Casey Hu
 * @create: 2023-11-26 14:37
 **/

public class checkAccount extends Account{
    Double commission=0.002;

    public checkAccount(String accountId) {
        super(accountId, "check");
    }
    //重写存款方法
    @Override
    public Double deposit(Double money){
        if(money>0){
            money=money-money*commission; //扣除手续费
        }else {
            money=0.00; //金额异常 不进行操作
        }
        return super.deposit(money);
    }
    //重写取款方法
    @Override
    public Double withdraw(Double money) {
        if(money>0&&accountBalance>0){
            if (accountBalance-(money*commission)>0) {
                money=money+money*commission; //扣除手续费
            }else {
                money=0.00; //金额异常 不进行操作
            }
        }else {
            money=0.00; //金额异常 不进行操作
        }
        return super.withdraw(money);
    }
    //重写转账方法
    @Override
    public void transfer(Account account, Double money) {
        super.transfer(account, money);
    }
    //结算利息 按年利率算的
    public void settlementInterest(){
        accountBalance=accountBalance+accountBalance*0.021;
    }
}

Customer.java

package com.customer;

import com.account.Account;

import java.util.ArrayList;
import java.util.List;

/**
 * @program: BnakDemo
 * @description: 客户
 * @author: Casey Hu
 * @create: 2023-11-26 14:39
 **/

public class Customer {

    //客户ID
    private String customerId;

    //客户姓名
    private String customerName;

    //账户列表
    private List<Account> accountList=new ArrayList<>();

    //交易历史
    private List<String> tranHistory=new ArrayList<>();

    public String getCustomerId() {
        return customerId;
    }

    public void setCustomerId(String customerId) {
        this.customerId = customerId;
    }

    public String getCustomerName() {
        return customerName;
    }

    public void setCustomerName(String customerName) {
        this.customerName = customerName;
    }

    public List<Account> getAccountList() {
        return accountList;
    }

    public void setAccountList(List<Account> accountList) {
        this.accountList = accountList;
    }

    public List<String> getTranHistory() {
        return tranHistory;
    }

    public void setTranHistory(List<String> tranHistory) {
        this.tranHistory = tranHistory;
    }
}

Bank.java

package com.bank;


import com.account.checkAccount;
import com.account.saveAccount;
import com.customer.Customer;

import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Random;

/**
 * @program: BnakDemo
 * @description: 银行
 * @author: Casey Hu
 * @create: 2023-11-26 15:01
 **/

public class Bank {
    private List<Customer> customer;

    public void addCustomer(Customer customer){
        this.customer.add(customer);
    }

    public void addAccount(Customer customer, String accountType){
        String accountId=getAccountId();
        if("check".equals(accountType)){
            customer.getAccountList().add(new checkAccount(accountId)); //如果开账户为 支票
        }else{
            customer.getAccountList().add(new saveAccount(accountId));
        }
    }

    public String getAccountId(){
        Random random = new Random();
        String number = "";
        for (int i = 0; i < 10; i++) {
            number += random.nextInt(10);
        }
        return number;
    }

    //数据持久化功能
    public void makeNoRealFile(Customer customer) {
        try {
            Date date = new Date(); // 获取当前日期
            SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd"); // 定义日期格式
            String formattedDate = formatter.format(date); // 将日期格式化为指定格式
            String filename = "bank_" +formattedDate+ ".txt";
            String filePath = "E:\\BnakDemo\\BnakDemo\\src\\main\\resources\\" + filename; // 资源文件路径
            StringBuffer result= new StringBuffer();

            result.append(customer.getCustomerName()+"^");
            for (int i=0;i<customer.getAccountList().size();i++){
                result.append(customer.getAccountList().get(i).getAccountId()+"|");
                result.append(customer.getAccountList().get(i).getAccountType()+"|");
                result.append(customer.getAccountList().get(i).getAccountBalance()+"|");
            }
            result.append(customer.getCustomerId()+"^");
            for (int j=0;j<customer.getTranHistory().size();j++){
                result.append(customer.getTranHistory().get(j)+"|");
            }
            File file = new File(filePath);
            file.createNewFile();
            OutputStreamWriter write = new OutputStreamWriter(new FileOutputStream(file), "UTF-8");
            BufferedWriter bw = new BufferedWriter(write);
            bw.write(result.toString());
            bw.close();
            System.out.println("文件内容:"+result);
            System.out.println("文件保存成功!");
        }catch (Exception e){
         e.printStackTrace();
        }
    }
}

BankTest.java

import com.account.Account;
import com.bank.Bank;
import com.customer.Customer;

import java.util.ArrayList;
import java.util.List;

/**
 * @program: BnakDemo
 * @description:
 * @author: Casey Hu
 * @create: 2023-11-26 16:27
 **/
public class BankTest {
    public static void main(String[] args) {
        List<String> tranHistory=new ArrayList<>();
        //第一步先 创建一个客户对象
        Customer customer = new Customer();
        customer.setCustomerId("110101198001010053"); //给客户id
        customer.setCustomerName("Casey Hu");
        //第二步 创建一个银行对象
        Bank bank=new Bank();
        bank.addAccount(customer,"save");//这个用户创建了一个储蓄账户
        Account account1 = customer.getAccountList().get(0);
        //第二步 开始存钱
        account1.deposit(10000.00); //存入1万元
        System.out.println(account1.getAccountBalance());
        tranHistory.add("存入10000.00");
        //第三步 开始取钱
        account1.withdraw(5000.00);//取出5千元
        System.out.println(account1.getAccountBalance());//还剩多少钱
        tranHistory.add("取出5000.00");
        //第四步 转账
        bank.addAccount(customer,"check");//这个用户创建了一个储蓄账户
        Account account2 = customer.getAccountList().get(1);
        account1.transfer(account2,3000.00);
        System.out.println("账户"+account1.getAccountId()+"余额:"+account1.getAccountBalance());
        System.out.println("账户"+account2.getAccountId()+"余额:"+account2.getAccountBalance());
        tranHistory.add("账户"+account1.getAccountId()+"向账户"+account2.getAccountId()+"转账3000.00");
        //第五步 结算利息
        account1.settlementInterest();
        account2.settlementInterest();
        System.out.println("账户"+account1.getAccountId()+"余额:"+account1.getAccountBalance());
        System.out.println("账户"+account2.getAccountId()+"余额:"+account2.getAccountBalance());
        tranHistory.add("账户"+account1.getAccountId()+"结算利息");
        tranHistory.add("账户"+account2.getAccountId()+"结算利息");
        customer.setTranHistory(tranHistory);
        //数据持久化
        bank.makeNoRealFile(customer);

    }
}

要源码的私信我,或者加我微信,打包发你。其实以上复制下来就是源码了

祝您万事顺心,没事点个赞呗,关注一下也行啊,有啥要求您评论哈

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1257501.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【开源】基于JAVA的天然气工程业务管理系统

项目编号&#xff1a; S 021 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S021&#xff0c;文末获取源码。} 项目编号&#xff1a;S021&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、使用角色3.1 施工人员3.2 管理员 四…

超声波清洗机可以干嘛、比较推荐的超声波清洗机

超声波清洗机是一种神奇的家用电器&#xff0c;它可以通过高频振动将物体表面的污渍和细菌清洗干净。可以把眼镜放在超声波清洗机里&#xff0c;只需几分钟&#xff0c;就可以将眼镜上的污渍和细菌清洗得干干净净&#xff0c;不单可以清洗眼镜&#xff0c;像生活中的一些小物件…

安全风险综合监测预警平台建设指南(2023 版)》正式发布,汉威科技方案领跑行业

11月24日&#xff0c;国务院安委会办公室印发《城市安全风险综合监测预警平台建设指南&#xff08;2023版&#xff09;》&#xff08;以下简称“指南”&#xff09;&#xff0c;引发行业密切关注。 据悉&#xff0c;“指南”在总结前期18 个试点城市&#xff08;区&#xff09;…

idea 快速选择类文件内的方法名或全局变量

IDEA快速生成lambda表达式的方法-CSDN博客 上面这个链接的标题可能不对

Spring框架体系及Spring IOC思想

目录 Spring简介Spring体系结构SpringIOC控制反转思想自定义对象容器Spring实现IOCSpring容器类型容器接口容器实现类对象的创建方式使用构造方法使用工厂类的方法使用工厂类的静态方法对象的创建策略对象的销毁时机生命周期方法获取Bean对象的方式通过id/name获取通过类型获取…

activiti工作流 定义 TaskListener 无效

使用activiti 5.22 想全局定义任务监听器&#xff0c;结果试了多次发现没有效果。 最后看了看activiti的相关源码发现&#xff0c;流程定义里边没有处理 TaskListener 相关的操作&#xff0c;发现TaskListener 处理是在Task里边处理的&#xff0c;所以把TaskListener 定义在Ta…

vue.js如何根据后台返回来的图片url进行图片下载

原创/朱季谦 最近在做一个前端vue.js对接的功能模块时&#xff0c;需要实现一个下载图片的功能&#xff0c;后台返回来的是一串图片url&#xff0c;试了很多种方法&#xff0c;发现点击下载时出来的效果&#xff0c;都是跳到一个新的图片网页&#xff0c;后来经过一番琢磨&…

在vue页面中添加组件到底有多方便

修改vue写的前端页面到底有多方便&#xff1f;如果熟练的话&#xff0c;出乎你想象的快。 原来的页面&#xff1a;/admin/stock 原来的文件地址&#xff1a;src\views\admin\stock\Stock.vue 另一个页面有个入库功能&#xff0c;需要转移到上面的页面中&#xff1a; 路径&…

01-AI大模型智能客服 V0.1「上」

你好&#xff0c;我是悦创。 首发&#xff1a;https://mp.weixin.qq.com/s/6MTkpWZCEbFWOcUn0Vexvw V0.1 版本我将分为上中下三篇进行书写和发布&#xff0c;欢迎分享和我微信进讨论群&#xff1a;Jiabcdefh。 计划&#xff1a; 会迭代好几个版本&#xff0c;看阅读量和点赞…

A100 A800 H100 H800 模块

老美对A100、A800、H100和H800在内的多款AI芯片实施了出口限制&#xff0c; 目前&#xff0c;具体限制的时长并没有明确的公开信息。 科研人员在面对此类限制 &#xff0c;可能需要寻找替代的供应渠道&#xff0c;加强国内外合作&#xff0c; 或者加大在本土技术研发的投入&a…

数据结构 | 堆排序

数据结构 | 堆排序 文章目录 数据结构 | 堆排序建立大堆排序结果以及全部代码 如果没有看过堆的实现的话可以先看前面的一章堆的实现&#xff0c;然后再来看这个堆排序&#xff0c;都是比较简单的~~ 这里堆排序首先建堆&#xff0c;建堆是要建小堆还是大堆呢&#xff1f; 在堆排…

cpp中虚实继承问题

1.一个基类base&#xff0c;被类a虚继承&#xff0c;类a被其他的类继续继承&#xff0c;那么base中的初始化必须由派生类的最后一个完成&#xff0c;其中任意一个都不能代替完成基类&#xff0c;如果在最后一个派生类里不进行这个base的初始化&#xff0c;那么就会调用相应的无…

Vatee万腾的数字探险之旅:vatee科技创新的新纪元

在数字时代的潮流中&#xff0c;Vatee万腾以其独特的数字探险之旅引领着科技创新的新纪元。这不仅是一次技术的进步&#xff0c;更是一场数字领域的探险&#xff0c;让我们一同探索Vatee在科技创新中的前沿地带。 Vatee万腾的数字探险起源于对未知的渴望和对创新的不懈追求。在…

新购服务器项目部署指南—— Express + Vue + Nginx+ pm2 Nodejs项目部署全流程

目录 一、部署Express项目1.1、安装Node1.2、安装pm2进程管理器1.3、部署Express后端项目 二、部署Vue前端项目2.1、Nginx的下载安装与SLL配置2.2、打包Vue项目2.3、上传项目到Nginx目录2.4、配置Nginx 附录pm2命令速览Nginx命令速览 最后 书接上回&#xff1a;新购服务器开荒记…

不幸被封号!后续来了...

之前发文说过&#xff0c;视频号“技术领导力”被封号3天&#xff0c;无法直播了&#xff1b;购物车被禁用7天。经过多渠道申诉、跟官方沟通均无效。 对事件不了解的可以看这里《被封号了~》&#xff0c;简单来说就是转播了某位大V的直播&#xff0c;因为某些说不清道不明的原因…

快速了解软件工程学概述(5种软件过程模型)

目录 1 、什么是软件&#xff1f;特点有哪些 &#xff1f; 2 、 软件危机 定义&#xff1a; 软件危机产生的原因 消除软件危机的方法 3 、软件工程 1.软件工程的介绍 &#xff08;1&#xff09;概念 &#xff08;2&#xff09;本质特征 (3)软件工程方法学&#xff08;方…

什么样的CRM系统更值得使用?

CRM系统发展到了2023年&#xff0c;经过了无数次迭代与更新&#xff0c;各种概念开始层出不穷。当您的企业准备实施一套CRM系统&#xff0c;在选型前有个问题需要思考&#xff1a;您到底需要什么样的CRM系统&#xff1f; CRM系统早已经从当初的管理客户关系变为了“十项全能”—…

死磕MybatisPlus系列:Mapper的奇妙之旅

Mybatis Plus源码解析系列篇之Mapper的奇妙之旅 一、MybatisPlus初体验 MybatisPlus是一个基于mybatis的开源orm框架&#xff0c;其内置的Mapper、Service让开发者仅需简单的配置&#xff0c;就能获得强大的CRUD能力&#xff1b;其强大的条件构造器&#xff0c;可以满足各类需…

Walrus 0.4发布:单一配置、多态运行,体验下一代应用交付模型

今天&#xff0c;我们高兴地宣布云原生统一应用平台 Walrus 0.4 正式发布&#xff0c;这是一个里程碑式的版本更新。新版本采用了全新的应用模型——仅需进行单一配置&#xff0c;即可在多种模态的基础设施及环境中运行包括应用服务及周边依赖资源在内的完整应用系统。“You bu…