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项目,实现用户注册登录存款取款转账等功能的主要内容,如果未能解决你的问题,请参考以下文章

求一个简单地Java语言写的科研成果管理系统的源代码

电影推荐系统是用java写还是paython写好一点?

Java内存泄漏简单说明

JAVA语言中用于投票器的代码如何写

简单说说:JavaSEJavaEEJavaME这三大体系

学习Java开发难不难?好学吗?