用Java写 为某公司编写一个工资支付系统,用于计算某一类员工的月薪。该公司共有四类员工:领固定月薪的(SalariedEmployee);计时取酬的(HourlyEmployee,如果一月工时超过160小时,则还需对额外的工时支付加班费);按销售额提成(CommissionEmployee)的和带底薪并按销售额提成的(BasePlusCommissionEmployee),其继承层次结构如下所示。已知每类员工均有表示员工工号、姓名和出生年月的属性,和用于计算员工月薪的方法。创建一个Employee变量数组,保存Employee类层次结构中每个具体类对象的引用,对每个Employee显示其工号、姓名、出生年月和月收入,如果当月是Employee的生日所在的月份,则还另发给他100月作为红包。
时间: 2024-01-22 12:19:14 浏览: 33
以下是一个简单的实现:
```java
import java.util.Calendar;
import java.util.Scanner;
public class PayrollSystemTest {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int currentMonth = Calendar.getInstance().get(Calendar.MONTH) + 1;
Employee[] employees = new Employee[4];
employees[0] = new SalariedEmployee("001", "John Smith", "1990-01-01", 800);
employees[1] = new HourlyEmployee("002", "Karen Price", "1991-02-01", 16.75, 40);
employees[2] = new CommissionEmployee("003", "Sue Jones", "1992-03-01", 10000, 0.06);
employees[3] = new BasePlusCommissionEmployee("004", "Bob Lewis", "1993-04-01", 5000, 0.04, 300);
System.out.print("Enter the current month (1-12): ");
currentMonth = input.nextInt();
for (Employee employee : employees) {
System.out.println();
System.out.println(employee);
if (currentMonth == employee.getBirthMonth()) {
System.out.println("Happy birthday! You received a $100 bonus!");
}
System.out.printf("Earned $%,.2f%n", employee.earnings());
if (employee instanceof BasePlusCommissionEmployee) {
BasePlusCommissionEmployee basePlusCommissionEmployee = (BasePlusCommissionEmployee) employee;
basePlusCommissionEmployee.setBaseSalary(1.10 * basePlusCommissionEmployee.getBaseSalary());
System.out.printf("New base salary with 10%% increase is: $%,.2f%n", basePlusCommissionEmployee.getBaseSalary());
}
}
}
}
class Employee {
private String id;
private String name;
private String birthDate;
public Employee(String id, String name, String birthDate) {
this.id = id;
this.name = name;
this.birthDate = birthDate;
}
public String getId() {
return id;
}
public String getName() {
return name;
}
public String getBirthDate() {
return birthDate;
}
public int getBirthMonth() {
return Integer.parseInt(birthDate.split("-")[1]);
}
public double earnings() {
return 0.0;
}
@Override
public String toString() {
return getClass().getName() + ": " + getName() + ", ID: " + getId() + ", Birth date: " + getBirthDate();
}
}
class SalariedEmployee extends Employee {
private double weeklySalary;
public SalariedEmployee(String id, String name, String birthDate, double weeklySalary) {
super(id, name, birthDate);
this.weeklySalary = weeklySalary;
}
public double getWeeklySalary() {
return weeklySalary;
}
@Override
public double earnings() {
return getWeeklySalary() * 4;
}
@Override
public String toString() {
return super.toString() + ", Weekly salary: " + getWeeklySalary();
}
}
class HourlyEmployee extends Employee {
private double wage;
private double hours;
public HourlyEmployee(String id, String name, String birthDate, double wage, double hours) {
super(id, name, birthDate);
this.wage = wage;
this.hours = hours;
}
public double getWage() {
return wage;
}
public double getHours() {
return hours;
}
@Override
public double earnings() {
if (getHours() > 160) {
return getWage() * 160 + getWage() * 1.5 * (getHours() - 160);
} else {
return getWage() * getHours();
}
}
@Override
public String toString() {
return super.toString() + ", Wage: " + getWage() + ", Hours: " + getHours();
}
}
class CommissionEmployee extends Employee {
private double grossSales;
private double commissionRate;
public CommissionEmployee(String id, String name, String birthDate, double grossSales, double commissionRate) {
super(id, name, birthDate);
this.grossSales = grossSales;
this.commissionRate = commissionRate;
}
public double getGrossSales() {
return grossSales;
}
public double getCommissionRate() {
return commissionRate;
}
@Override
public double earnings() {
return getGrossSales() * getCommissionRate();
}
@Override
public String toString() {
return super.toString() + ", Gross sales: " + getGrossSales() + ", Commission rate: " + getCommissionRate();
}
}
class BasePlusCommissionEmployee extends CommissionEmployee {
private double baseSalary;
public BasePlusCommissionEmployee(String id, String name, String birthDate, double grossSales, double commissionRate, double baseSalary) {
super(id, name, birthDate, grossSales, commissionRate);
this.baseSalary = baseSalary;
}
public double getBaseSalary() {
return baseSalary;
}
public void setBaseSalary(double baseSalary) {
this.baseSalary = baseSalary;
}
@Override
public double earnings() {
return super.earnings() + getBaseSalary();
}
@Override
public String toString() {
return super.toString() + ", Base salary: " + getBaseSalary();
}
}
```
在该示例中,`Employee` 类是所有员工类型的基类,包含了员工的基本信息和计算月收入的抽象方法 `earnings()`。其他的员工类型都继承自 `Employee` 类,并根据自己的特点实现了 `earnings()` 方法。
在 `PayrollSystemTest` 类中,我们创建了一个 `Employee` 变量数组,并初始化了每个元素为不同类型的员工。然后,我们通过循环遍历员工数组,输出每个员工的基本信息、月收入,以及如果当月是生日月份,额外发放的红包。如果员工是 `BasePlusCommissionEmployee` 类型,我们还额外输出了他们的基本工资,并对其进行了 10% 的加薪。
注意,该示例中只是简单地将员工的月收入计算方式实现了一下,并没有考虑到诸如税收等更加复杂的情况。在实际的工资支付系统中,需要更加细致地处理这些问题。