2015-03-03 2 views
0

У меня есть связанный список учетных записей, содержащих сотрудников и менеджеров (унаследованных от учетной записи). Проблема в том, что я заметил, что последний добавленный элемент, похоже, перезаписывает остальное в списке. Почему он это делает? что я делаю неправильно? Благодарю. Я поставлю свой код ниже и консольный вывод. Извините заранее, если я действительно глуп и пропущу что-то очевидное!Переписанный элемент связанного списка Java?

public class Database { 
static List <Account> Accounts = new LinkedList<Account>(); 

public static void main(String[] args) { 
     Employee Geoff = new Employee("Geoff", "password1"); 
     Manager Bob = new Manager("Bob", "password2"); 
     Employee John = new Employee("John", "password3"); 

     Accounts.add(Geoff); 
     Accounts.add(Bob); 
     Accounts.add(John); 
     list(); 
    } 

public static void list() { 
    for (Account u : Accounts) { 
      System.out.println(u); 
    } 
} 

Консоль Выход:

John, John, John 

:(

Edit: код был изменен извините ребята

public abstract class Account { 

    protected static String name; 
    protected static String passcode; 


    public User(String name, String passcode) { 
     this.name = name; 
     this.passcode = passcode; 
    } 
} 

Оба менеджера и сотрудника наследовать от этого так и для менеджера :

public Manager(String name, String passcode) { 
    super(name, passcode); 

} 
+0

что такое 'list'? вы имеете в виду «меню»? можете ли вы обрезать код до минимума и показать полную программу? – HuStmpHrrr

+0

Что такое 'Пользователи'? Что такое 'list()'? –

+0

Попробуйте отправить код, который фактически компилируется. Что делает метод 'list()'? Когда вызывается 'menu()'? –

ответ

4

Удалить ключевое слово `static из декларации полей, и оно будет работать нормально.

static переменные связаны с классом, а не с объектом. Это означает, что эти поля распределяются между каждым экземпляром этого класса.

0

Переменные класса (статические) будут иметь только один экземпляр, который разделяется между всеми инициализациями класса. Это означает, что каждый раз, когда вы говорите «this.name», он семантически эквивалентен высказыванию «User.name», поскольку «this» относится к экземпляру, а не к классу.

Измените переменные класса (статические переменные) на переменные экземпляра (нестатические переменные), и все будет работать так, как вы ожидаете.

Вот документация, объясняющая переменные экземпляра класса vs.

http://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html

+0

Спасибо :), поэтому, если бы я хотел сравнить, если какое-то имя содержится в потерянных, я должен вообще избегать статических переменных? – aluckii

+0

Да, вы должны. Убедитесь, что вы точно понимаете, что статично, прежде чем использовать его в программе, иначе вы столкнетесь с непонятным поведением. Книга «Эффективная Ява» (http://www.amazon.ca/Effective-Java-Edition-Joshua-Bloch/dp/0321356683) - это действительно хорошее чтение и очень хорошо охватывает все эти вещи и лучшие практики. – jmh

+0

Я обязательно буду смотреть на эту книгу! благодаря – aluckii

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