版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、BAM 银行账户管理系统 ATM 管理系统 本系统采用 JAVA 语言并在 eclipse 环境下编写测试完成, 涉及类的概念, 以及面向对象 的几大特性继承,封装,多态,抽象 ,也有异常处理机制,采用集合更好存储账户 数据,根本可以满足大多数 BAM 系统的相关实现,且代码标注大量注释,读者可以很轻松 地理解相关逻辑,大家可以开心参考。系统简介:特点:采用窗口界面风格,而不是传统的命令行、控制台运作模式1、JAVA 类的面相对象的应用,拥有异常处理机制,不会因为输入错误而导致程序崩 溃2、主要有7个类,即Account账户类SaveAccount储蓄账户类:不能透支CreditAccount
2、信用账户类:可以透支Bank银行类ATMOpenAccountFrame开户窗口页面ATMLoginFrame登录窗口页面ATMMainFrame操作窗口页面带有完善的相关信息提示弹出窗口见下面截图类的具体属性级行为见代码3、各个类之间的相互关系,涉及继承、封装、多态、抽象,在多态中又涉及重载和重 写,请读者注意相关联系关注注释4、可以实现数据保存功能,数据将保存在文件中即当你注册了一个账户,下次再登 陆系统时,可以实现与上次最后的操作相衔接5、账户号自动生成,比拟符合现实6、主要功能有: 1.开户查询账户余额存款取款5转账一个账户到另一个账户等7、运行时界面简示初始界面账户登录账户登录后界面
3、相关信息提示一览只列举一局部1、查询: 2、存款:3、取款:4、转账:4、用户开户界面:考前须知:1、 本系统采用的编程环境是 JDK1.7, jer7。所以,运行代码需要保持电脑上所装的 JDK 为1.7以上版本,如有报错,只需换个高一点的版本即可。注意:第一次装JDK,要配置环 境变量请查阅相关资料,比拟简单2、本系统代码涉及到包,所以如果报名不一致就会报错,解决法:修改一下包名即可3、 建议把各个类写在同一个包下面,且每一个类单独写一个java 文件,如下列图:4、 在运行程序前,需要在工程下面新建一个account.txt用来保存数据文件如上图, 并在其中写入至少一个账户信息, 如下列
4、图,其中每项代表的意思,请读者参照代码的注 释,否那么在初始化的时候会因为找不到账户信息,从而产生异常。系统源码:Account 类package .qx;import javax.swing.JOptionPane;/* 账户类 :包含两种账户类型 -1. 储蓄账户 2.信用账户*/public abstract class Account / 属性protected long id;protected String password;protected String name;protected String personId;protected String accountType;pr
5、otected double balance;/ 构造法public Account()super();public Account(long id, String password, String name, String personId,String type,double balance) super();this.id = id;this.password = password; = name;this.personId = personId;this.accountType = type; this.balance = balance;/get*x,set*x 法
6、 public long getId() return id;public void setId(long id) this.id = id;public String getPassword() return password;public void setPassword(String password) this.password = password;public String getName() return name;public void setName(String name) = name;public String getPersonId() retur
7、n personId;public void setPersonId(String personId) this.personId = personId;public String getAccountType() return accountType;public void setAccountType(String accountType) this.accountType = accountType;public double getBalance() return balance;public void setBalance(double balance) this.balance =
8、 balance;/* 存款*/public void deposit(double money) balance += money;Account 类应设为抽象类/* 取款取款式由账户类型决定,所以设为抽象法,相应的*/public abstract void withdraw(double money);Savin gAcco un类package .qx;import javax.swing.JOptionPane;/* 储蓄账户类*/public class SavingAccount extends Account / 构造函数public SavingAccount() super
9、();public SavingAccount(long id, String password, String name,String personId,String accountType, double balance) super(id, password, name, personId, accountType, balance);/对父类的withdraw。实现public void withdraw(double money)if(balance money)/*System.out.println( 对不起,账户余额缺乏! );*/JOptionPane.showMessage
10、Dialog(null, 对不起,账户余额缺乏! 信息提示 ,JOptionPane.ERROR_MESSAGE);elsebalance -= money;CresitAcco unt 类package .qx;import javax.swing.JOptionPane;/*信用账户类,增加一个信用额度ceiling属性*/public class CreditAccount extends Account private int ceiling;/ 构造函数public CreditAccount()super();public CreditAccount(long id, String
11、 password, String name,String personId,String accountType, double balance, int ceiling) super(id, password, name, personId, accountType, balance); this.ceiling = ceiling;/get*x,set*x 法public int getCeiling() return ceiling;public void setCeiling(int ceiling) this.ceiling = ceiling;/ 实现父类的 withdraw()
12、public void withdraw(double money)if(balance + ceiling) money)/*System.out.println( 对不起,已超出您的信用额度! );*/JOptionPane.showMessageDialog(null, 对不起,已超出您的信用额度! 信息提示 ,JOptionPane.ERROR_MESSAGE);elsebalance -= money;Bank 类package .qx;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io
13、.File;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;import java.util.ArrayList;import java.util.Iterator;import java.util.List;import java.util.Properties;import javax.swing.JOptionPane;* Bank 类* 编写 Bank 类 ,属性 :1.当前所有的账户对象的集合,存放在数
14、组中2.当前账户数量法:1用户开户,需要的参数:id,密码,密码确认,*,*,账户类型,返回新创立的Account对象的账号, 提示:用 s1.equals(s2)可以比拟s1,s2两个字符串的值是否相等账户类型是一个整数,为0 的时候表示储蓄账户,为 1 的时候表示信用账户2用户登录,参数:id,密码返回登录账户的账号3用户存款,参数:id,存款数额,返回void4用户取款,参数:id,取款数额,返回void5查询余额,参数:id,返回该账户的余额double用户会通过调用Bank对象以上的法来操作自己的账户,请分析各个法需要的参数*/public class Bank /*private
15、Account accounts = new Account20;*/private List accountsList;private int number;/ 账户数目private int id = 1001;/ 确定银行账号从 1001 开场生成,即第一个账户的账号是 1001/ 构造函数public Bank() accountsList=new ArrayList(); number = 0;BufferedReader bufReader = null;Properties props=System.getProperties();String path=props.getPro
16、perty(user.dir);try bufReader=new BufferedReader(new FileReader(new File(path,account.txt);String s = bufReader.readLine();while(s != null)String str = s.split(,);if(str4.equals(0)Account savingAcc = new SavingAccount(Long.parseLong(str0), str1.toString(), str2.toString(), str3.toString(),str4.toStr
17、ing(), Double.parseDouble(str5);accountsList.add(savingAcc);elseAccount creditAcc = new CreditAccount(Long.parseLong(str0), str1.toString(), str2.toString(), str3.toString(),str4.toString(),Double.parseDouble(str5),5000); accountsList.add(creditAcc);number +;id+;s = bufReader.readLine(); catch (Numb
18、erFormatException e) / TODO Auto-generated catch block e.printStackTrace(); catch (FileNotFoundException e) / TODO Auto-generated catch blocke.printStackTrace(); catch (IOException e) / TODO Auto-generated catch blocke.printStackTrace();finallytry if(bufReader != null)bufReader.close(); catch (IOExc
19、eption e) / TODO Auto-generated catch block e.printStackTrace();/get*x,set*xpublic List getAccounts() return accountsList;public void setAccounts(List accounts) this.accountsList = accounts;public int getNumber() return number;public void setNumber(int number) this.number = number;public int getId()
20、 return id;public void setId(int id) this.id = id;/* 开户*/public Account openAccount(String passwd1, String passwd2, String name,String personId, String type)/ 创立一个新账户Account account = null;/ 判断两次密码是否一致 if(passwd1.equals(passwd2)/ 假设一致,再判断账户类型根据 type 的值 if(type.equals(1)/ 可令开场余额为 10,信用额度为 5000account
21、 = new CreditAccount(id, passwd1, name, personId, type, 10, 5000);elseaccount = new SavingAccount(id, passwd1, name, personId, type, 10);/ 将账户存入账户集合 accountsList 中 accountsList.add(account);JOptionPane.showMessageDialog(null, 开户成功! , 信息提示 , JOptionPane.INFORMATION_MESSAGE);JOptionPane.showMessageDia
22、log(null, 您的卡号为: +id+n+ 您的密码为: +passwd1+n+ 您的户名为: +name+n+ 您的 * 号为: +personId+n+ 您的账户类型为: +type+n, 信息提示 ,JOptionPane.INFORMATION_MESSAGE);account.accountType = type;number+;id+;return account;/ 此时开户成功else JOptionPane.showMessageDialog(null, 对不起! 您两次密码输入不匹配, 开户失 败! , 信息提示 ,JOptionPane.ERROR_MESSAGE);
23、return null;/ 此时开户失败 * 保存数据*/public void saveAccountDate()BufferedWriter bufWriter=null;try Properties props=System.getProperties();String path=props.getProperty(user.dir);String s = null;bufWriter=new BufferedWriter(new FileWriter(new File(path,account.txt); for(Iterator iterator = accountsList.ite
24、rator();iterator.hasNext();) / 假设存在账户Account acc = (Account) iterator.next();/ 写入账户信息到 account.txtbufWriter.write(acc.id+,); bufWriter.write(acc.getPassword()+,); bufWriter.write(acc.getName()+,); bufWriter.write(acc.getPersonId()+,); bufWriter.write(acc.getAccountType()+,); bufWriter.write(Double.t
25、oString(acc.getBalance(); bufWriter.newLine();bufWriter.flush();/ 清空缓存中的容 catch (IOException e) / TODO Auto-generated catch blocke.printStackTrace();finallytry if(bufWriter!=null)bufWriter.close(); catch (IOException e) / TODO Auto-generated catch blocke.printStackTrace();/* 登录验证*/public Account ver
26、ifyAccount(long id, String password)Account account = null;Account acc = null;for(Iterator iterator = accountsList.iterator(); iterator.hasNext();) / 假设存在账户acc = (Account) iterator.next(); if (acc != null) if (id = acc.getId() & password.equals(acc.getPassword() account = acc;break; elsebreak;return
27、 account;/*转账验证法的重载*/public Account verifyAccount(long id) Account account = null; Account acc = null;for(Iterator iterator = accountsList.iterator(); iterator.hasNext();) / 假设存在账户acc = (Account) iterator.next();if (acc != null) if (id = acc.getId() account = acc; break; elsebreak;return account;/*转
28、账*/public void transferAccount(Account account1, Account account2, double money) account1.withdraw(money);account2.deposit(money);/* 存款*/public void deposit(Account account, double money) account.deposit(money);/* 取款*/public void withdraw(Account account, double money) account.withdraw(money);ATMLog
29、inFrame 类package .qx;import java.awt.Dimension;import java.awt.GridLayout;import java.awt.Toolkit;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.utton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JOptionPane;import javax.swing.JPan
30、el;import javax.swing.JTextField;public class ATMLoginFrame extends JFrameprivate JLabel lCardNo,lPasswd;private JTextField jtfCardNo,jtfPasswd;private utton Ok,Cancel,OpenAccount;private JPanel jp1,jp2,jp3,jp4;private Bank bank;public ATMLoginFrame()bank=new Bank();/ 实例化所有组件 lCardNo=new JLabel( 用户名
31、 :);IPasswd=new JLabel(密码:”);jtfCardNo=new JTextField(20);jtfPasswd=new JTextField(20);Ok=new utton( 确定 );Cancel=new utto n ( 取消 );OpenAccount=new utton( 没有账户,开户 ); jp1=new JPanel(); jp2=new JPanel();jp3=new JPanel();jp4=new JPanel();jp1.add(lCardNo);jp1.add(jtfCardNo);jp2.add(lPasswd);jp2.add(jtfPa
32、sswd);jp3.add(Ok);jp3.add(Cancel);jp4.add(OpenAccount);/ 将每行逐行添加到 frame 中this.add(jp1);this.add(jp2);this.add(jp3);this.add(jp4);this.setLayout(new GridLayout(4, 1);/ 取消默认管理器 ,设置为 3 行 1 列的网格布局Dimension d=Toolkit.getDefaultToolkit().getScreenSize();this.setTitle(”登陆界面”);this.setBounds(d.width-300)/2,
33、 (d.height-200)/2, 300, 200);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);/ 设置关闭窗口时 JVM 同 时推出this.pack();/ 调整窗口至能容纳组件的最小尺寸this.setVisible(true);/ 设置窗口可见 this.setResizable(false);/不能最大化/ 使用匿名部类给 2 个按钮注册监听器Cancel.addActionListener(new ActionListener()public void actionPerformed(ActionEvent e) d
34、ispose。;/ 关闭窗口);Ok.addActionListener(new ActionListener()public void actionPerformed(ActionEvent e) / 取出用户界面输入的用户名和密码long cardNo=Integer.parseInt(jtfCardNo.getText();String passwd=jtfPasswd.getText();/ 调用 Bank 的相关法将二者与正确的做比对Account account=bank.verifyAccount(cardNo, passwd);if(account!=null)/ 假设正确 ,
35、进入操作界面ATMMainFrame mainFrame=new ATMMainFrame(bank,account);/ 进入操作界面dispose();/关闭登陆界面else/ 假设错误 ,使用对话框提示错误信息JOptionPane.showMessageDialog(null, 卡号或密码错误 , 信息提 示 ”,JOptio nPa ne.ERROR_MESSAGE););OpenAccount.addActionListener(new ActionListener() public void actionPerformed(ActionEvent arg0) ATMOpenAcc
36、ountFrame openFram=new ATMOpenAccountFrame();dispose();/ 关闭登陆界面);/* param args*/ public static void main(String args) ATMLoginFrame atm=new ATMLoginFrame();ATMMai nFrame 类package .qx;import java.awt.Dimension; import java.awt.FlowLayout;import java.awt.GridLayout;import java.awt.Toolkit;import java.
37、awt.event.ActionEvent;import java.awt.event.ActionListener;import java.util.Scanner;import javax.swing.utton;import javax.swing.JFrame;import javax.swing.JLabel; import javax.swing.JOptionPane;import javax.swing.JPanel;public class ATMMainFrame extends JFrame private Account account; private Bank ba
38、nk;private utton Deposit,Withdraw,Cancel,Query,Transfer; private JLabel lMsg,lName;private JPanel jp1,jp2,jp3,jp4;* param args*/public ATMMainFrame(final Bank bank,Account tmpA) this.account=tmpA;this.bank=bank;Query=new utton( 查询 ); Deposit=new utton( 存款 ); Withdraw=new utton( 取款 ); Transfer=new ut
39、ton( 转账 );Cancel=new utton(”退卡”);IName=new JLabel(账户 *: +account.getName();lMsg=new JLabel(); jp1=new JPanel(); jp2=new JPanel(); jp3=new JPanel(); jp4=new JPanel();jp1.add(Query); jp1.add(Deposit);jp2.add(Withdraw); jp2.add(Transfer);jp3.add(Cancel);jp4.add(lName);jp4.add(lMsg);/ 将每行逐行添加到 frame 中 t
40、his.add(jp1);this.add(jp2);this.add(jp3);this.add(jp4);this.setLayout(new GridLayout(4, 1);/ 取消默认管理器 ,设置为 4行 1列的网格布局Dimension d=Toolkit.getDefaultToolkit().getScreenSize(); this.setTitle(”操作界面);this.setBounds(d.width-300)/2, (d.height-200)/2, 300, 200); this.setDefaultCloseOperation(JFrame.EXIT_ON_C
41、LOSE);/ 设置关闭窗口时 JVM 同 时推出/this.pack();/ 调整窗口至能容纳组件的最小尺寸this.setVisible(true);/ 设置窗口可见 this.setResizable(false);/ 使用匿名部类给查询按钮注册监听器Query.addActionListener(new ActionListener() public void actionPerformed(ActionEvent e) JOptionPane.showMessageDialog(null, 您 账 户 的 当 前 余 额 为:+acco un t.getBala nce(). 信息提
42、示 ,JOptionPane.INFORMATION_MESSAGE););/ 给存款按钮注册监听器Deposit.addActionListener(new ActionListener() public void actionPerformed(ActionEvent arg0) String s= JOptionPane.showInputDialog( 请输入存款金额 :);double money=Double.parseDouble(s.equals()0:s); bank.deposit(account, money);JOptionPane.showMessageDialog(
43、null, 存款成功! , 信息提示 ,JOptionPane.INFORMATION_MESSAGE);IName=new JLabel(账户 *: +account.getName();IMsg.setText(”余额:+account.getBalance(););/ 给取款按钮注册监听器Withdraw.addActionListener(new ActionListener() public void actionPerformed(ActionEvent arg0) String s= JOptionPane.showInputDialog( 请输入取款金额 :);double m
44、oney=Double.parseDouble(s.equals()0:s); bank.withdraw(account, money);/*JOptionPane.showMessageDialog(null, 取款成功! ,信息提示 ,JOptionPane.INFORMATION_MESSAGE);*/lName=new JLabel(账户 *: +account.getName();IMsg.setText(”余额:+account.getBalance(););/ 给转账按钮注册监听器Transfer.addActionListener(new ActionListener() p
45、ublic void actionPerformed(ActionEvent e) String sId = JOptionPane.showInputDialog( 请输入要转账的卡号 :);long id2 = Long.parseLong(sId);Account account2 = bank.verifyAccount(id2);if(account2 != null)String sNum = JOptionPane.showInputDialog( 请输入您要转入账户的金额 :);double money=Double.parseDouble(sNum.equals()0:sNu
46、m);if(money = account.balance)bank.transferAccount(account, account2, money); JOptionPane.showMessageDialog(null, 转账成功! !, 信息提 示,JOptionPane.INFORMATION_MESSAGE);else JOptionPane.showMessageDialog(null, 抱歉, 您账户没有足够 的金额!请查看后重新选择输入! , 信息提示 ,JOptionPane.ERROR_MESSAGE); elseJOptionPane.showMessageDialog
47、(null, 抱歉,没有找到您要转入的 账户信息!请核对后重新选择输入!, 信息提示 ,JOptionPane.ERROR_MESSAGE);IName=new JLabel(账户 *: +account.getName(); IMsg.setText(”余额:+account.getBalance(););/ 给退卡按钮注册监听器Cancel.addActionListener( new ActionListener() public void actionPerformed(ActionEvent e) bank.saveAccountDate();dispose();/ 关闭窗口); A
48、TMOpe nAccou ntFrame 类package .qx;import java.awt.Dimension;import java.awt.GridLayout; import java.awt.Toolkit;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.utton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.JTextField;public class ATMOpenAccountFrame extends JFrameprivate JLabel jlOpenPasswd1,jlOpenPasswd
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025版个人房产买卖合同违约责任范本4篇
- 二零二五版智能仓储物流系统安装与优化合同3篇
- 二零二五版环保节能改造项目工程合同4篇
- 2025年度个人房产交易安全评估及买卖合同大全3篇
- 2025年度留学学术诚信教育合同4篇
- 2025版企业职工失业保险补贴资金支付合同3篇
- 2025年校园乐器维护保养及采购代理服务合同2篇
- 济南2025版房屋买卖合同产权登记与税务申报指南3篇
- 互联网客服专员2025年度绩效合同2篇
- 2025年度海洋运输货物保险合同保险责任与保险合同效力3篇
- 二零二五年度无人驾驶车辆测试合同免责协议书
- 2025年湖北华中科技大学招聘实验技术人员52名历年高频重点提升(共500题)附带答案详解
- 高三日语一轮复习助词「と」的用法课件
- 毛渣采购合同范例
- 2023中华护理学会团体标准-注射相关感染预防与控制
- 五年级上册小数递等式计算200道及答案
- 2024年广东高考政治真题考点分布汇 总- 高考政治一轮复习
- 燃气管道年度检验报告
- GB/T 44052-2024液压传动过滤器性能特性的标识
- FZ/T 81013-2016宠物狗服装
- JB∕T 14089-2020 袋式除尘器 滤袋运行维护技术规范
评论
0/150
提交评论