【问题标题】:Inheritance in Java subclassJava子类中的继承
【发布时间】:2014-12-07 17:28:51
【问题描述】:

我正在尝试编写一个类(SalaryEmployee) 和子类(ComissionEmployee),但我主要没有得到合适的薪水,而且我无法执行 se1.setSalesAmount(20000)。我哪里做错了?

这是主要内容:

public static void main(String[] args) {
    SalaryEmployee se1 = new CommissionEmployee("E3", "John", 10000);  
    se1.setSalesAmount(20000) // not found
    System.out.println(se1.getSalary());

}

具有 id (String)、name(String)、salary(double) 的 SalaryEmployee。它有一个构造函数来初始化实例变量。它有一个返回薪水的getSalary 方法和一个返回实例变量值的toString 方法。

public class SalaryEmployee  {
    private String id;
    private String name;
    double salary;

    public SalaryEmployee(String id, String name, double salary) {
        this.id = id;
        this.name = name;
        this.salary = salary;
    }

    public double getSalary() {
        return salary;
    }

    public String toString() {
        return "ID=" + id + " Name=" + name + " Salary=" + salary;
    }
}

然后在 ComissionEmployee 中,我需要将其编写为 SalaryEmployee 的子类,它具有 id(String)、name(String)、baseSalary(double)、salesAmount(double)。它有一个构造函数来初始化 id、name 和 baseSalary。它具有获取/设置 salesAmount 的方法。它有一个 getSalary 方法,根据 baseSalary + 佣金返回薪水,如下所示:

salesAmount 低于 10,000 - 无佣金, 至少 10,000 但低于 20,000 - baseSalary 的 3%, 至少 20,000 - 5% baseSalary

public class CommissionEmployee extends SalaryEmployee {

    private double baseSalary;
    private double salesAmount;

    public CommissionEmployee(String id, String name, double salary) {
        super(id, name, salary);
        this.baseSalary = salary;

    }

    public void setSalesAmount(double amount) {
        this.salesAmount = amount;
    }

    public double getSalesAmount() {
        return salesAmount;
    }

    public double getSalary() {
        if (salesAmount <= 10000 || salesAmount < 20000) {
            return 1.03 * baseSalary;
        } else if (salesAmount > 20000) {
            return 1.05 * baseSalary;
        } else if (salesAmount < 10000) {
            return baseSalary;
        }
        return baseSalary;
    }
}

【问题讨论】:

  • 您能告诉我们您的预期结果与获得的结果吗?告诉我们结果错误是一回事,告诉我们结果是什么又是另一回事。

标签: java inheritance


【解决方案1】:

您将 se1 创建为没有 setSalesAmount() 方法的 SalaryEmployee 类型。 所以,你需要将你的 se1 降级为 CommissionEmployee:

((CommissionEmployee)se1).setSalesAmount(20000)

【讨论】:

    【解决方案2】:

    在您的代码中 se1 仍然有其基本类型 SalaryEmployee ,其中 setSalesAmount 方法不存在。

    我会说你的程序设计得很糟糕。

    【讨论】:

      【解决方案3】:

      对于继承以及对于接口而言,赋值的左侧是在编译时解析方法的参考。所以当你说时

      SalaryEmployee se1 = new CommissionEmployee("E3", "John", 10000);
      se1.setSalesAmount(20000);
      

      编译器将尝试在引用类型(即 SalaryEmployee)而不是实例类型(即 CommissionEmployee)上查找 setSalesAmount 方法

      在运行时,当您执行代码时,方法会在引用指向的实例上执行,即 CommissionEmployee 的实例,因此它将选择要执行的子类的 setSalesAmount

      现在解决您的问题有两种方法:

      • 要么你做 CommissionEmployee se1 = new CommissionEmployee("E3", "John", 10000); se1..setSalesAmount(20000); 但这不是在纯 Java 哲学中使用的继承。所以正确的方法是:

      • 在您的超类中包含 setSalesAmount 方法以及默认实现。

      • 如果你永远不会直接创建 SalaryEmployee 的实例,或者甚至更好地在超类中包含一个抽象方法setSalesAmount,即:永远不会在任何地方执行 new SalaryEmployee(),因为抽象类不能自己实例化。

      希望这会有所帮助。

      【讨论】:

        【解决方案4】:

        代替

        SalaryEmployee se1 = new CommissionEmployee("E3", "John", 10000);
        

        CommissionEmployee se1 = new CommissionEmployee("E3", "John", 10000);
        

        方法setSalesAmount 仅对CommissionEmployee 可用,在父类SalaryEmployee 中不可用。所以这个方法是特定于孩子的,并且只对它可用。除了上述之外,您的条件似乎无效。你应该这样做:

        if (salesAmount == 0) {
           return baseSalary;
        } else if (salesAmount < 20000) {
           return  1.2 * baseSalary;
        } else if (salesAmount >= 20000) {
            return 1.05 * baseSalary;
        }
        

        【讨论】:

        • 我试过你的方法,但是如果我不做setSalesAmount,它返回为10300,由于没有设置销售额,我如何返回原始工资?
        • 更新了答案。您的代码中似乎存在重复的 if 条件。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-10
        • 1970-01-01
        • 2023-03-27
        • 2012-09-10
        • 1970-01-01
        • 2012-02-25
        相关资源
        最近更新 更多