如何使用抽象从方法更新数组

我的目标是使用Java技术(例如封装,继承,多态)创建一个atm程序,而我使用的是最后一个抽象。当我在提款或存款值中输入一个值时,它就可以完成工作,但是当我单击主菜单上的余额查询按钮时,余额不会更新。

/*
* abstraction
*/
package atm;

import java.util.Scanner;

public class atm {
    int[] an = {201511032,201563244,201410230,201596427,201456329};
    int[] pin = {8888,1234,5432,9876,6543};
    int[] ac = {80500,3000,27450,6500,13200};
    public static void main(String args[]){
        atm obj = new atm();
        Scanner sc = new Scanner(System.in);
        System.out.print("Welcome!");
        System.out.println("\n[0] To end Transaction\n");
        System.out.print("ENTER accOUNT NUMber: ");
        int acc = sc.nextInt();
        if (acc == 0){system.exit(acc);}
        System.out.print("ENTER PIN NUMber: ");
        int pass = sc.nextInt();
        obj.accVer(pass,acc);
    }
    void accVer(int pass,int acc){
        atm obj = new atm();
        if (acc == an[0] && pass==pin[0]){
            System.out.println("");
            obj.mMenu(an[0],pin[0],0);
        }else if (acc == an[1] && pass==pin[1]){
            System.out.println("");
            obj.mMenu(an[1],pin[1],1);
        }else if (acc == an[2] && pass==pin[2]){
            System.out.println("");
            obj.mMenu(an[2],pin[2],2);
        }else if (acc == an[3] && pass==pin[3]){
            System.out.println("");
            obj.mMenu(an[3],pin[3],3);
        }else if (acc == an[4] && pass==pin[4]){
            System.out.println("");
            obj.mMenu(an[4],pin[4],4);
        }else{
            System.out.println("Error account Number or Pin. \nPlease Try Again\n");
            atm.main(null);
        }
    }
    void mMenu(int pass,int acc,int num1){
        Scanner sc = new Scanner(System.in);
        System.out.println("Main Menu: ");
        System.out.println("[1] for Balance Inquiry");
        System.out.println("[2] for Withdraw");
        System.out.println("[3] for Deposit");
        System.out.println("[4] for End Transaction");
        System.out.print("Choice: ");
        int s = sc.nextInt();
        methods obj = new execute();
        if (s == 1){obj.balanceInquiry(pass,acc,num1);}
        else if(s == 2){obj.withdrawal(pass,num1);}
        else if(s == 3){obj.deposit(pass,num1);}
        else{System.out.println("Thank You!");System.out.println("");System.out.println("");atm.main(null);}
    }
    void withprod(int with,int pass,int num1){
        Scanner sc = new Scanner(System.in);
        methods obj1 = new execute();
        atm obj = new atm();
        System.out.println("");
        System.out.println("Do you wish to Withdraw this amount?: $ "+with);
        System.out.println("[1] for Yes");
        System.out.println("[2] for No");
        System.out.print("Choice: ");
        int ans = sc.nextInt();
        if (ans == 1){
            int num4 = ac[num1]-with;
            ac[num1] = num4;
            System.out.println("The Transaction has been made. \nPlease get the money on the dispenser window.");
            System.out.println("");
            obj.mMenu(pass,num1);
        }else if(ans == 2){
            obj1.withdrawal(pass,num1);
        }   
    }


    abstract class methods{
        abstract void balanceInquiry(int pass,int num1);
        abstract void withdrawal(int pass,int num1);
        abstract void deposit(int pass,int num1);

    }
    class execute extends methods{

        @Override
        void balanceInquiry(int pass,int num1) {
            Scanner sc = new Scanner(System.in);
            atm obj = new atm();
            System.out.println("Current Balance: $" +ac[num1]);
            System.out.print("press any number to return: ");
            int ans = sc.nextInt();
            if (ans < 10){System.out.println("");obj.mMenu(pass,num1);}
            else{obj.mMenu(pass,num1);}
            System.out.println("");
            System.out.println("");
        }

