2013-02-25 2 views
0

Я работаю на классической программе домашнее задание и не могу за жизнь мне понять, почему моя статическая переменная суперкласса реагирует так, как это делает ..Статическая переменная суперкласса действующего странно в подклассе порождений

программа - это банковский счет, где я создал суперкласс, учетную запись и два подкласса, 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"); 
    } 

} 

Раньше без подклассов, когда Счет был единственным объектом, счетчик работал красиво. Но теперь, когда я создаю новые объекты 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

Вы используете несколько потоков? Операторы pre и post-increment не являются атомарными, поэтому операции, выполняемые для нескольких потоков, могут чередовать и создавать неожиданные результаты, подобные этим. –

+1

Возможно, вы должны синхронизировать их. – 2013-02-25 20:46:40

+1

Можете ли вы опубликовать, где вы на самом деле создаете эти различные учетные записи, а также как вы извлекаете их 'accountId'? – asteri

ответ

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 и летучий переменную с точно таким же результатом. Я думаю, что моя структура программы является фундаментальной ошибкой.

Конструкция - это класс BankLogic, содержащий ArrayList объектов Customer. Объекты Customer содержат ArrayList объектов Account. Неважно, где я помещаю объект AtomicInteger, даже если я поместил его в класс BankLogic и передал его конструктору, он все равно будет получать те же результаты.

Предположим, я должен просто разместить учетные записи-ArrayList в классе BankLogic и запустить метод сравнения личных идентификаторов (добавив переменную persId в класс-аккаунт)? Это, конечно, не похоже на такое элегантное решение, но я не вижу другого пути.

Спасибо за все ответы!

Смежные вопросы