简单银行系统实现登陆…
博客内容 使用类和方法,编写一个银行客户端系统,实现:用户登录,注册,存钱,取钱,转账,退卡等功能。主要代码如下。
注 里面涉及到的数组扩容,请参考我上片博客。
逻辑上是输入银行卡号和密码然后验证登录,我这里设置成l用户名和密码,所以请理解下(懒哈,但实现原理都是一样的);
- 类:BankCard//银行卡信息
class BankCard {
private String clientName;//用户名
private String password;//密码
private int accountNum;//账号
private int leftMoney;//余额
public BankCard(String clientName, String password, int accountNum, int leftMoney) {
this.clientName = clientName;
this.password = password;
this.accountNum = accountNum;
this.leftMoney = leftMoney;
}//有参构造方法
public BankCard() { }//无参
public String getClientName() { }
public void setClientName(String clientName) {}
//其余的一些get和set方法就不一一罗列了
}
- Book类
class Bank{
public static void main(String[] args) {
//初始化一些值
BankCard [] bankcards = new BankCard[4];
BankCard bk0 = new BankCard("reba","reba123",1,10000);
BankCard bk1 = new BankCard("jzya","jzyal123",2,1);
BankCard bk2 = new BankCard("jack","jack123",3,129);
BankCard bk3 = new BankCard("tom","tom123",4,12312);
bankcards[0]=bk0;
bankcards[1]=bk1;
bankcards[2]=bk2;
bankcards[3]=bk3;
Scanner scanner = new Scanner(System.in);
String name = "";
String password = "";
//功能实现部分
while (true){
System.out.println("请选择:");
System.out.println("1.登录 2.注册 3.退出");
int select = scanner.nextInt();
if(select == 3)
return;
switch (select){
case 1:{
System.out.println("登录:");
name = scanner.next();
password = scanner.next();
if(login(bankcards,name,password)){
System.out.println("登录成功!!!");
}else {
System.out.println("登录失败,请核对你的账户和密码");
}
System.out.println("请输入选择");
while (true){
System.out.println("1.存钱 2.取钱 3.转账 4.退卡");//写一个ShowCount 显示操作后用户还有多少钱
int choice = scanner.nextInt();
if(choice==4){//跳出存钱子菜单
break;
}
switch (choice){
case 1:{
System.out.println("请输入要存的钱数");
int saveMoney=scanner.nextInt();
SaveMoney(bankcards,saveMoney,name);//都能登录进来,账户存在,存钱肯定成功
System.out.println("存钱成功");
showAccount(bankcards,name);
break;
}
case 2:{
System.out.println("请输入提取的金额:");
int takeMoney=scanner.nextInt();
if(takeMoney(bankcards,takeMoney,name)) {
System.out.println("取款成功,你提取了"+takeMoney+"¥");
showAccount(bankcards,name);
}else{
System.out.println("金额不足!");
}
break;
}
case 3:{
System.out.println("请输入接收方账户名和转账金额");
String aimName= scanner.next();
int transMoney = scanner.nextInt();
if(transfer(bankcards,name,aimName,transMoney)) {
System.out.println("转账成功");
showAccount(bankcards,name);
}
else {
System.out.println("转账失败");
break;
}
}
default:System.out.println("输入无效");
}
}
break;//跳出case1
}
case 2:{
System.out.println("请设置用户名和密码");
/*注册时,默认扩展内存为原来数组长度加1*/
BankCard bankCard[]= new BankCard[bankcards.length+1];
for(int i=0;i<bankcards.length;i++){//把原来数组的值拷贝过去
bankCard[i]=bankcards[i];
}
bankcards = bankCard;//初始化新对象数组的最后一个元素,即最后一个元素,防止空指针异常
BankCard bkTemp = new BankCard(" "," ",0,0);//这里设置默认的账号和余额为0
bankcards [bankcards.length-1]=bkTemp;
if(register(bankcards,name,password)){
System.out.println("注册成功");
}else {
System.out.println("注册失败");
}
break;
}
default:System.out.println("输入错误");
}
}
}
- Book类里面的几个方法:
1.登录
public static boolean login(BankCard bankcards[],String name,String password){
if(bankcards==null)
return false;
for(int i=0;i<bankcards.length;i++){
if (bankcards[i].getClientName().equals(name)&&bankcards[i].getPassword().equals(password))
return true;
}
return false;
}
就从这块开始,我写的是“用户名和密码匹配”而不是真正银行里的“卡号和密码匹配”,有的不想改,懒(笑哭ing)。就是从键盘输入用户名和密码,和已经初始化的那些匹配,匹配到了返回true,main函数里调用结果为true,输出输出登录成功,进入下一级菜单(存钱 取钱 转账 退卡)
2.注册账号
public static boolean register(BankCard bankcards[],String name,String password){
Scanner scanner = new Scanner(System.in);
name = scanner.next();
password = scanner.next();
for(int i=0;i<bankcards.length;i++){
if (bankcards[i].getClientName().equals(name)&&bankcards[i].getPassword().equals(password)){
return false;
}else if(bankcards[i].getAccountNum()==0){
//在main方法里定义了accountNum从1开始,将扩容后新的accountNum初始化为0,为0则注册到此处
bankcards[i].setClientName(name);
bankcards[i].setPassword(password);
bankcards[i].setAccountNum(bankcards.length);
bankcards[i].setLeftMoney(0);
return true;
}
}
return false;
}
这块涉及到了数组的扩容,main方法里数组长度定义为4,通过扩容,使得有空间存放新注册的用户。逻辑上就是输入想要注册的用户名和密码,要是已存在的此名字的用户,那就注册失败,没有设置主键,就把名字当做主键,虽然实际上有重名的,但要是账号为主键就没事。
3.存款
public static void SaveMoney(BankCard bankcards[],int saveMoney,String name){
//登录进来 所以账户肯定存在 不再做判断
for(int i=0;i<bankcards.length;i++){
if(bankcards[i].getClientName().equals(name)){//用姓名匹配
bankcards[i].setLeftMoney(bankcards[i].getLeftMoney()+saveMoney);
}
}
}
存款(取款)在登录成功后的子菜单下,所以登录成功后说明账户存在,把从main方法里传进的参数,加到用户的余额上就行。说到这,刚测试时随便存了个100000000000结果报错,溢出。所以还是把余额设置为String类型为好。
4.取款
public static boolean takeMoney(BankCard bankcards[],int takeMoney,String name){
for(int i=0;i<bankcards.length;i++){
if(bankcards[i].getClientName().equals(name)){
if((bankcards[i].getLeftMoney()-takeMoney)>=0){
bankcards[i].setLeftMoney(bankcards[i].getLeftMoney()-takeMoney);
return true;
}
}
}
return false;
}
取款和存款基本一样,逻辑上,判断账户余额>=取款金额,那就能取,然后把余额把取款金额减掉就行。限额,加个if语句判断一下就行,这块没写。要是分析代码和功能,那应该这个方法返回值定义为int或其类型,布尔类型只能用来判断“取款成功”和“取款失败”,无法把因为限额等存款原因返回。当然可以把输出语句写到成员方法里,那连返回值都不用了,但不建议把输出打印这些写在成员方法里。
5.显示账户状态
public static void showAccount(BankCard bankcards[],String name){
for(int i=0;i<bankcards.length;i++){
if(bankcards[i].getClientName().equals(name)) {
System.out.println("账户名: " + bankcards[i].getClientName()
+ " 卡号: "+ bankcards[i].getAccountNum() + " 余额 " + bankcards[i].getLeftMoney());
}
}
}
显示用户状态,这个是内嵌在存款,取款,转账成功的页面内显示的,意思就是当完成交易可以提醒用户当前账户状态(用户名 账号 余额)。可以把这个嵌到登录成功后的菜单,用户登录后就可以查看账户当前状态。
6.转账
public static boolean transfer(BankCard bankcards[],String name,String aimName,int transMoney){
if(name.equals(aimName))
return false;//自己不能给自己转账
for(int i=0;i<bankcards.length;i++){
if(bankcards[i].getClientName().equals(name)&&(bankcards[i].getLeftMoney()-transMoney)>=0){
for(int j=0;j<bankcards.length;j++){
if(bankcards[j].getClientName().equals(aimName)){
bankcards[j].setLeftMoney(bankcards[j].getLeftMoney()+transMoney);
bankcards[i].setLeftMoney(bankcards[i].getLeftMoney()-transMoney);
return true;
}
}
}
}
return false;
}
转账这块,我用的双重循环和双重if判定,当登录用户账户余额>=要转账金额&&收款人账户存在才可以进行转账操作。总觉得有点啰嗦这样写,但没有找到好方法。大神有好方法麻烦指点一下。
- 总结
一,对象数组,要使用必须先对其进行初始化,不然会遇到空指针异常。不像基本数据类型的数组,系统会有默认值。
二,类中二要素“属性,方法”,注意写有参构造方法和无参构造方法。注意属性和方法的修饰权限,private ,public,protect,package.默认不写的话,就是包访问权限“package”,即一个包下都可以访问。
三,布尔类型作为方法返回值,在main方法里用来判断,有局限性,即“只能判断是否,不能判断为什么”。