        @Override
        void withdrawal(int pass,int num1) {
            Scanner sc = new Scanner(System.in);
            methods obj1 = new execute();
            atm obj = new atm();
            System.out.println("");
            System.out.println("MENU FOR WITHDRAWAL");
            System.out.println("[0] to Return");
            System.out.println("[2] to $ 20");
            System.out.println("[2] to $ 40");
            System.out.println("[3] to $ 60");
            System.out.println("[4] to $ 100");
            System.out.println("[5] to $ 200");
            System.out.println("[6] to Other Amount");
            System.out.print("Please choose your desire answer: ");

            int ans = sc.nextInt();
            if (ans == 0){obj.mMenu(pass,num1);}
            else if (ans == 1){int with = 20;obj.withprod(with,pass,num1);}
            else if (ans == 2){int with = 40;obj.withprod(with,num1);}
            else if (ans == 3){int with = 60;obj.withprod(with,num1);}
            else if (ans == 4){int with = 100;obj.withprod(with,num1);}
            else if (ans == 5){int with = 200;obj.withprod(with,num1);}
            else if (ans == 6){System.out.print("Please enter the amount you wish to Withdraw: $ ");int with = sc.nextInt(); obj.withprod(with,num1);}
            else{System.out.println("ERROR: Invalid Input.\n Please Try Again");obj1.withdrawal(pass,num1);}
        }

        @Override
        void deposit(int pass,int num1) {
            Scanner sc = new Scanner(System.in);
            methods obj1 = new execute();
            atm obj = new atm();
            System.out.println("");
            System.out.println("MENU FOR DEPOSIT");
            System.out.println("[0] to Return");
            System.out.print("Please enter the amount you wish to deposit: $ ");
            int dep = sc.nextInt();
            if (dep == 0){obj.mMenu(pass,num1);}
            else{
                System.out.println("");
                System.out.println("Do you wish to deposit this amount?: $ "+dep);
                System.out.println("[1] for Yes");
                System.out.println("[2] for No");
                System.out.print("Choice: ");
                int ans = sc.nextInt();
                if (ans == 1){
                    System.out.println("Please use the envelope given,insert the amount and place it in the deposit bin.");
                    System.out.println("Have you placed the envelope on the deposit bin?: ");
                    System.out.println("[1] for Yes");
                    System.out.println("[2] for No");
                    int ans2 = sc.nextInt();
                    if (ans2 == 1){
                        System.out.println("We recieved your deposit. Please check your balance for updates.");
                        float num2 = ac[num1]+dep;
                        ac[num1] = (int) num2;
                        System.out.println("");
                        obj.mMenu(pass,num1);
                    }else{obj1.deposit(pass,num1);}
                }else if(ans == 2){
                    obj1.deposit(pass,num1);
                }
            }   
        }
    }
}
zhidian88888 回答:如何使用抽象从方法更新数组

据我了解您的代码,withdrawdisposit方法不会与atm类或彼此之间共享任何信息。您的execute类是完全无状态的(通常很好)。但是,您需要某种状态,为此,您尝试通过构造类的新实例来实现该状态,但是那样就无法保存任何状态:

    void withdrawal(int pass,int acc,int num1) {
            Scanner sc = new Scanner(System.in);
            methods obj1 = new execute();
            atm obj = new atm();

您的代码应该在许多地方进行重构,但是对于第一个修补程序:用myAtm扩展您的方法:

        abstract void balanceInquiry(int pass,int num1,atm myAtm );
        abstract void withdrawal(int pass,atm myAtm);
        abstract void deposit(int pass,atm myAtm);

在您的obj.balanceInquiry(pass,acc,num1,this)类中像atm那样称呼他们,并替换所有atm obj = new atm();与atm obj = myAtm

,

问题是您通过调用new atm()在大多数方法中创建了一个新的atm对象。这样,您只能在该实例上进行操作,而方法之间不会共享该实例。

本文链接:https://www.f2er.com/2925488.html

大家都在问