JAVA——实际应用——使用JAVA语言写一个简单ATM项目,实现用户注册登录存款取款转账等功能
Posted 叶不修233
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA——实际应用——使用JAVA语言写一个简单ATM项目,实现用户注册登录存款取款转账等功能相关的知识,希望对你有一定的参考价值。
JAVA——实际应用——使用JAVA语言写一个ATM项目
- 前置技能:
- 1、需要掌握Java基础语法(输入、输出、条件选择、循环)
- 2、需要掌握类的定义、对象的创建、方法的调用
- 3、需要掌握集合的用法,把对象存储到集合
一、分析需求
需要能实现如图所示用户注册、登录、存款、取款等功能,能够在一级菜单和二级菜单之间正常跳转。
1.账户类
程序有注册功能,每注册一次,就会多一个用户,就需要创建一个对象。因此需要一个定义用户对象的类,里面存储用户的属性。(属性:用户名、密码、余额)
2.业务类
查询余额、存款取款、转账等都属于程序的业务功能。因此需要定义一个业务类,来存储这些方法,供用户对象调用(方法:登录、注册、查询余额、存款、取款转账)
3.菜单类
程序会根据用户选择在一级菜单和二级菜单之间跳转和循环。因此需要定义一个菜单类,根据用户输入跳转到对应菜单(一级菜单、二级菜单)
4.main方法
程序需要在main方法中执行。因此需要一个主类作为程序的入口,用于启动程序。
需求已经分析完成,需要开发的代码接口如下图所示,接下来可以按照需求编写代码:
二、编写代码
按以上分析的思路逐一建立四个类。
1、账户类
(1)定义用户属性
1.为了代码的安全性,属性需要封装,即所有属性被private修饰。
private String username;
private String password;
private double money;
2.因为属性被封装,所以需要写get、set方法来使三个属性能够在别的文件中被设置和获取。
public String getUsername()
return username;
public void setUsername(String username)
this.username = username;
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;
(2)写账户类的构造方法
1.有参构造方法。也就是给类创建对象时,同给定义的属性赋值。
public Account(String username, String password, double money)
super();
this.username = username;
this.password = password;
this.money = money;
2.无参构造方法。因为写了有参构造方法,默认自带的无参构造方法会被覆盖,因此再写一个无参构造方法,防止后续创建对象不想赋值时程序报错。
public Account()
super();
(3)创建ArrayList集合用于存储用户账户
1.创建ArrayList集合。因为每一个创建一个用户就是一个新对象,这些对象需要有一个地方存储和调用,因此需要创建一个全局的ArrayList集合(即被static修饰),使这个集合能够在整个项目下被调用。
给这个集合命名为accountlist。
public static ArrayList<Account> accountlist = new ArrayList<Account>();
2.创建系统初始用户,并存储到ArrayList集合中。为了方便程序的调试,我们在程序初始状态就添加三个用户对象,存储在上面创建的集合中。
初始用户账号分别是1001、1002、1003;密码均为123;均自带1000元的初始余额。
因为需要程序一开始运行就有这三个用户,所以把它放在静态代码块中(被static修饰),使这段程序在类加载的时候就开始执行。
static
Account account1 = new Account("1001","123",1000);
Account account2 = new Account("1002","123",1000);
Account account3 = new Account("1003","123",1000);
accountlist.add(account1);
accountlist.add(account2);
accountlist.add(account3);
账户类就完成了。
2、菜单类
(1)创建扫描器
可以发现一级菜单和二级菜单均需要接收用户输入,所以可以在类下面创建扫描器,使一级菜单和二级菜单方法均可以调用。
Scanner input = new Scanner(System.in);
(2)创建一级菜单方法
1.固定输出部分。调用一级菜单时会固定输出一次这句话。
System.out.println("****欢迎登录叶不羞的银行****");
2.循环输出部分。用户可以反复选择服务,程序根据用户输入调用对应方法
while(true)
System.out.println("-----------请选择服务:1.登录 2.注册 3.退出-----------");
String choose = input.next();
switch(choose)
case "1":
System.out.println("----------------登录------------------");
//此处调用登录方法
break;
case "2":
System.out.println("----------------注册------------------");
//此处调用注册方法
break;
case "3":
System.out.println("----------bye--------bye-------");
//此处结束整个程序运行,固定语法如下:
System.exit(0);
break;
default:
System.out.println("----------输入错误,请重新输入-------");
break;
(3)创建二级菜单方法
循环输出部分。用户可以反复选择服务,程序根据用户输入调用对应方法
while(true)
System.out.println("请选择服务:1.查询余额 2.存款 3.取款 4.转账 5.返回上一级菜单");
String choose = input.next();
switch(choose)
case "1":
System.out.println("--------------查询余额------------------");
//调用查询余额方法
break;
case "2":
System.out.println("--------------存款------------------");
//调用存款方法
break;
case "3":
System.out.println("--------------取款------------------");
//调用取款方法
break;
case "4":
System.out.println("--------------转账------------------");
//调用转账方法
break;
case "5":
//使用return关键字返回一级菜单
return;
default:
System.out.println("----------输入错误,请重新输入-------");
break;
菜单类框架搭建完成,接下来需要把用户选择对应的每个方法写出来,然后在菜单类对应的位置调用。
3、业务类
(1)创建扫描器
业务类同样需要接收用户输入,所以也在类下创建扫描器。
Scanner input = new Scanner(System.in);
(2)定义登录方法login()
1.需要接收用户输入用户名和密码、需要判断用户名和密码是否正确,如果正确,就返回一个true。
/**
* 登录
*/
public boolean login()
System.out.println("请输入用户名:");
String username = input.next();
System.out.println("请输入密码:");
String password = input.next();
for (int i = 0; i < Account.accountlist.size(); i++)
if(Account.accountlist.get(i).getUsername().equals(username) && Account.accountlist.get(i).getPassword().equals(password))
currentLoginIndex = i;
return true;
return false;
2.在一级菜单的选择服务1处调用登录服务,如果登录成功,就调用二级菜单方法。
调用服务需要创建对象,所以先创建一个菜单对象,用这个对象调用登录方法
- 因为接下来的多项业务都需要菜单对象调用,因此对象是创建在方法之外,也就是菜单类下面的
//创建菜单对象bank
Bank bank = new Bank();
//用对象bank调用登录方法,判断是否登录成功,并根据结果写出对应输出内容
case "1":
System.out.println("----------------登录------------------");
if(bank.login())
System.out.println("登录成功");
twoManu();
else
System.out.println("登录失败,账号或密码错误");
break;
(3)定义注册方法register()
1.判断用户是否存在。因为接收用户名时需要判断用户是否已存在,已存在的用户就不能注册了,所以可以把“判断用户是否存在”单独写成一个方法【userNameIsExsit()】。
/**
* 判断用户名是否存在-存在则返回false
*/
public boolean userNameIsExsit(String userName)
for (int i = 0; i < Account.accountlist.size(); i++)
if(userName.equals(Account.accountlist.get(i).getUsername()))
return false;
return true;
2.接收用户名和密码,调用判断用户是否存在方法【userNameIsExsit()】,根据返回结果完成对应逻辑
/**
* 注册
*/
public void register()
System.out.println("请输入用户名:");
//用户名newUser
String newUser = input.next();
//判断用户名是否存在
boolean flag = userNameIsExsit(newUser);
if(flag)
System.out.println("请输入密码:");
String newPwd = input.next();
Account newAccount = new Account(newUser,newPwd,0);
Account.accountlist.add(newAccount);
System.out.println("注册成功");
else
System.out.println("账号已存在,请重新输入");
3.在一级菜单的选择服务2处调用注册服务。
case "2":
System.out.println("----------------注册------------------");
bank.register();
break;
(4)定义查询余额方法queryMoney()
1.创建成员变量存储登录用户下标。因为查询余额需要明确查询余额的对象是谁,所以需要记录前面登录对象的下标,因此可以在类下创建成员变量【currentLoginIndex】,用于记录登录用户的下标。
int currentLoginIndex = 0;
2.在登录方法中加一行代码,每次登录,把登录用户的下标值赋给变量【currentLoginIndex】。
代码见以上第(2)步的登录方法,不再重复。
3.写查询余额方法。直接在存储用户对象的列表中根据登录用户的下标,调用getMoney()方法,查询该对象的余额属性。
/**
* 查询余额
*/
public void queryMoney()
System.out.println(Account.accountlist.get(currentLoginIndex).getMoney());
4.在二级菜单的选择服务1处调用查询余额服务。
case "1":
System.out.println("--------------查询余额------------------");
bank.queryMoney();
break;
(5)定义存款方法inMoney()
1.没有需要注意的地方,直接按逻辑写。
/**
* 存款
*/
public void inMoney()
System.out.println("请输入存款金额:");
double money = input.nextDouble();
Account account = Account.accountlist.get(currentLoginIndex);
account.setMoney(account.getMoney()+money);
System.out.println("存款成功");
2.在二级菜单的选择服务2处调用存款服务。
case "2":
System.out.println("--------------存款------------------");
bank.inMoney();
break;
(6)定义取款方法outMoney()
1.注意取款时需要判断用户是否余额充足,没有其它需要注意的地方,直接按逻辑写。
/**
* 取款
*/
public void outMoney()
System.out.println("请输入取款金额:");
double money = input.nextDouble();
Account account = Account.accountlist.get(currentLoginIndex);
if(money <= account.getMoney())
account.setMoney(account.getMoney()-money);
System.out.println("取款成功");
else
System.out.println("取款失败,余额不足");
2.在二级菜单的选择服务3处调用取款服务。
case "3":
System.out.println("--------------取款------------------");
bank.outMoney();
break;
(7)定义转账方法sendMoney()
1.注意需要判断转账用户名是否存在、判断本账户余额是否充足、转账完成之后需要同时减少本账户余额和增加对方账户余额,代码如下:
public void sendMoney()
System.out.println("请输入转账账号:");
String username = input.next();
//判断用户名是否存在
boolean flag = userNameIsExsit(username);
if(flag==false)
System.out.println("请输入转账金额:");
double money = input.nextDouble();
Account account1 = Account.accountlist.get(currentLoginIndex);
//判断余额是否大于转账金额
if(money <= account1.getMoney())
//减少本账号余额
account1.setMoney(account1.getMoney()-money);
//获取被转帐用户下标
int userIndex = 0;
for (int i = 0; i < Account.accountlist.size(); i++)
if(Account.accountlist.get(i).getUsername().equals(username))
userIndex = i;
//增加被转帐用户余额
Account account2 = Account.accountlist.get(userIndex);
account2.setMoney(account2.getMoney()+money);
System.out.println("转账成功");
else
System.out.println("转账失败,余额不足");
else
System.out.println("账号不存在,请重新输入");
2.在二级菜单的选择服务4处调用转账服务。
case "4":
System.out.println("--------------转账------------------");
bank.sendMoney();
break;
业务类方法完成,同时把方法调用在菜单类对应位置补全。接下来可以在主方法中测试系统是否能够正常运行。
4、main方法
public class TestAtm
public static void main(String[] args)
/**
* 创建对象,调用一级菜单
*/
BankUi u = new BankUi();
u.oneManu();
运行结果:
以上是关于JAVA——实际应用——使用JAVA语言写一个简单ATM项目,实现用户注册登录存款取款转账等功能的主要内容,如果未能解决你的问题,请参考以下文章