筆記總結:
1.Employee為抽象類,兩個子類進行繼承, public abstract double earning();兩個子類分別實現
2.Employee[] emps[i].toString() 才可以完整地輸出整個子類的信息!
3.構造函數中參數列表是對象, new HourEmployee("韓梅梅",1002,new MyDate(1998,12,21).....) ,也闊以!
4.讀入流:import java.util.Scanner;
Scanner cin=new Scanner(System.in);
int month= cin.nextInt();
實驗要求:

實驗題目:
編寫工資系統,實現不同類型員工(多態)的按月發放工資。如果當月出現某個Employee對象的生日,則將該雇員的工資增加100元。
實驗目的:對象、繼承、封裝、多態、抽象類的組合應用。
實驗說明:
(1)定義一個Employee類,該類包含:
private成員變量name,number,birthday,其中birthday 為MyDate類的對象;
abstract方法earnings();toString()方法輸出對象的name,number和birthday。
(2)MyDate類包含:
private成員變量month,day,year;
toDateString()方法返回日期對應的字符串:xxxx年xx月xx日
(3)定義SalariedEmployee類繼承Employee類,實現按月計算工資的員工處理。該類包括:
private成員變量monthlySalary;
實現父類的抽象方法earnings(),該方法返回monthlySalary值;toString()方法輸出員工類型信息及員工的name,number,birthday。
(4)參照SalariedEmployee類定義HourlyEmployee類,實現按小時計算工資的員工處理。該類包括:
private成員變量wage和hour;
實現父類的抽象方法earnings(),該方法返回wage*hour值;toString()方法輸出員工類型信息及員工的name,number,birthday。
(4)定義PayrollSystem類,創建Employee變量數組並初始化,該數組存放各類雇員對象的引用。利用循環結構遍歷數組元素,輸出各個對象的類型,name,number,birthday,以及該對象生日。當鍵盤輸入本月月份值時,如果本月是某個Employee對象的生日,還要輸出增加工資信息。
提示:
//定義People類型的數組
People c1[]=new People[10];
//數組元素賦值
c1[0]=new People("John","0001",20);
c1[1]=new People("Bob","0002",19);
//若People有兩個子類Student和Officer,則數組元素賦值時,可以使父類類型的數組元素指向子類。
c1[0]=new Student("John","0001",20,85.0);
c1[1]=new Officer("Bob","0002",19,90.5);
工程組織:
Employee.java:

package Coding;
public abstract class Employee{
private String name;
private int number;
private MyDate birthday;
@Override
public String toString() {
return "Employee{" +
"name='" + name + '\'' +
", number=" + number +
", birthday=" + birthday +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public MyDate getBirthday() {
return birthday;
}
public void setBirthday(MyDate birthday) {
this.birthday = birthday;
}
public Employee(String name, int number, MyDate birthday) {
this.name = name;
this.number = number;
this.birthday = birthday;
}
public abstract double earning();
}
HourEmployee.java:

package Coding;
public class HourEmployee extends Employee{
private double wage;
private double hour;
public HourEmployee(String name, int number, MyDate birthday, double wage, double hour) {
super(name, number, birthday);
this.hour=hour;
this.wage=wage;
}
@Override
public String toString() {
return "HourEmployee{" +"name="+super.getName()
+"number="+super.getNumber()
+" birthday="+this.getBirthday().toString()
+ " wage=" + wage
+ ", hour=" + hour + '}';
}
@Override
public double earning() {
return wage*hour;
}
}
MyDate.java:

package Coding;
public class MyDate {
private int year,month,day;
public MyDate(int year, int month, int day) {
this.year = year;
this.month = month;
this.day = day;
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
public int getMonth() {
return month;
}
public void setMonth(int month) {
this.month = month;
}
public int getDay() {
return day;
}
public void setDay(int day) {
this.day = day;
}
@Override
public String toString() {
return "MyDate{" +
"year=" + year +
", month=" + month +
", day=" + day +
'}';
}
}
SalariedEmployee.java:

package Coding;
//月工資
public class SalariedEmployee extends Employee{
private double monthlySalary;
public SalariedEmployee(String name, int number, MyDate birthday, double monthlySalary) {
super(name,number,birthday);
this.monthlySalary=monthlySalary;
}
@Override
public String toString() {
return "HourEmployee{" +"name="+super.getName()
+"number="+super.getNumber()
+" birthday="+this.getBirthday().toString()
+ " monthlySalary=" + monthlySalary
+ '}';
}
public double earning() {
return monthlySalary*30;
}
public double getMonthlySalary() {
return monthlySalary;
}
public void setMonthlySalary(double monthlySalary) {
this.monthlySalary = monthlySalary;
}
}
PayrollSystem.java: (測試文件,放到Testing包里 )

package Testing; import Coding.*; import java.util.Scanner; public class PayrollSystem { public static void main(String[] args) { Employee[] emps= new Employee[2]; emps[0] = new SalariedEmployee("李雷",1001,new MyDate(1998,12,21),8800); emps[1] = new HourEmployee("韓梅梅",1002,new MyDate(1998,12,21),66,6); Scanner cin=new Scanner(System.in); System.out.println("請輸入查找的員工的月份: "); int month= cin.nextInt(); for(int i=0;i<emps.length;i++){ if(emps[i].getBirthday().getMonth()==month){ System.out.print("加工資加一百!! 說說而已."); } System.out.println(emps[i].toString()); } } }
輸出結果:

請輸入查找的員工的月份: 12 加工資加一百!! 說說而已.HourEmployee{name=李雷number=1001 birthday=MyDate{year=1998, month=12, day=21} monthlySalary=8800.0} 加工資加一百!! 說說而已.HourEmployee{name=韓梅梅number=1002 birthday=MyDate{year=1998, month=12, day=21} wage=66.0, hour=6.0}