关于封装性的具体应用:Bank类与Acount类和Customer类之间的相关性,也就是上一个版本的升级版

这是test类,好像我类名写错了。。。。。算了,不动它了

package com.javalow;

import java.util.Scanner;

/**
 * @Description 封装性的具体应用(520行代码实现该小小小项目)
 * @author Mark-Z
 * @version 1.2.3(增强版):1.添加图形化界面2.登录后可以修改个人信息和密码(暂没有实现)3.有错误反馈机制4.不足之处,实在不知道怎么改了
 * @date 2021-10-22
 */
public class Test {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        Bank bank = new Bank();
        System.out.println("""
                ------------------银行系统-----------------
                                1.创建账户
                                2.登录账户
                                3.搜索账户
                                4.退出
                                注:登录后可以修改个人信息
                ---------------------------------------------
                """);
        while (true) {
            System.out.print("请选择一个数字继续: ");
            int number = scanner.nextInt();
            switch (number) {
                case 1 -> {
                    bank.setWill();
                }
                case 2 -> {
                    bank.login();
                }
                case 3 -> {
                    System.out.println("----------------搜索账户----------------");
                    System.out.println("请输入要搜索的农业银行卡号: ");
                    System.out.println(bank.searchCid(scanner.nextInt()));
                    System.out.println("--------------->搜索完毕<---------------");
                }
                case 4 -> System.exit(101);
                default -> {
                    try {
                        throw new Exception("Error!");
                    } catch (Exception exception) {
                        exception.printStackTrace();
                    }
                }
            }
        }
//        String s1= bank.getAccount(0).getInfo();
//        System.out.println(s1);
    }

//        bank.addAccount(1234,123243);
//        bank.addCustomer("da","f",23,34);
//        bank.getAccount(0);
//        bank.getCustomer(0);

}

这是bank类

package com.javalow;

import java.util.Scanner;

/**
 * @author Mark-Z
 * @version 1.1.0(pro版,设置自定义的个人信息)注:个人信息和对应账户有一一对应的关系,也就是说同一个索引保存的是同一个人的
 * @date 2021-10-22
 */
class Bank {
    private Account[] account;
    private int numberOfA=0;
    private int numberOfC=0;
    private Customer[] customer;
    private Scanner scanner = new Scanner(System.in);

    //用来保存当前登录的账户的地址(退出即销毁)----->很重要后续一连串操作靠它进行,相当于验证码!!!
    private int xnumber;

    //保存个人信息(退出登录即销毁)
    String s = null;

    public Bank(){
        this.account=new Account[10];
        this.customer=new Customer[10];
    }

    public void addAccount(int cid, int cidPassword) {
            account[numberOfA]=new Account(cid,cidPassword);
            numberOfA++;
    }
    /*
        private int numberOfA=0;
        private int numberOfC=0;
        用这两个变量来记录当前用户的个数,这样一来searchCid方法不会造成空指针
        原因:由于创建账户时有先后顺序(详见260行代码),同用一个变量会把指针指向null---customer[x].say()(详见66行代码)
     */
    public void addCustomer(String name,String address, int IDnumber, int phone) {
            customer[numberOfC]=new Customer(name, address, IDnumber, phone);
            numberOfC++;
    }
    //返回一个账户对象数组中具体的账户对象(未使用)
    public Account getAccount(int index) {
        return account[index];
    }

    public Account[] getAccount(){
        //返回整个存储账户对象的地址(未使用)
        return account;
    }
    //返回一个用户对象数组中具体的用户对象
    public Customer getCustomer(int index) {
        return customer[index];
    }

    public Customer[] getCustomer(){
        //返回整个存储账户对象的地址(未使用)
        return customer;
    }
    //(未使用)
    public int getAlength() {
        return account.length;
    }

