您好我是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;
}
}
答案 0 :(得分:28)
您知道的任何类的任何构造函数都会创建一个对象。因此,构造函数应包含其类的正确初始化代码。但是如果你有一些扩展另一个类的类(让我们称之为“父”),那么类的构造函数不能包含按定义初始化所需的所有代码(例如,你不能定义父类的私有字段)。这就是为什么类的构造函数必须调用其父类的构造函数。如果没有显式调用它,则调用默认的父构造函数(没有任何参数)。
因此,在您的情况下,您可以在父实现中实现默认构造函数,也可以直接调用类中的任何构造函数。
答案 1 :(得分:9)
正如其他人已经提到的那样,您需要在public Employee(){}
课程中提供默认构造函数Employee
。
如果没有构造函数,编译器会自动为任何类提供无参数的默认构造函数。如果您的类没有明确的超类,那么它有一个隐式超类Object
,确实有一个无参数构造函数。在这种情况下,您在类Employee
中声明构造函数,因此必须也提供无参数构造函数。
说过Employee
类应该是这样的:
您的班级员工
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教程 - Providing Constructors for Your Classes章节。通过它,您将更清楚地了解发生了什么。
答案 2 :(得分:3)
ProductionWorker
扩展Employee
,因此据说它具有员工的所有功能。为了实现这一点,Java会自动在每个构造函数的第一行中调用super();
,您可以手动设置,但通常不需要。在您的情况下,是是必要的,因为由于Employee的构造函数具有参数,因此无法自动调用super();
。
您需要在Employee
类中定义默认构造函数,或者在ProductionWorker的构造函数的第一行中调用super('Erkan', 21, new Date());
。
答案 3 :(得分:2)
只要父类缺少无参数构造函数,就需要显式调用父类构造函数。您可以向父类添加无参数构造函数,也可以在子类中显式调用父类构造函数。
答案 4 :(得分:0)
最近我的comp实验室出现了这个问题。这很简单,Erkan正确回答。只需将super("the name of your subclass")
放在与您的问题相关的位置 - > super("ProductionWorker);
作为subclass'
构造函数的第一行。
答案 5 :(得分:0)
当您没有构建者立即调用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 调用之前放置代码;-)如果你需要在调用super之前初始化一些东西,可以在另一个构造函数中执行,然后调用旧的构造函数......就像在这个示例中pulled from this StackOverflow post:
public class Foo
{
private int x;
public Foo()
{
this(1);
}
public Foo(int x)
{
this.x = x;
}
}