0

I'm working on a classic homework program and cannot for the life of me figure out why my static variable in the superclass reacts the way it does..

The program is a bankaccount where I have created a superclass, Account, and two subclasses, CreditAccount and 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");
  }

}

Previously, without subclasses when Account was the only object, the counter worked beautifully. But now when I create some new objects of savingsaccount and creditaccounts the program acts really weird and returns accountnumbers as follows:

           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**

What in gods name is happening?! What am I missing? Shouldn't the two subclasses provoke the same static variable 'lastAssignedNumber' and add to it accordingly??

Kindest regards // Gewra

4

2 に答える 2

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());
        }
    }
}
于 2013-02-25T21:15:15.787 に答える
0

マルチスレッドとシングルスレッドの概念は、率直に言ってまったく新しいものですが、AtomicInteger 変数と volatile 変数の両方をまったく同じ結果で作成しようとしました。根本的に間違っているのは、私のプログラムの構造だと思います。

コンストラクトは、Customer オブジェクトの ArrayList を保持する BankLogic クラスです。Customer オブジェクトは、Account オブジェクトの ArrayList を保持します。AtomicInteger オブジェクトを配置する場所は問題ではありません。BankLogic クラスに配置してコンストラクターに渡しますが、同じ結果が得られます。

accounts-ArrayList を BankLogic クラスに配置し、代わりに個人 ID を比較するメソッドを実行する (persId 変数を account クラスに追加する) べきだと思いますか? 確かに、これほど洗練されたソリューションとは思えませんが、他に方法はありません。

すべての答えをありがとう!

于 2013-02-26T12:53:34.520 に答える