本周我正在练习Java继承。我的任务是设计一个计算员工年薪的小程序。这项任务要求我:
一切都还可以,但是当我试图让Manager继承其超类Employee时,程序出错了!即使我试图在互联网上找出问题,或者问我的一些朋友,我也无法修复它。
这是我的Employee.java代码:
public class Employee implements Taxes {
private double baseSalary = 40000;
int years;
private double grossSalary;
private double netSalary;
public Employee(int years) {
this.years = years;
}
public double getGrossSalary() {
grossSalary = baseSalary + getBonus();
return grossSalary;
}
public double getNetSalary() {
netSalary = grossSalary - grossSalary * getTaxRate(grossSalary);
return netSalary;
}
public double getBonus() {
return years*1000;
}
public static double getTaxRate(double grossSalary) {
if (grossSalary < 10000 ) {
return 0.05;
} else if (grossSalary >= 10000 && grossSalary < 20000) {
return 0.07;
} else if (grossSalary >= 20000 && grossSalary < 50000) {
return 0.10;
} else {
return 0.15;
}
}
}
这是我的Manager.java代码,它出现错误“类Employee中的构造函数Employee无法应用于给定类型”:
public class Manager extends Employee {
public Manager( int years ) {
this.years = years;
}
public double getBonus() {
return years*10000;
}
}
答案 0 :(得分:4)
在类Manager
的构造函数中,必须确保调用其超类Employee
的相应构造函数。您可以使用super(...)
:
public Manager(int years) {
super(years);
}
如果你没有指定它,Java将尝试调用不带参数的类Employee
的构造函数。由于类Employee
没有不带参数的构造函数,因此您会注意到这将失败。
请参阅Oracle Java教程中的Using the Keyword super
。
答案 1 :(得分:0)
必须在类的每个构造函数中调用超级构造函数(或者通过this(...)
调用类的另一个构造函数)。如果不调用特定构造函数,编译器将添加默认构造函数。
但是没有默认的Employee()
construcor,所以你得到了错误。将您的Manager
构造函数更改为
public Manager( int years ) {
super(years);
this.years = years; // not needed because Employee has this field as well
}
答案 2 :(得分:0)
如果确实明确指定了构造函数(如带有参数的Employee),Java编译器将不会为您创建无参数构造函数。所以你需要显式调用基类构造函数。
答案 3 :(得分:0)
您有两种解决方案:
1-在Employee类上创建一个默认构造函数,因为如果你没有在子类中指定构造函数,编译器将搜索默认构造函数并且它不存在。
public Employee() {
}
2-或者你可以调用超类中的自定义构造函数:
public Manager(int years) {
super(years);
}
答案 4 :(得分:0)
我不是那么多java家伙,但你在Employee类上没有默认构造函数,如何使用init基类?
根据我在Manager构造函数上所知,你应该有类似
的东西public Manager(int years){
super(years);
}