Java的。 隐式超级构造函数Employee()未定义。 必须显式调用另一个构造函数

您好我是Java的新手,我在生产工人类中遇到此错误。 我的生产工作者构造函数说显式调用另一个构造函数。 我不知道该怎么办?。

import java.util.Date; public class Employee { private String name, number; private Date date; public Employee(String name, String number, Date date) { setName(name); setNumber(number); setDate(date); } public void setName(String n) { name = n; } public void setNumber(String n) { number = n; // you can check the format here for correctness } public void setDate(Date d) { date = d; } public String getName() { return name; } public String getNumber() { return number; } public Date getDate() { return date; } } public class ProductionWorker extends Employee { private int shift; private double hourlyrate; // error is here (Implicit super constructor Employee() is undefined. Must explicitly invoke another constructor). public ProductionWorker(int shift, double hourlyrate) { setShift(shift); setHourlyPayRate(hourlyrate); } public void setShift(int s) { shift = s; } public void setHourlyPayRate(double rate) { hourlyrate = rate; } public int getShift() { return shift; } public double getHourlyPayRate() { return hourlyrate; } } 

您知道的任何类的任何构造函数都会创建一个对象。 因此,构造函数应包含其类的正确初始化代码。 但是如果你有一些扩展另一个的类(让我们称之为“父”),那么类的构造函数不能包含按定义初始化所需的所有代码(例如,你不能定义父类的私有字段)。 这就是为什么类的构造函数必须调用其父类的构造函数。 如果没有显式调用它,则调用默认的父构造函数(没有任何参数)。

因此,在您的情况下,您可以在父实现默认构造函数,也可以直接调用类中的任何构造函数。

正如其他人已经提到的那样,您需要在Employee类中提供默认构造函数public Employee(){}

会发生什么是编译器自动为没有构造函数的任何类提供无参数的默认构造函数。 如果你的类没有显式的超类 ,那么它有一个隐式的超类Object ,它有一个无参数的构造函数 。 在这种情况下,您在类Employee中声明构造函数,因此您还必须提供无参数构造函数。

说过Employee类应该是这样的:

你的class级员工

 import java.util.Date; public class Employee { private String name, number; private Date date; public Employee(){} // No-argument Constructor public Employee(String name, String number, Date date) { setName(name); setNumber(number); setDate(date); } public void setName(String n) { name = n; } public void setNumber(String n) { number = n; // you can check the format here for correctness } public void setDate(Date d) { date = d; } public String getName() { return name; } public String getNumber() { return number; } public Date getDate() { return date; } } 

这是Java Oracle教程 – 为您的类提供构造函数章节。 通过它,您将更清楚地了解发生了什么。

ProductionWorker扩展了Employee ,因此据说它具有Employee的所有function。 为了实现这一点,Java自动放置一个super(); 在每个构造函数的第一行调用,你可以手动放置,但通常没有必要。 在你的情况下,因为调用super(); 由于Employee的构造函数具有参数,因此无法自动放置。

您需要在Employee类中定义默认构造函数,或者调用super('Erkan', 21, new Date()); 在ProductionWorker中的构造函数的第一行。

只要父类缺少无参数构造函数,就需要显式调用父类构造函数。 您可以向父类添加无参数构造函数,也可以在子类中显式调用父类构造函数。

最近我的comp实验室出现了这个问题。 这很简单,Erkan正确回答。 只需将super("the name of your subclass")与你的问题相关联 – > super("ProductionWorker);作为subclass'的第一行subclass'构造函数。

当你没有你的构造函数立即调用super时,也会出现这个问题。

这样可行:

  public Employee(String name, String number, Date date) { super(....) } 

但这不会:

  public Employee(String name, String number, Date date) { // an example of *any* code running before you call super. if (number < 5) { number++; } super(....) } 

第二个例子失败的原因是因为java试图隐含地调用

 super(name,number,date) 

作为构造函数中的第一行....所以java没有看到你后来在构造函数中调用了super。 它本质上试图这样做:

  public Employee(String name, String number, Date date) { super(name, number, date); if (number < 5) { number++; } super(....) } 

所以解决方案很简单......只是不要在超级调用之前放置代码;-)如果你需要在调用super之前初始化一些东西,在另一个构造函数中执行,然后调用旧的构造函数... Like在此示例中从此StackOverflowpost中拉出 :

 public class Foo { private int x; public Foo() { this(1); } public Foo(int x) { this.x = x; } }