2013-02-25 265 views
0

我工作的一個典型的家庭作業程序,並不能爲我的生命弄清楚爲什麼我的超類中的靜態變量的反應方式是這樣..靜態變量

的程序是一個銀行帳戶,我創建了超類Account和兩個子類CreditAccount和SavingsAccount。

public abstract class Account { 

    private double balance; 
    private int accountId; 
    **private static int lastAssignedNumber = 1000;** <--- the static int 
    private String accountType; 

    public Account (double q_balance, String q_accountType) 
    { 
    balance = q_balance; 
    accountType = q_accountType; 
    **accountId = ++lastAssignedNumber; <------ counter for new accountId** 
    } 

) 

public class CreditAccount extends Account { 

    public CreditAccount(double balance) 
    { 
    super(balance, "Creditaccount"); 
    } 

} 

public class SavingsAccount extends Account { 

    public SavingsAccount(double balance) 
    { 
    super(balance, "Savingsaccount"); 
    } 

} 

以前,沒有子類當Account是唯一的對象時,計數器工作得很好。但現在,當我創建savingsaccount的一些新的對象和creditaccounts程序的行爲很古怪,並按如下返回accountnumbers:

  new SavingsAccount(0); // **1001** 
    new CreditAccount(0); // **1001** 
    new CreditAccount(0); // **1002** 
    new SavingsAccount(0); // **1003** 
    new CreditAccount(0); // **1002** 
    new CreditAccount(0); // **1004** 
    new SavingsAccount(0); // **1005** 

在神的名字發生了什麼事?我錯過了什麼?不應該這兩個子類激發相同的靜態變量'lastAssignedNumber'並相應地添加它?

最親切的問候// Gewra

+4

您是否使用多個線程?增量前後運算符不是原子的,因此跨多個線程執行的操作可能會交織併產生意外的結果。 – 2013-02-25 20:44:09

+1

你應該同步這些。 – 2013-02-25 20:46:40

+1

你可以發佈你實際創建這些不同帳戶的地方,以及你如何檢索他們的accountId? – asteri 2013-02-25 20:46:47

回答

0

沒有什麼不對您的代碼,因爲你是在單線程模式創建帳戶。 你下面的代碼工作絕對沒問題:

abstract class Account 
{ 

    private double balance; 
    private int accountId; 
    private static int lastAssignedNumber = 1000; 
    private String accountType; 

    public Account (double q_balance, String q_accountType) 
    { 
     balance = q_balance; 
     accountType = q_accountType; 
     accountId = ++lastAssignedNumber; 
    } 
    public int getAccountID() 
    { 
     return accountId; 
    } 

} 
class CreditAccount extends Account 
{ 
    public CreditAccount(double balance) 
    { 
     super(balance, "Creditaccount"); 
    } 

} 
class SavingsAccount extends Account 
{ 
    public SavingsAccount(double balance) 
    { 
     super(balance, "Savingsaccount"); 
    } 
} 
public class AccountLedger 
{ 
    public static void main(String st[]) 
    { 
     Account ac[] = new Account[7]; 
     ac[0] = new SavingsAccount(0); //1001 
     ac[1] = new CreditAccount(0); //1002 
     ac[2] = new CreditAccount(0); //1003 
     ac[3] = new SavingsAccount(0); //1004 
     ac[4] = new CreditAccount(0); //1005 
     ac[5] = new CreditAccount(0); //1006 
     ac[6] = new SavingsAccount(0); //1007 
     for (int i = 0 ; i < ac.length ; i++) 
     { 
      System.out.println(ac[i].getAccountID()); 
     } 
    } 
} 
0

的多和singlethreading的概念坦言完全新的給我,但我試圖使既有的AtomicInteger並用完全相同的結果volatile變量。我想這是我的程序結構,基本上是錯誤的。

該構造是一個BankLogic類,它持有一個CustomerList對象的ArrayList。 Customer對象持有AccountList對象的ArrayList。我放置AtomicInteger對象的位置並不重要,儘管我將它放在BankLogic類中並將它傳遞給構造函數,但它仍然顯示出相同的結果。

猜猜我應該只將帳號ArrayList放入BankLogic類,然後運行一個比較personal-id(將persId變量添加到帳號類)的方法呢?它當然不會像這樣一個優雅的解決方案,但我沒有看到其他方式。

感謝您的所有答案!