我的目标是使用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, acc, num1);}
else if(s == 3){obj.deposit(pass, acc, num1);}
else{System.out.println("Thank You!");System.out.println("");System.out.println("");atm.main(null);}
}
void withprod(int with, int pass, int acc, 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, acc, num1);
}else if(ans == 2){
obj1.withdrawal(pass,acc,num1);
}
}
abstract class methods{
abstract void balanceInquiry(int pass, int acc, int num1);
abstract void withdrawal(int pass, int acc, int num1);
abstract void deposit(int pass, int acc, int num1);
}
class execute extends methods{
@Override
void balanceInquiry(int pass, int acc, 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, acc, num1);}
else{obj.mMenu(pass, acc, num1);}
System.out.println("");
System.out.println("");
}
@Override
void withdrawal(int pass, int acc, 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,acc,num1);}
else if (ans == 1){int with = 20;obj.withprod(with,pass,acc,num1);}
else if (ans == 2){int with = 40;obj.withprod(with,pass,acc,num1);}
else if (ans == 3){int with = 60;obj.withprod(with,pass,acc,num1);}
else if (ans == 4){int with = 100;obj.withprod(with,pass,acc,num1);}
else if (ans == 5){int with = 200;obj.withprod(with,pass,acc,num1);}
else if (ans == 6){System.out.print("Please enter the amount you wish to Withdraw: $ ");int with = sc.nextInt(); obj.withprod(with,pass,acc,num1);}
else{System.out.println("ERROR: Invalid Input.\n Please Try Again");obj1.withdrawal(pass, acc, num1);}
}
@Override
void deposit(int pass, int acc, 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,acc,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, acc, num1);
}else{obj1.deposit(pass, acc, num1);}
}else if(ans == 2){
obj1.deposit(pass,acc,num1);
}
}
}
}
}
据我所知,您的代码,withdraw
和disposit
方法与atm
-Class或彼此之间不共享任何信息。您的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 acc, int num1, atm myAtm );
abstract void withdrawal(int pass, int acc, int num1, atm myAtm);
abstract void deposit(int pass, int acc, int num1, atm myAtm);
在您的obj.balanceInquiry(pass, acc, num1, this)
类中像atm
一样调用它们,并替换所有atm obj = new atm()
;用atm obj = myAtm
。
问题是您通过调用new atm()
在大多数方法中创建了一个新的atm对象。这样,您只能在该实例上操作,方法之间不会共享。