超类的静态变量在子类创建中表现得很奇怪

时间:2013-02-25 20:42:56

标签: java variables inheritance static subclass

我正在研究一个经典的家庭作业程序,并且在我的生活中无法弄清楚为什么我的超类中的静态变量会以它的方式作出反应。

该程序是bankaccount,我创建了一个超类,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是唯一的对象时,没有子类,计数器工作得非常好。但是现在当我创建了一些可以计算存量和信用额度的新对象时,程序的行为非常奇怪,并返回如下的帐号:

           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

2 个答案:

答案 0 :(得分: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());
        }
    }
}

答案 1 :(得分:0)

多线程和单线程的概念对我来说坦率地说是全新的,但我尝试使用完全相同的结果制作AtomicInteger和volatile变量。我想这是我的程序结构基本上是错误的。

该构造是一个BankLogic类,它包含一个Customer对象的ArrayList。 Customer-objects包含Account-objects的ArrayList。在我放置AtomicInteger对象的位置并不重要,即使我将它放在BankLogic类中并将其传递给构造函数,它仍然会得到相同的结果。

猜猜我应该将accounts-ArrayList放在BankLogic-class中并运行比较personal-id(将persId-variable添加到帐户类)的方法呢? 它当然不会感觉像是一个优雅的解决方案,但我没有别的办法。

感谢所有答案!