2013-02-10 62 views
1

我無法從其子類訪問超類數據成員。如何從子類獲取超類數據成員

所以我有這樣

public class Store { 
    protected ArrayList<Audiobooks> ab; 

    public Store(ArrayList<Audiobooks> ab) 
    { 
     this.ab = 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()); 
     } 
    } 
} 

我最終得到一個空指針異常錯誤的子類。當函數放入商店類中時,它可以正常工作,但是當它在子類Customer中發生空指針異常時。

我試圖通過使用super.ab ....但沒有成功。

感謝您的任何見解。

+0

** **在哪裏,你得到的異常?什麼是堆棧跟蹤? – SLaks 2013-02-10 02:19:48

+0

這是因爲,從給定的代碼,'ab'沒有實例化('new ArrayList ()')。 – pickypg 2013-02-10 02:20:01

+0

超類中的'ab'初始化在哪裏? – mre 2013-02-10 02:21:42

回答

1

您正確訪問ab屬性(否則您將會遇到編譯器錯誤)。

最有可能你沒有創建該對象的任何地方,嘗試做

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

另外,如果你使用的最一般的接口List

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

對不起,如果我沒有從我的問題提示中清楚地說明它,但是,有一個測試驅動程序和ab對象被實例化。如果我只是將printAb函數移動到Store類並從商店對象中調用它,它就可以正常工作。問題是在客戶類中具有該功能。如果我將printAB函數移入客戶類,那麼我會得到一個空指針異常。 – wzsun 2013-02-10 02:24:52

+0

也許你在子類中使用了不同的構造函數(我假設該屬性在那裏被分配了一個對象)。 「Store」和「Customer」中構造函數的代碼是什麼? – SJuan76 2013-02-10 02:28:06

+0

我添加了商店和客戶的構造函數代碼 – wzsun 2013-02-10 02:35:35

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()); 
      } 
     } 
    }