2013-02-10 3 views
1

У меня возникли проблемы с доступом к члену данных суперкласса из его подкласса.Как получить член данных суперкласса из подкласса

Так что я суперкласс магазин как этот

public class Store { 
    protected ArrayList<Audiobooks> ab; 

    public Store(ArrayList<Audiobooks> ab) 
    { 
     this.ab = ab; 
    } 
    ... 
} 

аб инициализируется и все, то есть подкласс, как этот

public class Customer extends Store { 

    ... 
    public Customer(String id, String name, String address) 
{ 
    this.id = id; 
    this.name = name; 
    this.address = address; 
    } 
    public void printAb(){ 
     for(int i = 0; i<ab.size(); i++){ 
      System.out.println(ab.get(i).toString()); 
     } 
    } 
} 

Я в конечном итоге получить нулевую ошибку указатель исключения. Когда функция помещается в класс хранилища, она работает нормально, но когда в клиентском подклассе возникает исключение нулевого указателя.

Я попытался получить его с помощью super.ab .... но без успеха.

Спасибо за понимание.

+0

** Где ** вы получаете исключение? Какова трассировка стека? – SLaks

+0

Это потому, что из данного кода 'ab' не создается экземпляр (' new ArrayList () '). – pickypg

+0

Где 'ab' инициализируется в суперклассе? – mre

ответ

1

Правильно вы используете свойство ab (иначе у вас возникла бы ошибка компилятора).

Скорее всего, вы не создаете объект в любом месте, попробуйте сделать

protected ArrayList<Audiobooks> ab = new ArrayList<Audiobooks>(); 

Кроме того, было бы лучше, если вы используете наиболее общий интерфейс List

protected List<Audiobooks> ab = new ArrayList<Audiobooks>(); 
+0

Извините, если я не сформулировал это ясно из моего запроса вопроса, но есть тестовый драйвер, и объект ab создается.Если я просто переместим функцию printAb в класс Store и вызову ее из объекта store, она будет работать нормально. Проблема связана с этой функцией в классе клиентов. Если я переместим функцию printAB в класс клиента, я получаю исключение с нулевым указателем. – wzsun

+0

Возможно, вы используете другой конструктор в подклассе (я предполагаю, что этому атрибуту назначен объект). Что такое код для конструкторов в 'Store' и' Customer'? – SJuan76

+0

Я добавил код конструктора для магазина и клиента – wzsun

3

Ваш Customer конструктор не вызывает вы создаете конструктор Store, поэтому список ab не создается.

Чтобы решить эту проблему, вам необходимо либо иметь свой конструктор клиента назвать магазин конструктор:

public Customer(String id, String name, String address) { 
    super(new ArrayList<Audiobooks>()); 
    this.id = id; 
    this.name = name; 
    this.address = address; 
} 

Или ваш конструктор клиента экземпляр списка. У вас также должно быть несколько конструкторов для класса хранилища, иначе компилятор заставит вас вызвать конструктор, который вы показываете. Вы можете захотеть избавиться от пустого конструктора, который, по-видимому, у вас есть в классе магазина, если он не помещает класс в допустимое состояние.

0

Попробуйте сделать это.

public class Customer extends Store { 

    ... 
    public Customer(ArrayList<Audiobooks> a,String id, String name, String address) 
{ 
    super(a); 
    this.id = id; 
    this.name = name; 
    this.address = address; 
    } 
    public void printAb(){ 
     for(int i = 0; i<ab.size(); i++){ 
      System.out.println(ab.get(i).toString()); 
     } 
    } 
} 

или сделать это

public class Customer extends Store { 

     ... 
     public Customer(String id, String name, String address) 
    { 
     a=new ArrayList<Audiobooks>(/*initial size*/); 
     this.id = id; 
     this.name = name; 
     this.address = address; 
     } 
     public void printAb(){ 
      for(int i = 0; i<ab.size(); i++){ 
       System.out.println(ab.get(i).toString()); 
      } 
     } 
    } 
Смежные вопросы