一、代码分析
(一) 类的设计
(1)Employee类
(2)MyDate类
(3)SalaryEmployee类(正式工)
(4)HourEmployee类(临时工)
(5)TestEmployees类
(二)Employee类
(1)成员变量(使用“private”进行封装)
①姓名
(2)成员方法
①Getter与Setter方法,使用快捷键“Alt + Insert”快速生成
②实发薪资:public double earning()
③详细信息:public String getInfo()
/*
2022.7.26
*/
public class Employee {
//成员变量
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//成员方法
public double earning(){
return 0.0;
}
public String getInfo(){
return "姓名:" + name + ",实发工资:" +earning();
}
}
(三)MyDate类
(1)成员变量
①年(year)
②月(month)
③日(day)
(2)成员方法
①Getter与Setter方法
②详细信息:public String getInfo()
//2022.7.26
public class MyDate {
//成员属性
private int year;
private int month;
private int 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;
}
public String getInfo() {
return "年:" + year + ",月:" + month + ",日:" + day;
}
}
(四)SalaryEmployee类
(1)说明
继承Employee类。继承的关键字为“extends”。将父类的实例变量(即成员变量)与成员方法继承到本身。
(2)新增成员变量
①薪资(salary)
②生日(birthday)
(3)成员方法(对父类的成员方法进行重写)
生成重写方法的快捷键为“Ctrl+O”,重写的关键字是“override”,重载的关键字是“overload”
①实发工资:public double earning()
②详细信息:public String getInfo()
//2022.7.26
public class SalaryEmployee extends Employee {
private double salary;
private MyDate birthday;
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
public MyDate getMyDate() {
return birthday;
}
public void setMyDate(MyDate birthday) {
this.birthday = birthday;
}
@Override
public double earning() {
return salary;
}
@Override
public String getInfo() {
return super.getInfo() + birthday.getInfo();
}
}
(五) HourEmployee类
(1)说明
继承Employee类。
(2)新增成员变量
①工作小时数:hour
②时薪:moneyperhour
(3)成员方法(对父类的成员方法进行重写)
①实发工资:public double earning()
②详细信息:public String getInfo()
//2022.7.26
public class HourEmployee extends Employee {
//成员属性
private double hour;
private double moneyperhour;
public double getHour() {
return hour;
}
public void setHour(double hour) {
this.hour = hour;
}
public double getMoneyperhour() {
return moneyperhour;
}
public void setMoneyperhour(double moneyperhour) {
this.moneyperhour = moneyperhour;
}
@Override
public double earning() {
return moneyperhour * hour;
}
@Override
public String getInfo() {
return super.getInfo() + ",时薪" +moneyperhour + ",工作小时数:" + hour;
}
}
(六)TestEmployees类
(1)说明:
该类是主程序的入口,进行测试。
(2)测试内容:
①声明一个员工数组,存储各类员工,遍历每个人的详细信息,统计实发金额。
②从键盘输入当前月份值,如果员工是正式工(SalaryEmployee和 Manager)且本月生日,则通知他人事领取生日礼物。
(3)使用到多态的地方:
声明了一个Employees类的对象数组,将Employee类、SalaryEmployee类、HourEmployee类的对象存放该数组中,并遍历显示详细信息。
(4)判断一个对象是否属于某个类的对象使用的关键字为:instanceof
(5)向上转型与向下转型:
①向上转型:
子类向父类转型
②向下转型:
父类向子类转型
import java.util.Scanner;
//2022.7.26
public class TestEmployees {
public static void main(String[] args) {
//声明一个员工数组,存储各类员工,遍历每个人的详细信息,统计实发金额
Employee[] arr= new Employee[3];
//正式工
SalaryEmployee se = new SalaryEmployee();
se.setName("张三");
se.setMyDate(new MyDate());
se.getMyDate().setYear(1990);
se.getMyDate().setMonth(1);
se.getMyDate().setDay(1);
se.setSalary(12000);
//将该员工信息放入数组中
arr[0] = se;
//临时工
HourEmployee he = new HourEmployee();
he.setName("李四");
he.setMoneyperhour(50);
he.setHour(200);
arr[1] = he;
//经理
Manager m = new Manager();
m.setName("王五");
m.setMyDate(new MyDate());
m.getMyDate().setYear(1992);
m.getMyDate().setMonth(2);
m.getMyDate().setDay(2);
m.setBonusRate(0.08);
m.setSalary(15000);
arr[2] = m;
//遍历员工信息,并统计实发总金额
double allsalary = 0;
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i].getInfo());
allsalary += arr[i].earning();
}
System.out.println("实发金额为:" + allsalary);
/*
从键盘输入当前月份值,如果员工是正式工(SalaryEmployee和 Manager)且本月生日,则通知他人事领取生日礼物
*/
Scanner input = new Scanner(System.in);
System.out.println("请输入本月月份:");
int month = input.nextInt();
for (int i = 0; i < arr.length; i++) {
if(arr[i] instanceof SalaryEmployee){
SalaryEmployee se1 = (SalaryEmployee) arr[i];//向上转型
if(se1.getMyDate().getMonth() == month){
System.out.println("生日快乐,请到人事领取生日礼物");
}
}
}
input.close();
}
}
二、测试结果
测试OK,代码OK。