2012-02-04 21 views
2

我是Java的新手,剛剛學習OOP概念。請查看我的代碼。我收到以下錯誤.- 隱式超級構造函數未定義。Java繼承錯誤:隱式Super Constructor未定義

class BoxSuper 
{ 
    int height; 
    int length; 
    int width; 

    BoxSuper(BoxSuper obj) 
    { 
     height=obj.height; 
     length=obj.length; 
     width=obj.width; 
    } 
    BoxSuper(int a,int b,int c) 
    { 
     height=a; 
     length=b; 
     width=c; 
    } 
    BoxSuper(int val) 
    { 
     height=length=width=val; 
    } 
    int volume() 
    { 
     return height*length*width; 
    } 
} 

class BoxSub extends BoxSuper 
{ 
    int weight; 
    BoxSub(int a,int b,int c,int d) 
    { 
     height=a; 
     length=b; 
     width=c; 
     weight=d; 
    } 
} 
+0

我無法添加我的code.How做我添加它? – Teja 2012-02-04 18:32:04

+0

點擊您的問題下方的「編輯」並剪切並粘貼代碼。突出顯示代碼並按下'ctrl-K'將其正確格式化。 – sverre 2012-02-04 18:32:54

+0

請注意,還有一個[Markdown FAQ /編輯幫助](http://stackoverflow.com/editing-help),編輯時可通過橙色的'?'訪問。 – stakx 2012-02-04 18:34:40

回答

10

您收到此錯誤是因爲BoxSuper沒有無參數構造函數。在BoxSub的構造函數調用期間,如果您未定義超級構造函數調用,Java會嘗試自動調用no-arg super()構造函數。

要麼定義BoxSuper超級構造函數調用就像這樣:

class BoxSub extends BoxSuper 
{ 
    int weight; 
    BoxSub(int a,int b,int c,int d) 
    { 
     super(a, b, c); 
     weight=d; 
    } 
} 

或定義BoxSuper一個無參數的構造函數:

class BoxSuper 
{ 
    int height; 
    int length; 
    int width; 

    BoxSuper(){} 
... 
+1

如果我是你,我會改用super(a,b,c)調用並利用已經定義的BoxSuper中的構造函數。好吧,祝你好運,學習。 – 2012-02-04 19:30:21

7

構造函數總是調用超級構造,總是。如果沒有對超級構造函數進行顯式調用,那麼編譯器會嘗試設置它,以便它將調用默認的無參數構造函數。如果缺省的無參數構造函數不存在,則顯示編譯錯誤,編譯將失敗。

你的情況的解決方法是明確調用相應的超級構造函數的Box的構造函數的第一行,這非常有意義太多,如果你考慮一下,因爲你要初始化一個超,B ,和c一樣寫在它的構造函數中:

class BoxSub extends BoxSuper 
{ 
    int weight; 
    BoxSub(int a,int b,int c,int d) 
    { 
     super(a, b, c); 
     // height=a; 
     // length=b; 
     // width=c; 
     weight=d; 
    } 
} 
+0

試過這個..它不工作......但在這裏我的擔心是子類繼承了我的代碼中的超類的所有變量和方法。爲什麼它仍然拋出未定義的構造函數? – Teja 2012-02-04 18:55:08

+1

@Venk:嗯,「它不起作用」並沒有說明我們多少。您仍然有一個錯誤,並且需要向我們展示您更新的代碼嘗試以及您看到的任何錯誤消息。 – 2012-02-04 18:56:36

+0

@Venk,你是什麼意思,它不工作?你看到什麼錯誤? – mre 2012-02-04 18:57:48