java银行计划帐户ID不上升?
每次创建一个银行帐户时,帐户ID应该提高一个,但每次我尝试提取ID我只是得到帐户ID为0,任何建议,因为我按照它在书中的确切方式我是从中学习它仍然没有更新。
帐户构造函数:
public class BankAccount { public static int bankID = 0; //constructor called by BankAccount michaelsBank = new BankAccount(); public BankAccount(){ balance = 0; lastAssignedNumber++; accountNumber = lastAssignedNumber; } //Constructs a bank account with an initial deposit, will be used if given a number for a parameter public BankAccount(double initialBalance){ balance = initialBalance; } public void deposit(double amount){ balance = balance + amount; } public void withdraw(double amount){ balance = balance - amount; } public double getBalance(){ return balance; } public int getID(){ return accountNumber; } private double balance; private int accountNumber; private static int lastAssignedNumber; }
银行账户主程序:
import java.text.*; public class BankAccountTest { public static void main (String args[]){ NumberFormat formatter = NumberFormat.getNumberInstance(); formatter.setMaximumFractionDigits(2); // Helps formatter format for final output formatter.setMinimumFractionDigits(2); ConsoleReader console = new ConsoleReader(System.in); System.out.println("Hello, would you like to make a new bank account?"); String newA = console.readLine(); if(newA.equalsIgnoreCase("yes")){ System.out.println("How much would you like to deposit initially?"); double init = console.readDouble(); BankAccount account = new BankAccount(init); System.out.println("Your account is created, what would you like to do? \n 1: Get Balance \n 2: Get Account ID \n 3: Make a Withdrawl \n 4: Make a Deposit"); int option = console.readInt(); while(option == 1){ System.out.println(account.getBalance() + " Is your balance. \nWhat would you like to do next?"); System.out.println("1: Get Balance \n 2: Get Account ID \n 3: Make a Withdrawl \n 4: Make a Deposit"); option = console.readInt(); } while(option == 2){ System.out.println(account.getID() + " Is your account id.\nWhat would you like to do next?"); System.out.println("1: Get Balance \n 2: Get Account ID \n 3: Make a Withdrawl \n 4: Make a Deposit"); option = console.readInt(); } while(option == 3){ System.out.println("How much would you like to withdraw?"); double withdraw = console.readDouble(); account.withdraw(withdraw); System.out.println("Your new balance is " + account.getBalance() + "\nWhat would you like to do next?"); System.out.println("1: Get Balance \n 2: Get Account ID \n 3: Make a Withdrawl \n 4: Make a Deposit"); option = console.readInt(); } while(option == 4){ System.out.println("How much would you like to deposit?"); double deposit = console.readDouble(); account.deposit(deposit); System.out.println("Your new balance is " + account.getBalance() + "\n what would you like to do next?"); System.out.println("1: Get Balance \n 2: Get Account ID \n 3: Make a Withdrawl \n 4: Make a Deposit"); option = console.readInt(); } } } }
您有一种无组织的构造BankAccount对象的方法,无论您是否获得ID,都取决于您使用的构造函数。 如果重写构造函数以便它们被链接在一起,主要构造函数负责所有核心职责,而辅助构造函数将默认值和委托分配给主要构造函数,则初始化将具有一致的结果。
(术语是Scala的,构造函数链接在该语言中是强制性的。)
这里的主要构造函数是:
public BankAccount(double initialBalance){ balance = initialBalance; lastAssignedNumber++; accountNumber = lastAssignedNumber; }
并添加辅助构造函数:
public BankAccount() { this(0); }
无论你打电话给谁,你都会得到一个id。
(这类似于Lorenzo的答案 ,我为了清楚地描述问题而投票。不同之处在于他的链接朝另一个方向发展,因此默认值被分配然后被覆盖。)
代码正在调用:
BankAccount account = new BankAccount(init);
转到这个构造函数:
public BankAccount(double initialBalance){ balance = initialBalance; }
如果你还想要调用其他构造函数(分配id的那个),你需要改变它如下:
public BankAccount(double initialBalance){ this(); balance = initialBalance; }
如果你不告诉它,Java不会调用默认构造函数。
你可以试试这个
private int accountNumber = ++lastAssignedNumber; private static int lastAssignedNumber; public BankAccount(){ balance = 0; //No need to increment it anywhere. //lastAssignedNumber++; //accountNumber = lastAssignedNumber; }
要么
你可以尝试initialization block
private int accountNumber; private static int lastAssignedNumber; //initialization block that will be called for any overloaded constructor also { accountNumber = ++lastAssignedNumber; } public BankAccount(){ balance = 0; //No need to increment it anywhere. //lastAssignedNumber++; //accountNumber = lastAssignedNumber; }