    //搜索指定的账户的个人信息(卡号)
    public String searchCid(int cid){
//        String s = "-------------------------------List--------------------------------"+"\n";
        System.out.println("-----------------List------------------");
        for (int x = 0;x<numberOfA;x++){
            try {
                if (cid==account[x].getCid()){
                    s="\t\t\t"+" 账户信息"+"\n"+account[x].getInfo()+"\t\t\t"+" 个人信息"+"\n"+customer[x].say()+"\n";
                    return s;
                }
            }catch (Exception exception){
                System.out.print("");
            }
        }return ">>>>>没有该账户的信息<<<<<";
    }
    //匹配指定的账户的信息(密码)
//    public boolean searchCidPassword(int cidPassword){
//        for (int x = 0;x<account.length;x++){
//            if (cidPassword==account[x].getCidPassword()) {
//                return true;
//            }
//        }
//    }

    //验证账号密码
    public boolean validation(int cid,int cidPassword){
        for (int x = 0;x<=numberOfA;x++){
            try {
                if (cidPassword==account[x].getCidPassword() & cid==account[x].getCid()) {
                    //搞不懂为什么验证成功会打印两次
                    System.out.println("验证成功!!!");
                    //把找到的账户位置赋值给xnumber(只有一次赋值)
                     xnumber =x;
                    return true;
                }
            }catch (Exception ignored){
                System.out.print("");
            }
        }
        System.out.println("账号或密码错误!");
        return false;
    }

    //登录账户

    /**
     *最关键的环节:其实写到这里,我自己也蒙了(现在看到里面的各种结构,人都傻了),想了好久
     */
    public void login() {
        System.out.println("--------------->登录<----------------");
        while (true) {
            for (int q = 3; q >= 0; q--) {

                System.out.print("请输入你的卡号: ");
                int cid = scanner.nextInt();
                System.out.print("请输入你的密码; ");
                int cidPassword = scanner.nextInt();
                if (!validation(cid, cidPassword)) {
//                    if (q-1 != 0){
//                        System.out.println("你还有"+(q-1)+"次机会,次数用完会退出登录!!!");
//                    }
//                    if (q-1 == 0){
//                        System.out.println("次数已尽");
//                        break loop1;
//                    }
                            /**
                             * @deprecated
                             *@author Mark-Z
                             * @date 2021-10-11
                             * @version 1.0.1
                             */
                    /*
                    每次密码输入错误时:
                    借助另一个方法来判断次数是否用尽,用尽则返回true,然后退出
                     */
                    if (main(q)) {
                        System.out.println("--------------<已强制下线>--------------");
                        return;
                    }

//                    System.out.println("请重新输入--->");

                }
                if (validation(cid, cidPassword)) {
                    System.out.println("--------------<登录成功>--------------");
                    for (; ; ) {
                        System.out.print("你是要存钱(1)还是取钱(2)还是修改个人信息(3),还是退出登录(exit): ");
                        loop2:
                        while (true) {
                            String sc = scanner.next();
                            if ("存钱".equals(sc) || "1".equals(sc)) {
                                System.out.print("你要存多少钱:");
//                               account[xnumber].withDraw(scanner.nextDouble());
                                setw(scanner.nextDouble(), xnumber);
                            }
                            if ("取钱".equals(sc) || "2".equals(sc)) {
                                System.out.print("你要取多少钱: ");
//                                account[i].save(scanner.nextDouble());
                                sets(scanner.nextDouble(), xnumber);
                            }
                            if ("3".equals(sc)) {
                                System.out.println("------------修改个人信息-------------");
                                System.out.println(">>>>>>>>>>这是当前账户的信息<<<<<<<<<<");
                                System.out.println(customer[xnumber].say());
                                System.out.println(">>>>>>>>>>>>>>显示完毕<<<<<<<<<<<<<<");
                                setInfo(xnumber);
                                System.out.println("--------------修改完毕---------------");
                            }
                            if ("exit".equals(sc)) {
                                //下线及销毁该变量
                                xnumber = 0;
                                System.out.println("-------------<用户已下线>-------------");
                                return;
                            }
                            //显示结果
                            System.out.println(customer[xnumber].say());
                            for (;;) {
//                                (这里需要输入两次2才能退出,我也不知道是为什么)
                                System.out.print("是否还要进行操作?按1继续/按2退出: ");
                                if (1 == scanner.nextInt()) {
                                    break loop2;
                                } else if (2 == scanner.nextInt()) {
                                    //下线及销毁该变量
                                    xnumber = 0;
                                    System.out.println("-------------<用户已下线>-------------");
                                    return;
                                } else {
                                    System.out.println(">>>输入错误<<<");
                                }
                            }
                        }
                    }
                }
            }
        }

    }
    /*
    中间被注释的代码块可以被忽略
     */
//            while (true) {
//                System.out.print("你是要存钱(1)还是取钱(2)还是修改个人信息(3),还是退出登录(exit): ");
//                String sc = scanner.next();
//                if ("存钱".equals(sc) || "1".equals(sc)) {
//                    System.out.print("你要存多少钱:");
                               account[i].withDraw(scanner.nextDouble());
//                    setw(scanner.nextDouble(), i);
//                }
//                if ("取钱".equals(sc) || "2".equals(sc)) {
//                    System.out.print("你要取多少钱: ");
                                account[i].save(scanner.nextDouble());
//                    sets(scanner.nextDouble(), i);
//                }
                            if ("3".equals(sc)){
                            }
//                if ("exit".equals(sc)) {
//                    break loop;
//                }
//                customer[i].say();
//                System.out.println("-------------<用户已下线>-------------");
//            }
    }
                else{
                    try {
                        throw new Exception("无法找到该账户!请先创建账户!");
                    } catch (Exception exception) {
                        exception.printStackTrace();
                    }
                }
