1

我已经编写了在 Java 中使用继承和多态的程序,但是遇到了一些问题,请参阅下面的代码:

超类:

public class Worker {

private String name;
private double salaryRate;

public Worker(String nm, double rate){
nm=name;
rate=salaryRate;
}

public void computePay(int hours){

double pay=hours*salaryRate;
System.out.println("The Salary for "+getName()+" is "+pay);

}

public String toString(){
return name+" "+salaryRate;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public double getSalaryRate() {
return salaryRate;
}

public void setSalaryRate(double salaryRate) {
this.salaryRate = salaryRate;
}
}

一个子类:

   public class HourlyWorker extends Worker {

   public HourlyWorker(String nm, double rate) {
    super(nm, rate);

    }

   public void computePay(int hours){

if (hours>40){
    double extraPay=(hours-40)*1.5*getSalaryRate();
    double pay=40*getSalaryRate();
    double total=extraPay+pay;
    System.out.println("The salary for "+getName()+" is "+total);
}
else{
    super.computePay(hours);

}
    }
    }

另一个子类:

 public class SalariedWorker extends Worker {

 public SalariedWorker(String nm, double rate){
super(nm,rate);
   }

 public void computePay(int hours){
double pay=40*getSalaryRate();
System.out.println("The salary for "+getName()+" is "+pay);

   }
   }

Main() 方法:

 public class Test {

public static void main(String[] args) {
    Worker a=new HourlyWorker("Tom",2.0);
    Worker b=new HourlyWorker("Lee",2.0);
    Worker c=new SalariedWorker("Pei",2.0);
    Worker d=new SalariedWorker("Joe",2.0);

    System.out.println(a+" "+b+" "+c+" "+" "+d);

    a.computePay(50);
    b.computePay(30);
    c.computePay(20);
    d.computePay(60);


}

    }

有点长,感谢您的耐心阅读:)但是,当他们编译时,它显示:

 null 0.0 null 0.0 null 0.0  null 0.0
 The salary for null is 0.0
 The Salary for null is 0.0
 The salary for null is 0.0
 The salary for null is 0.0

请问哪里出错了,谢谢大家!

4

2 回答 2

4

您的分配在构造函数中被反转。您没有使用输入参数设置实例属性值,因此这些属性始终具有默认值。更改此

public Worker(String nm, double rate){
nm=name;
rate=salaryRate;
}

public Worker(String nm, double rate){
   this.name=nm;
   this.salaryRate=rate;
}

注意:当输入参数的名称和类属性相同时,使用 也this可以帮助您避免阴影问题。

于 2013-10-09T15:09:57.040 回答
0
public Worker(String nm, double rate){
nm=name;
rate=salaryRate;
}

您正在将值分配给局部变量而不是实例变量。因此,这些变量具有它们的默认值。对于字符串默认值为 null 对于 double 它是 0.0

你应该做

public Worker(String nm, double rate){
name = nm;
salaryRate = rate;
}
于 2013-10-09T15:12:19.437 回答