4.编写工资系统,实现不同类型员工(多态)的按月发放工资。如果当月出现某个
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)定义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);
*/
public abstract class Employee {
//定义成员变量
private String name;
private String number;
private String birthday;
//无参构造和带参构造
public Employee() {
}
public Employee(String name, String number, String birthday) {
this.name = name;
this.number = number;
this.birthday = birthday;
}
//提供getset方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public String getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday=birthday;
}
// abstract方法earnings();
public abstract double earnings();
//toString()方法输出对象的name,number和birthday
public String toString(){
return("");
}
}
public class HourlyEmployee extends Employee{
private double wage;
private double hour;
//无参带参变量
public HourlyEmployee() {
}
public HourlyEmployee(String name, String number, String birthday, double wage, double hour) {
super(name, number, birthday);
this.wage = wage;
this.hour = hour;
}
//提供get,set方法
public double getWage() {
return wage;
}
public void setWage(double wage) {
this.wage = wage;
}
public double getHour() {
return hour;
}
public void setHour(double hour) {
this.hour = hour;
}
@Override
public double earnings() {
return wage*hour;
}
@Override
public String toString() {
System.out.println("员工的名字为"+getName());
System.out.println("员工的年龄为"+getNumber());
System.out.println("员工的生日为"+getBirthday());
System.out.println("--------------------------------");
return " ";
}
}
public class SalariedEmployee extends Employee{
private double monthlySalary;
//提供带参和无参构造
public SalariedEmployee(String name, String number, String birthday, double monthlySalary) {
super(name, number, birthday);
this.monthlySalary = monthlySalary;
}
public SalariedEmployee() {
}
//提供getset方法
public double getMonthlySalary() {
return monthlySalary;
}
public void setMonthlySalary(double monthlySalary) {
this.monthlySalary = monthlySalary;
}
//方法重写
@Override
public double earnings() {
return monthlySalary;
}
@Override
public String toString() {
System.out.println("员工的名字为"+getName());
System.out.println("员工的年龄为"+getNumber());
System.out.println("员工的生日为"+getBirthday());
System.out.println("员工的每月工资为"+getMonthlySalary());
System.out.println("--------------------------------");
return " ";
}
}
public class SalariedEmployee extends Employee{
private double monthlySalary;
//提供带参和无参构造
public SalariedEmployee(String name, String number, String birthday, double monthlySalary) {
super(name, number, birthday);
this.monthlySalary = monthlySalary;
}
public SalariedEmployee() {
}
//提供getset方法
public double getMonthlySalary() {
return monthlySalary;
}
public void setMonthlySalary(double monthlySalary) {
this.monthlySalary = monthlySalary;
}
//方法重写
@Override
public double earnings() {
return monthlySalary;
}
@Override
public String toString() {
System.out.println("员工的名字为"+getName());
System.out.println("员工的年龄为"+getNumber());
System.out.println("员工的生日为"+getBirthday());
System.out.println("员工的每月工资为"+getMonthlySalary());
System.out.println("--------------------------------");
return " ";
}
}
public class MyDate {
//成员变量
private String year;
private String month;
private String day;
//无参构造,带参构造
public MyDate() {
}
public MyDate(String year, String month, String day) {
this.year = year;
this.month = month;
this.day = day;
}
//成员方法,提供getset方法
public String getYear() {
return year;
}
public void setYear(String year) {
this.year = year;
}
public String getMonth() {
return month;
}
public void setMonth(String month) {
this.month = month;
}
public String getDay() {
return day;
}
public void setDay(String day) {
this.day = day;
}
public String toDateString(){
return (year+"年"+month+"月"+day+"日");
}
}
import java.util.Scanner;
public class PayrollSystem{
public static void main(String[] args) {
//创建对象
Scanner sc = new Scanner(System.in);
System.out.println("请输入本月月份值");
String month = sc.nextLine();
//创建对象完成初始化
Employee[] e = new Employee[100];
MyDate m=new MyDate("2019","10","22");
//完成对数组的输入
e[0] = new HourlyEmployee("张三","2547",m.toDateString(),842,12);
MyDate n=new MyDate("1999","6","22");
e[1]=new SalariedEmployee("王渝","8711",n.toDateString(),8899);
//通过循环结构,遍历各个成员
for(int i=0;i<2;i++){
System.out.println("姓名"+e[i].getName()+"\n工号"+e[i].getNumber()+"\n生日为"+e[i].getBirthday());
System.out.println("-------------");
}
if(m.getMonth().equals(month)){
System.out.println("当前月为"+e[0].getName()+"的生日"+"祝你生日快乐");
System.out.println("工资额外追加500元");
System.out.println("您的当月薪资为"+(e[0].earnings()+500));
}
if(n.getMonth().equals(month)){
System.out.println("当前月为"+e[1].getName()+"的生日"+"祝你生日快乐");
System.out.println("工资额外追加500元");
System.out.println("您的当月薪资为"+(e[1].earnings()+500));
}
}
}
该题目的我做了很长的时间,主要在于一点,对通过数组实现父类子类多态形式了解不太深入,之前曾经构想着通过数组调用子类方法birthday无参构造的形式形式,发现这样是不行的,想了很久,主要原因还是在于了数组是采用父类对象构造的,而父类对象中并并没有相关birthday子类的方法,因此我无法通过多态数组的形式调用。那要采取如何使用了,这时联想着多态定义的小知识点,编辑看左边,执行看右边。左边为父类,右边为子类,那么因此呢,在构建多态形式实现数组情况下,对子类部分采取带参构造,当编辑运行的时候,执行中发现右边有这个变量,因此时可以实现调用的。