2011-09-04 138 views
0

在創建一個Java程序,我遇到一個問題,的Java:繼承類構造函數調用超級

子類構造函數調用父類的方法

代碼拋出Error與此類似:

class Manage 
{ 
    public static void main(String[] args) 
    { 
     Manager m1 = new Manager (35); 
    } 
} 

class Employee 
{ 
     int emp_id; 
     public Employee(int id) 
     { 
       this.emp_id = id; 
     } 
     public int get_id() 
     { 
       return emp_id; 
     } 

} 
class Manager extends Employee 
{ 
     public Manager(int id) 
     { 
       this.emp_id = id ; 
     } 
} 

class Engineer extends Employee 
{ 
     public Engineer(int id) 
     { 
       this.emp_id = id ; 
     } 
} 

和錯誤是這樣的:

$ javac app.java 
app.java:25: cannot find symbol 
symbol : constructor Employee() 
location: class Employee 
     { 
     ^
app.java:33: cannot find symbol 
symbol : constructor Employee() 
location: class Employee 
     { 
     ^
2 errors 

爲什麼會發生這種情況?

回答

8

超類沒有默認的構造函數。所以,你需要適當的構造函數參數傳遞給超:

super(id); 

(將這個作爲ManagerEngineer構造都頂行。)您也應該刪除this.emp_id = id線,在這兩種情況下。

一般來說,如果你的構造不以super(...)this(...)語句啓動(和你只能有其中的一個,不是兩個),那麼它默認使用super()(不帶參數)。

3

由於您已經指定了帶參數的構造函數,因此Java不提供沒有參數的默認構造函數。您應該自己創建一個,或者通過使用super(id)作爲擴展類構造函數的第一行來顯式調用您創建的構造函數。

1

產生的錯誤,因爲你沒有在員工

class Employee { 

    private int emp_id; 

    public Employee() { 
    } 

    public Employee(int id) { 
      this.emp_id = id; 
    } 

    public int get_id() { 
      return emp_id; 
    } 

} 

定義默認構造函數(沒有參數),但也有幾點考慮:您是通過構造函數設置emp_id和定義的吸氣劑讀取它。看來這個領域本來就是私人的。否則,您可以直接訪問。

你已經在Employee中有一個構造函數了,這個ID不需要在同一個類中定義相同的構造函數。只需使用超類的構造函數即可。

class Manager extends Employee { 

    public Manager(int id) { 
     super(id); // calls the superclass constructor 
    } 

} 

在這種情況下,您不需要默認構造函數。

1

在java中,子類構造函數總是調用其父類的構造函數之一。這對於課程正確初始化是必要的。即使它是子類,字段和狀態也必須設置,這是如何在java中完成的。如果沒有明確指定,它將調用默認的無參數構造函數。