Java:inheritance的类构造函数正在调用Super类

在创建java程序时我遇到了问题,

子类构造函数通过调用Superclass的方法抛出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 

为什么会这样?

超类没有默认构造函数。 所以你需要将适当的构造函数参数传递给超类:

 super(id); 

(将其作为ManagerEngineer构造函数中的顶行。)在两种情况下,还应删除this.emp_id = id行。

通常,如果你的构造函数不是以super(...)this(...)语句开头(并且你只能有其中一个,而不是两者),那么它默认使用super() (with没有参数)。

由于您已经使用参数指定了构造函数,因此Java不提供没有参数的默认构造函数。 您应该自己创建一个,或者通过在扩展类构造函数中使用super(id)作为第一行来显式调用您创建的构造函数。

由于您未在Employee中定义默认构造函数(无参数),因此生成错误

 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并定义了一个getter来读取它。 这个领域似乎是私人的。 否则你可以直接访问。

您在Employee中已经有一个构造函数设置ID,无需在同一个类中定义相同的构造函数。 只需使用超类的构造函数。

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

在这种情况下,您不需要默认构造函数。

在java中,子类构造函数总是调用其父类的构造函数之一。 这是正确初始化类所必需的。 即使它是子类,也必须设置字段和状态,这就是它在java中的完成方式。 如果没有显式指定,则调用默认的no-arg构造函数。