题目要求
附:题目来源于尚硅谷
编写工资系统,实现不同类型员工(多态)的按月发放工资。如果当月出现某个
Employee对象的生日,则将该雇员的工资增加100元。
实验说明:
(1)定义一个Employee类,该类包含:
private成员变量name,number,birthday,其中birthday 为MyDate类的对象;abstract方法earnings();toString()方法输出对象的name,number和birthday。
(2)MyDate类包含:private成员变量year,month,day ;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。
(5)定义SalarySystem类,创建Employee变量数组并初始化,该数组存放各类雇员对象的引用。利用循环结构遍历数组元素,输出各个对象的类型,name,number,birthday,以及该对象生日。当键盘输入本月月份值时,如果本月是某个Employee对象的生日,还要输出增加工资信息。
设计思路
1、Employee类中有抽象方法earnings,则Employee类应声明为抽象类
2、设计Employee类的两个子类,分别实现父类的抽象方法。注意父类已有toString(),只是输出的内容只有name、bumber、birthday。然而对子类的该方法要求增加了需要输出类的信息,需重写该方法。
3、编写SalarySystem类,创建Employee变量数组(此处只是声明一个类型为Employee的数组,并没有创建抽象类Employee对象),采用多态初始化数组。初始化后,需要检查是否有员工当月生日,有,则需为其增加100元工资,当时据题意,不同员工的表示方式是不同的(SalariedEmployee的薪资属性monthlySalary,HourlyEmployee的薪资属性为hourlySalary),那么遇到员工当月生日,为其增加100元工资的具体实现也是不同的,因此为当月生日的员工工资增加100元的方法在父类中已抽象方法声明,在不同的子类中做具体实现。
代码
import java.util.Scanner;
public class SalarySystem {
public static void main(String[] args) {
Employee employee[]=new Employee[4];
Scanner scan=new Scanner(System.in);
for(int i=0;i<2;i++){
System.out.print("输入小时职员姓名:");
String name=scan.next();
System.out.print("编号:");
int number=scan.nextInt();
System.out.print("出生年、月、日:");
int year=scan.nextInt();
int month=scan.nextInt();
int day=scan.nextInt();
System.out.print("时薪:");
int wage=scan.nextInt();
System.out.print(