B接口抽象类工资系统及个人心得理解

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子类的方法,因此我无法通过多态数组的形式调用。那要采取如何使用了,这时联想着多态定义的小知识点,编辑看左边,执行看右边。左边为父类,右边为子类,那么因此呢,在构建多态形式实现数组情况下,对子类部分采取带参构造,当编辑运行的时候,执行中发现右边有这个变量,因此时可以实现调用的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值