//    }
//
//
    //存钱
    public void setw(double withDraw,int index){
            account[index].withDraw(withDraw);
    }
    /*
    这两方法也靠验证码进行
    --->其实就是validation方法中赋值给xnumber
    该账户和对应的个人信息的地址
     */
    //取钱
    public void sets(double save,int index){
            account[index].save(save);
    }

    //                for (int i = 3;i>0;i--){
//                    System.out.print("请输入你的cid号: ");
//                    int c =scanner.nextInt();
//                    System.out.print("请输入你的cid密码: ");
//                    int p =scanner.nextInt();
//                        if (account[i].getCid()==c&&account[i].getCidPassword()==p){
//                            while (true){
//                                try {
//                                    System.out.print("你是要存钱还是取钱: ");
//                                    String sc = scanner.next();
//                                    if ("存钱".equals(sc)){
//                                        System.out.print("你要存多少钱:");
//                                        account[i].withDraw(scanner.nextDouble());
//                                    }
//                                    if("取钱".equals(sc)){
//                                        System.out.print("你要取多少钱: ");
//                                        account[i].save(scanner.nextDouble());
//                                    }
//                                    System.out.println();
//                                }catch (Exception ignored){
//                                    System.out.println("error");
//                                }
//                                }
//
//                        }else {
//                            System.out.println("账号或密码错误!"+"\n");
//                            main(i,c,p,account);
//                        }
   //关于方法的重载
    static boolean main(int j) {
        if (0 != (j - 1)) {
            System.out.println("输入错误,你还有" + (j - 1) + "次机会!");
            System.out.print("请重新输入--> ");
        }
        if (0 == (j - 1)) {
            System.out.println("拜拜啦,兄弟!");
            return true;
        }
        return false;
    }

    //用户添加账户
    public void setWill(){
        while(true){
            System.out.print("是否取消操作(1[取消]/2[继续]): ");
            int yesorno = scanner.nextInt();
            if (yesorno==1){
                return;
            }else if(yesorno==2){
                System.out.println("-------------->创建账户<--------------");
                System.out.print("输入卡号: ");
                int cid = scanner.nextInt();
                System.out.print("密码: ");
                int cidPassword = scanner.nextInt();
                addAccount(cid, cidPassword);
                /*
                这里的机制比较能看懂(哈哈哈)
                 */
                System.out.print("姓名: ");
                String name = scanner.next();
                System.out.print("地址: ");
                String address = scanner.next();
                System.out.print("身份证号: ");
                int IDnumber = scanner.nextInt();
                System.out.print("手机号: ");
                int phone = scanner.nextInt();
                addCustomer(name, address, IDnumber, phone);
                System.out.println("--------------->完成<----------------");
                return;
            }else{
                System.out.println(">>>选择错误<<<");
            }
        }
        }


    //修改指定的账户信息
    public void setInfo(int index){
        System.out.println("请输入你想修改的名字(按回车为下一个,下同): ");
        String n = scanner.next();
        getCustomer(index).setName(setName(index,n));

        System.out.println("请输入你想修改的的住址: ");
        String a = scanner.next();
        getCustomer(index).setAddress(setAddress(a,index));

        System.out.print("请输入你想修改的的手机号: ");
        int p = scanner.nextInt();
        getCustomer(index).setPhone(setPhone(index,p));
   }
    //以下是实现回车返回默认值的方法(利用回车等于空串的方法)
    public String setName(int index,String name){
        if (name.equals("")){
            return getCustomer(index).getName();
        }
        return name;
    }
    public String setAddress(String address,int index ){
        if (address.equals("")){
            return getCustomer(index).getAddress();
        }
        return address;
    }
    /*
    包装成字符串来比较
     */
    public int setPhone(int index, int phone){
        if (Integer.toString(phone).equals("")){
            return getCustomer(index).getIDnumber();
        }return phone;
    }
}

