Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 某些参数未传递给super()构造函数_Java_Oop_Inheritance_Super_Abstraction - Fatal编程技术网

Java 某些参数未传递给super()构造函数

Java 某些参数未传递给super()构造函数,java,oop,inheritance,super,abstraction,Java,Oop,Inheritance,Super,Abstraction,将参数传递到超级构造函数时遇到问题。我正在用继承实现抽象。我创建了三个类来扩展抽象类Employee。但是当我创建这三个类的对象时,只有一个类将参数正确地传递给super()构造函数,而其余的将返回null。 这是抽象类 public abstract class Employee { private String firstName,lastName,SSN; public Employee(String fName, String lName, String SSN)

将参数传递到超级构造函数时遇到问题。我正在用继承实现抽象。我创建了三个类来扩展抽象类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());
    }

}


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

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 类抽象。工薪雇员 名字:阿米努 姓:比希尔 社会保险号码:11-22-33-33 周薪:300.47 类抽象.HourlyEmployee 名字:空 姓氏:空 社会保险号码:空 工作时间:50小时 薪金:1122.0 类抽象.CommissionEmployee 名字:空 姓氏:空 社会保险号码:空 佣金率:0.3 工资:6000.0 变数

private String firstName,lastName,SSN;
已在employee类中定义,无需重复。这就是为什么在这些空值中,您应该删除行

private String firstName, lastName, SSN;

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

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

然而,这不是你问题的根源。如果重写方法,则会出现类似的问题,在这种情况下,正确打印的子类不会重写用于读取存储在变量中的信息的getter。在正确输出的类中,getter位于超类中,因此getter正在寻址超类变量。在其他2个类中,可以找到重写的getter,它们使用在子类中找到的变量。因为您只设置了超类中的变量,所以子类变量总是空的,结果也是空的


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

非常感谢你,伊沃。它现在正在工作correctly@AminuBishir不客气! 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;
private String firstName, lastName, SSN;