简单银行系统实现登陆…

博客内容 使用类和方法,编写一个银行客户端系统,实现:用户登录,注册,存钱,取钱,转账,退卡等功能。主要代码如下。

里面涉及到的数组扩容,请参考我上片博客。
逻辑上是输入银行卡号和密码然后验证登录,我这里设置成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方法里用来判断,有局限性,即“只能判断是否,不能判断为什么”。