2012-01-02 4 views
1

Я просто хочу убедиться, что я поступаю правильно. У меня есть подкласс счет, а затем два подкласса SavingsAccount и CreditAccount и я хочу, чтобы хранить их в ArrayList, но когда я делаю, как это я получаю ошибкуДобавление объектов в список?

List<Account> accountList = new ArrayList<Account>(); 
// creditaccount 
Account account = new CreditAccount(); 
list.add(account); 

// savingsaccount 
Account account = new SavingsAccount(); 
list.add(account); 

Я думал, что я мог бы просто добавить их, как это, но я предположим, должно быть уникальное имя, подобное этому ...

Account account1 = new SavingsAccount(); 
list.add(account1); 

... или я его не понимаю? Я новичок в этом, так что помогите мне превзойти! Благодаря!

ответ

5

Вы правы, имена переменных уникальны в заданной области (локальная переменная типа in-method vs.). Тем не менее, так как это объектно-ориентированный вы можете использовать переменную, как это только ссылается на данный объект:

List<Account> accountList = new ArrayList<Account>(); 
// creditaccount 
Account account = new CreditAccount(); 
list.add(account); // <-- adds the creditAccount to the list 

// savingsaccount 
account = new SavingsAccount(); // <-- reuse account 
list.add(account); // <-- adds the savingsAccount to the list 

Лично мне не нравится такой подход и достаточно использовать понятные имена, как:

Account creditAccount = new CreditAccount(); 
Account savingsAccount = new SavingsAccount(); 
... 
list.add(creditAccount); 
list.add(savingsAccount); 

UPDATE 1: Если вы не должны дополнительно инициализировать объекты учетной записи вы можете просто сделать это:

list.add(new CreditAccount()); 
list.add(new SavingsAccount()); 

UPDATE 2: Я забыл упомянуть, что есть «более продвинутый» подход с использованием анонимных внутренних блоков, что позволяет объявить переменную несколько раз внутри метода:

void someMehtod() { 
    List<Account> accountList = new ArrayList<Account>(); 

    { // <-- start inner block 
     Account account = new CreditAccount(); 
     accountList.add(account); 
    } // <-- end inner block 

    { 
     Account account = new SavingsAccount(); 
     accountList.add(account); 
    } 

    account.toString() // compile time error as account is not visible! 

} 
+0

Итак, если я впервые объявлю так: Учетная запись; а затем: account = new CreditAccount(); и account = new SavingsAccount(); Я могу использовать одну и ту же учетную запись переменной –

+0

Ответ на ваше последнее изменение: Затем я должен сделать объявление для каждой переменной для учетной записи, например: Account creditAccount; и Account AccountAccount; ? –

+0

Да, но вы должны работать с прежним объектом учетной записи, иначе вы переопределите ссылку при назначении нового объекта. Если вы не знакомы с этим подходом или объектной ориентацией в целом, я рекомендую сделать некоторые простые тесты, чтобы понять концепцию, например. используя класс java.lang.String. (ответьте на ваш первый комментарий). – home

2

экаунта = новый SavingsAccount();
Это даст ошибку времени компиляции. Вы не можете объявить учетную запись дважды. Измените вышеуказанный отчет на account = new SavingsAccount();

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