一些参数没有传递给 super() 构造函数

some params not being passed to super() construtor

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

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());
    }

这里是 classes:

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());
    }
}

这是测试 Class

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());
    }

}

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

class Abstraction.SalariedEmployee   
 First Name: Aminu   
 Last Name: Bishir   
 Social Security Number: 11-22-33-33   
 Weekly Pay: 300.47  

class Abstraction.HourlyEmployee    
 First Name: null     
 Last Name: null   
 Social Security Number: null   
 Hours worked: 50  
 Salary: 1122.0   


class Abstraction.CommissionEmployee 
 First Name: null   
 Last Name: null   
 Social Security Number: null   
 Commission Rate: 0.3   
 Salary: 6000.0  

变量

private String firstName,lastName,SSN;

已在您的员工 class 中定义,无需重复。这就是那些空值

的原因

你应该删除行

private String firstName, lastName, SSN;

在 child class 中 CommissionEmployeeHourlyEmployeeSalariedEmployee。因为这些属性在你的摘要中声明classEmployee,所以使用它。

您在多次声明变量时遇到问题。通过在 super class 中声明它们,它们也会在 subclass 中声明。当你在subclass中声明同名变量时,你可以通过super.variable寻址superclass'变量。但是我建议你简单地删除你的 subclasses 中的变量声明,它们已经在 superclass.

中声明了

但这不是你问题的根源。如果您覆盖方法,则会出现类似的问题,在您的情况下,正确打印的 subclass 不会覆盖用于读取存储在变量中的信息的吸气剂。在正确打印出的 class 中,吸气剂位于 superclass 中,因此吸气剂正在寻址 superclass 变量。在其他 2 classes 中发现了覆盖的 getter,它们使用在 subclasses 中找到的变量。由于您只设置了 superclass 中的变量,subclass 变量始终为 null,您的结果也是如此。

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