第三十一课 继承(8)
下面我给出个程序,大家仔细读一下:
import javax.swing.JOptionPane;
import java.text.DecimalFormat;
public class TestEmployee{
public static void main(String args[]){
Employee ref;
String output="";
Boss b=new Boss("Richard","Zhang",800.00);
CommissionWorker c=new CommissionWorker("Dexter","Li",400.0,3.0,150);
PieceWorker p=new PieceWorker("Matrix","Wang",2.5,200);
HourlyWorker h=new HourlyWorker("Drodan","ma",13.75,40);
DecimalFormat precision2=new DecimalFormat("0.00");
ref=b; //把父类的引用ref赋值为子类的Boss对b的引用
output+=ref.toString()+"工资¥"+precision2.format(ref.earnings())+"\n"+b.toString()+"工资¥"+precision2.format(b.earnings())+"/n";
ref=c; //把父类的引用ref赋值为子类普通员工对c的引用
output+=ref.toString()+"工资¥"+precision2.format(ref.earnings())+"\n"+c.toString()+"工资¥"+precision2.format(c.earnings())+"/n";
ref=p; //把父类的引用ref赋值为子类计件工人对b的引用
output+=ref.toString()+"工资¥"+precision2.format(ref.earnings())+"\n"+p.toString()+"工资¥"+precision2.format(p.earnings())+"/n";
ref=h; //把父类的引用ref赋值为子类计时工人对b的引用
output+=ref.toString()+"工资¥"+precision2.format(ref.earnings())+"\n"+h.toString()+"工资¥"+precision2.format(h.earnings())+"/n";
JOptionPane.showMessageDialog(null,output,"Demonstrating Polymorphism",JOptionPane.INFORMATION_MESSAGE);
System.exit(0);
}
}
abstract class Employee{
private String firstName;
private String lastName;
//构造函数
public Employee(String first,String last){
firstName=first;
lastName=last;
}
//返回姓
public String getFirstName(){return firstName;}
public String getLastName(){return lastName;}
public String toString(){
return firstName+' '+lastName;
}
//Employee抽象方法earnings()
//将被其每个子类以实例继承
public abstract double earnings();
}
final class Boss extends Employee{
private double weeklySalary;
//经理Boss类的构造函数
public Boss(String first,String last,double s){
super(first,last);
setWeeklySalary(s);
}
//经理Boss类的工资
public void setWeeklySalary(double s){
weeklySalary =(s>0?s:0);
}
//确定Boss的薪水
public double earnings(){return weeklySalary;}
//打印姓名
public String toString(){
return "经理"+super.toString();
}
}
final class PieceWorker extends Employee{
private double wagePerPiece; //生产量
private int quantity; //工作周数
public PieceWorker(String first,String last,double w,int q){
super(first,last);
setWage(w);
setQuantity(q);
}
//确定工资
public void setWage(double w){wagePerPiece=(w>0?w:0);}
//确定工作数量
public void setQuantity(int q){quantity=(q>0?q:0);}
//确定计件工人的工资
public double earnings(){
return quantity*wagePerPiece;
}
public String toString(){
return "计件工人:"+super.toString();
}
}
final class HourlyWorker extends Employee{
private double wage; //每小时工资
private double hours; //每周工作时间
public HourlyWorker(String first,String last,double w,double h){
super(first,last);
setWage(w);
setHours(h);
}
//确定工资
public void setWage(double w){wage=(w>0?w:0);}
//确定工作时间
public void setHours(double h){hours=(h>=0&&h<168?h:0);}
//确定计时工人的工资
public double earnings(){return wage*hours;}
public String toString(){
return "计时工人:"+super.toString();
}
}
final class CommissionWorker extends Employee{
private double salary; //每周的底薪
private double commission; //每周奖金
private int quantity; //销售额
//普通员工类的构造函数
public CommissionWorker(String first,String last,double s,double c,int q){
super(first,last);
setSalary(s);
setCommission(c);
setQuantity(q);
}
//确定普通员工的每周底薪
public void setSalary(double s){salary=(s>0?s:0);}
//确定普通员工的每周奖金
public void setCommission(double c){commission=(c>0?c:0);}
//确定普通员工销售额
public void setQuantity(int q){quantity=(q>0?q:0);}
//确定普通员工收入
public double earnings(){
return salary+commission*quantity;}
//打印普通员工姓名
public String toString(){return "普通员工:"+super.toString();
}}