我的继承有问题

时间:2017-06-15 06:33:46

标签: java inheritance

本周我正在练习Java继承。我的任务是设计一个计算员工年薪的小程序。这项任务要求我:

  • 使类Employee实现接口Taxes。
  • 在Employee类中定义方法getGrossSalary()。假设工资总额等于以下等式:基本工资+时间工作奖金(基本工资= $ 40000 /年) 时间使用奖金= 1000美元/年就业
  • 在Employee类中定义getNetSalary()方法。假设净工资等于以下等式:总薪水 - (总薪水*税率)
  • 应通过调用接口Taxes中的getTaxRate()静态方法获得税率。
  • 创建一个继承自Employee类的子类Manager。覆盖方法getBonus(),以便每位经理额外获得额外的10000美元额外奖金。

一切都还可以,但是当我试图让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;
}
}

5 个答案:

答案 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); 
}