有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java我的继承有问题

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

  • 使类Employee实现接口
  • 在Employee类中定义getGrossalary()方法。假设总工资等于以下等式:基本工资+全职奖金(基本工资=40000美元/年) 雇佣时间奖金=$1000/年雇佣
  • 在Employee类中定义getNetSalary()方法。假设净工资等于以下等式:总工资-(总工资*税率)
  • 应通过调用接口Taxes中的getTaxRate()静态方法来获取税率
  • 创建从类Employee继承的子类管理器。重写getBonus()方法,这样每位经理都可以在工作时间奖金的基础上额外获得10000美元

一切正常,但当我试图让Manager继承其超类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;
    }
}
}

这是我的经理。java代码,出现错误“类Employee中的构造函数Employee无法应用于给定类型”:

public class Manager extends Employee {
public Manager( int years ) {
    this.years = years;
}

public double getBonus() {
    return years*10000;
}
}

共 (5) 个答案

  1. # 1 楼答案

    您有两种解决方案:

    1-在Employee类上创建一个默认构造函数,因为如果不在子类中指定构造函数,编译器将搜索默认构造函数,但它不存在

    public Employee() {
    
    }
    

    2-或者您可以调用超级类中的自定义构造函数:

    public Manager(int years) {
        super(years);
    }
    
  2. # 2 楼答案

    如果您确实显式地指定了构造函数(如在Employee with parameter中),Java编译器将不会为您创建无参数构造函数。因此需要显式调用基类构造函数

  3. # 3 楼答案

    超级构造函数必须在类的每个构造函数(或通过this(...)调用类的另一个构造函数)中调用。如果不调用特定的构造函数,编译器将添加默认构造函数。 但是没有默认的Employee()construcor,因此您会得到错误。将Manager构造函数更改为

    public Manager( int years ) {
        super(years);
        this.years = years; // not needed because Employee has this field as well
    }
    
  4. # 4 楼答案

    我不是那个么喜欢java的人,但你们在Employee类上并没有默认构造函数,如何支持init基类

    据我所知,你应该有

    public Manager(int years){ 
        super(years); 
    }
    
  5. # 5 楼答案

    在类Manager的构造函数中,必须确保调用了其超类Employee的相应构造函数。您可以通过使用super(...)来实现这一点:

    public Manager(int years) {
        super(years);
    }
    

    如果不指定此项,Java将尝试调用不带参数的类Employee的构造函数。由于类Employee没有不带参数的构造函数,正如您所注意到的,这将失败

    请参阅Oracle Java教程中的:Using the Keyword ^{}