【问题标题】:some params not being passed to super() construtor一些参数没有被传递给 super() 构造函数
【发布时间】:2018-09-12 11:14:48
【问题描述】:

我在将参数传递给超级构造函数时遇到问题。我正在用继承实现抽象。我创建了三个扩展抽象类Employee 的类。但是当我创建这三个类的对象时,只有一个类正确地将参数传递给 super() 构造函数,而其余的将返回 null。 这是抽象类

public abstract class  Employee {

    private String firstName,lastName,SSN;


    public Employee(String fName, String lName, String SSN){
        this.SSN = SSN;
        this.firstName = fName;
        this.lastName = lName;

    }
    public void setFirstName(String fName){
        this.firstName = firstName;
    }
    public void setLastName(String lName){
        this.lastName = lName;
    }
    public void setSSN(String SSN){
        this.SSN = SSN;
    }
    public String getSSN(){
        return SSN;
    }


    public String getFirstName(){
       return firstName;
    }
    public String getLastName(){
       return lastName;
    }
    public abstract double getEarnings();

    @Override
    public  String toString(){
       return String.format("First Name: %-2s \n Last Name: %-2s \n Social Security Number: %-2s", getFirstName(), getLastName(),getSSN());
    }

这里是类:

public class SalariedEmployee extends Employee {

    private String firstName, lastName, SSN;
    double weeklyPay;

    public SalariedEmployee(String fName, String lName, String SSN, double wPay) {
        super(fName, lName, SSN);
        this.weeklyPay = wPay;
    }

    public void setWeeklyPay(double wPay) {
        this.weeklyPay = wPay;
    }

    public double getWeeklyPay() {
        return weeklyPay;
    }

    @Override
    public double getEarnings() {
        return getWeeklyPay();
    }

    @Override
    public String toString() {
        return String.format("%s \n Weekly Pay: %2s", super.toString(), getEarnings());
    }

}

public class HourlyEmployee extends Employee{
    private String firstName, lastName, SSN;
    private double hourlyPay,wage;
    private int hours;

    public HourlyEmployee(String fName, String lName, String SSN,  int hour, double hourlyPay ){
        super(fName, lName, SSN);
        this.hours = hour;
        this.hourlyPay = hourlyPay;

    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getSSN() {
        return SSN;
    }

    public void setSSN(String SSN) {
        this.SSN = SSN;
    }

    public double getHourlyPay() {
        return hourlyPay;
    }

    public void setHourlyPay(double hourlyPay) {
        this.hourlyPay = hourlyPay;
    }

    public double getWage() {
        return wage;
    }

    public void setWage(double wage) {
        this.wage = wage;
    }

    public int getHours() {
        return hours;
    }

    public void setHours(int hours) {
        this.hours = hours;
    }

    @Override
    public double getEarnings(){
        double earnings;
        if(hours> 40)
            earnings = hourlyPay * 40 + ((hours-40) *hourlyPay *1.5);
        else
        earnings  = hourlyPay * hours;

       return earnings;
    }
    @Override
    public String toString(){
        return String.format("%s \n Hours worked: %s \n Salary: %s \n ", super.toString(), getHours(), getEarnings());
    }

}

public class CommissionEmployee extends Employee {
    private String firstName, lastName, SSN;
    private double sales,commission;
    public CommissionEmployee(String fName, String lName, String SSN, double sales, double commission){
       super(fName, lName, SSN);
       this.commission = commission;
       this.sales = sales;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getSSN() {
        return SSN;
    }

    public void setSSN(String SSN) {
        this.SSN = SSN;
    }

    public double getSales() {
        return sales;
    }

    public void setSales(double sales) {
        this.sales = sales;
    }

    public double getCommission() {
        double commissionRate;
        if(commission >0 && commission<1)
        return commission;
        else
            return 0;
    }

    public void setCommission(double commission) {
        this.commission = commission;
    }
    @Override
    public double getEarnings(){
        return getCommission() * getSales();
    }
    @Override
    public String toString(){
        return String.format("%s \n Commission Rate: %s \n Salary: %s \n", super.toString(), getCommission(), getEarnings());
    }
}

这是测试类

public class EmployeeTest {

    public static void main(String[] args) {
        Employee salariedEmp,hourlyEmp,commissionEmp;
         salariedEmp = new SalariedEmployee("Aminu", "Bishir", "11-22-33-33", 300.47);
        System.out.println(printDetails(salariedEmp));
         hourlyEmp = new HourlyEmployee("Musa","Sale","22-33-44-55",50,20.4);
        System.out.println(printDetails(hourlyEmp));
         commissionEmp = new CommissionEmployee("Muhammad","Ibrahim","33-44-55-66",20000,0.3);
       System.out.print( printDetails(commissionEmp));
    }
    public static String printDetails(Employee emp){
        return String.format("%s \n %s",emp.getClass(),emp.toString());
    }

}

这是我每次运行时得到的输出:

类 Abstraction.SalariedEmployee 名字:阿米努 姓名:比希尔 社会安全号码:11-22-33-33 周薪:300.47 类 Abstraction.HourlyEmployee 名字:空 姓氏:空 社会安全号码:空 工作时间:50 工资:1122.0 类 Abstraction.CommissionEmployee 名字:空 姓氏:空 社会安全号码:空 佣金率:0.3 工资:6000.0

【问题讨论】:

    标签: java oop inheritance super abstraction


    【解决方案1】:

    你应该删除行

    private String firstName, lastName, SSN;
    

    在子类CommissionEmployeeHourlyEmployeeSalariedEmployee。因为这些属性是在您的抽象类Employee 中声明的,所以请使用它。

    【讨论】:

      【解决方案2】:

      您在多次声明变量时遇到问题。通过在超类中声明它们,它们也会在子类中声明。当您在子类中声明具有相同名称的变量时,您可以通过super.variable 寻址超类的变量。但我建议您只需删除子类中已经在超类中声明的变量声明。

      但是,这不是问题的根源。如果您覆盖方法,则会发生类似的问题,在您的情况下,正确打印的子类不会覆盖用于读取存储在变量中的信息的 getter。在正确打印出的类中,getter 在超类中找到,因此 getter 正在处理超类变量。在其他 2 个类中,找到了覆盖的 getter,它们使用了子类中的变量。由于您只设置超类中的变量,因此子类变量始终为空,您的结果也是如此。

      我建议您删除覆盖的 getter 和子类中的变量。你不需要它们。

      【讨论】:

      • 非常感谢伊沃。它现在工作正常
      • @AminuBishir 不客气!
      【解决方案3】:

      变量

      private String firstName,lastName,SSN;
      

      已在您的员工类中定义,无需重复。这就是为什么这些空值

      【讨论】:

        猜你喜欢
        • 2016-04-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多