一些参数没有传递给 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 中 CommissionEmployee
、HourlyEmployee
和 SalariedEmployee
。因为这些属性在你的摘要中声明classEmployee
,所以使用它。
您在多次声明变量时遇到问题。通过在 super class 中声明它们,它们也会在 subclass 中声明。当你在subclass中声明同名变量时,你可以通过super.variable
寻址superclass'变量。但是我建议你简单地删除你的 subclasses 中的变量声明,它们已经在 superclass.
中声明了
但这不是你问题的根源。如果您覆盖方法,则会出现类似的问题,在您的情况下,正确打印的 subclass 不会覆盖用于读取存储在变量中的信息的吸气剂。在正确打印出的 class 中,吸气剂位于 superclass 中,因此吸气剂正在寻址 superclass 变量。在其他 2 classes 中发现了覆盖的 getter,它们使用在 subclasses 中找到的变量。由于您只设置了 superclass 中的变量,subclass 变量始终为 null,您的结果也是如此。
我建议您删除覆盖的 getter 和子classes 中的变量。你不需要它们。
我在将参数传递给超级构造函数时遇到问题。我正在用继承实现抽象。我创建了三个扩展抽象 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 中 CommissionEmployee
、HourlyEmployee
和 SalariedEmployee
。因为这些属性在你的摘要中声明classEmployee
,所以使用它。
您在多次声明变量时遇到问题。通过在 super class 中声明它们,它们也会在 subclass 中声明。当你在subclass中声明同名变量时,你可以通过super.variable
寻址superclass'变量。但是我建议你简单地删除你的 subclasses 中的变量声明,它们已经在 superclass.
但这不是你问题的根源。如果您覆盖方法,则会出现类似的问题,在您的情况下,正确打印的 subclass 不会覆盖用于读取存储在变量中的信息的吸气剂。在正确打印出的 class 中,吸气剂位于 superclass 中,因此吸气剂正在寻址 superclass 变量。在其他 2 classes 中发现了覆盖的 getter,它们使用在 subclasses 中找到的变量。由于您只设置了 superclass 中的变量,subclass 变量始终为 null,您的结果也是如此。
我建议您删除覆盖的 getter 和子classes 中的变量。你不需要它们。