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