这是Acount类

package com.javalow;

/**
 * @author Mark-Z
 * @version 0.1.0 该类作为生成用户账户的一个模板
 * @date 2021-10-22
 */
class Account {
    private int cid;
    private int cidPassword;
    private double balance;

    public String getInfo() {
        return "" + "cid(卡号): " + cid
                + "\n" + "balance(余额): "
                + balance + "(元)"+"\n";
    }

    public Account(int cid, int cidPassword) {
        this.cid = cid;
        this.cidPassword = cidPassword;
    }

    public void withDraw(double d1) {
        if (d1 < 100) {
            System.out.println("存钱失败!最少要100元");
        } else {
            balance += d1;
            System.out.println("存钱成功");
        }
        System.out.println(getInfo());
    }

    public void save(double d2) {
        if (d2 < balance) {
            balance -= d2;
            System.out.println("取钱成功");
            System.out.println(getInfo());
        } else {
            System.out.println("账户内金额小于取出的金额,无法取出");
        }
    }

    public int getCid() {
        return cid;
    }

    //没有提供给一个给用户修改密码的方法
    public void setCidPassword(int cidPassword) {
        this.cidPassword = cidPassword;
    }

    public int getCidPassword() {
        return cidPassword;
    }
}

这是Customer类

package com.javalow;

/**
 * @author Mark-Z
 * @version 0.1.0 该类作为生成用户的一个模板
 * @date 2021-10-22
 */
class Customer {
    private String name;
    private String address;
    private int IDnumber;
    private int phone;

    public Customer(String name, String address, int IDnumber, int phone) {
        this.name = name;
        this.address = address;
        this.IDnumber = IDnumber;
        this.phone = phone;
    }

    public String say() {
        return ""+ "姓名:" + name + "\n"
                 + "住址:" + address + "\n"
                 + "身份证号:" + IDnumber + "\n"
                 + "手机号:" + phone;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public int getIDnumber() {
        return IDnumber;
    }
    //    //    (有异常未使用)
    public void setIDnumber(int IDnumber) {
        this.IDnumber = IDnumber;
    }
    //    (有异常未使用)
    public int getPhone() {
        return phone;
    }

    public void setPhone(int phone) {
        this.phone = phone;
    }
}

就到此结束了,请高手点评下。哈哈哈哈哈哈哈哈哈

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZJ_Mark

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值