2012-11-05 19 views
0

我有延伸的B級和覆蓋了一個方法createBody()這被稱爲在父構造A類:如何在超類構造函數中使用子類的屬性?

public class A extends B { 

    SomeClass x = null 

    public A(int parameter) { 
     super(parameter); 
     //do something with atributte x 
    } 

    createBody() { 
     //do some stuff 
     //assign attribute x 
    } 
} 


public class B { 

    public B(int parameter) { 
     //do some stuff 
     createBody(); 
    } 

    abstract public void createBody(); 
} 

正如你可以看到,該方法createBody()修改x屬性。我的問題是,x屬性仍然是null超類構造函數完成後(當我創建子類的實例時)。我究竟做錯了什麼?

+4

除非B聲明方法'createBody()'爲具體或抽象方法,否則不會編譯。請顯示_actual_代碼。 –

+0

我會的,謝謝。 –

+0

爲什麼這個方法在子類而不是父類中? –

回答

3

我可以警告你,你在這裏危險的水域。在你的工作中,你可能會意識到你想在超類構造函數中調用createBody,但是在子類中實現它。通過這種方式,您可以在子類的初始化開始之前將控制權轉移給子類方法。例如,在這一點上,即使是一條線,如

private final String x = "string"; 

尚未運行,x爲空。這是Java的一個反成語,你應該不惜一切代價避免它。

0

你的超類有一個抽象方法

`abstract public void createBody();` 

聲明超類爲abstract,因爲超類必須是一個抽象類定義的抽象方法。

其次,你不應該從超類的構造函數 中調用createBody方法,因爲它可能使用了甚至不能被初始化的變量。

//do some stuff 
//assign attribute x <--- never do such stuffs 
相關問題