2014-10-09 74 views
0

我有一個NullPointerException當我嘗試做這樣的事情的覆蓋方法:如何使用會員到稱爲超級構造

class A { 

    public A() { 
    aMethod(); 
    } 

    public void aMethod() { 
    //Some stuff 
    } 

} 

class B extends A { 

    List<String> list = new ArrayList<String> 

    public B() { 
    super(); 
    } 

    @Override 
    public void aMethod() { 
    super.aMethod(); 
    list.add("Something"); //NullPointerException 
    } 

} 

我不能在構造函數調用超級之前實例列表,我認爲將它實例化爲「aMethod」是不合適的。

+1

在我看來,這是一個錯誤的設計,因爲'A'的擴展器必須知道'A'的實現細節,'aMethod'直接在構造函數中調用,因此在'aMethod'中沒有字段可以在沒有明確地初始化它們的情況下使用。 – Smutje 2014-10-09 20:46:31

回答

2

這說明了從超類構造函數通過多態性調用子類方法的危險。

您的B構造函數顯式調用A的構造函數,它調用aMethod。但在這一點上,B中沒有任何內容被初始化,因此list仍然是null。這導致NullPointerException。直到對超類構造函數的調用完成之後,Java纔會初始化實例變量。

解決這個最好的辦法是到列表的初始化移動到構造:

方法:

super(); 
list.add("Something"); // No more NullPointerException 

它也最好不要打電話,可以在構造函數中被覆蓋的方法,因爲在superlcass構造函數中,對象的子類部分尚未初始化。

+0

謝謝! :) – 2014-10-09 21:12:34