如何在Java中正确使用构造函数参数计算周薪(含加班费)

本文详解如何通过实例变量而非静态变量保存构造函数参数,并修正加班工资计算逻辑,实现准确的周薪计算。

在面向对象编程中,将构造函数参数正确绑定到实例状态是实现业务逻辑准确性的基础。你当前代码的核心问题在于:HourlyWage 和 Worked 被错误地声明为 static 字段,导致所有 Hourly 实例共享同一份数据——即后创建的对象会覆盖前一个对象的值,最终 A.WeeklyPay() 和 B.WeeklyPay() 都返回相同结果(如 465.0),完全丧失了对象独立性。

✅ 正确做法:使用实例变量(非 static)

应将字段改为非静态、私有、小驼峰命名的实例变量,并在构造函数中通过 this. 明确赋值:

public class Hourly extends Employee {
    private double hourlyWage;  // ← 实例变量,每个对象独有一份
    private int worked;         // ← 同上

    public Hourly(int id, String name, double hourlyWage, int worked) {
        super(name, id);                    // 假设父类 Employee 构造器接收 (name, id)
        this.hourlyWage = hourlyWage;       // ← 绑定到当前实例
        this.worked = worked;               // ← 绑定到当前实例
    }
}
⚠️ 注意:static 字段属于类级别,所有实例共用;而 this.xxx 指向当前对象的实例字段,确保数据隔离。

✅ 修正周薪计算逻辑(含加班规则)

根据标准劳动法逻辑(美国常见规则):

  • 前 40 小时为正常工时,按 hourlyWage × hours 计算;
  • 超出 40 小时部分为加班工时,按 hourlyWage × 1.5 × 加班小时数 计算;
  • 总周薪 = 正常工资 + 加班工资

因此,WeeklyPay() 方法需完整实现该逻辑:

protected double WeeklyPay() {
    final int REGULAR_HOURS = 40;
    final double OVERTIME_RATE = 1.5;

    if (worked > REGULAR_HOURS) {
        double regularPay = REGULAR_HOURS * hourlyWage;
        double overtimeHours = worked - REGULAR_HOURS;
        double overtimePay = overtimeHours * hourlyWage * OVERTIME_RATE;
        return regularPay + overtimePay;  // ← 关键:必须加回正常工资!
    } else {
        return worked * hourlyWage;
    }
}

✅ 验证示例:

  • A: 40 小时 × $15.25 = $610.00
  • B: 40×15.50 + 20×1

    5.50×1.5 = $620.00 + $465.00 = $1085.00

? 补充建议(提升健壮性)

  • 添加输入校验(如 worked
  • 使用 final 修饰常量(如 REGULAR_HOURS)增强可读性;
  • 重写 toString() 时避免硬编码字段名,可借助 IDE 自动生成或 String.format() 提升可维护性;
  • 若 Employee 是抽象类,确保 WeeklyPay() 是 abstract 或已提供默认实现。

通过以上调整,你的 Hourly 类即可真正实现“一对象一状态、一调用一结果”的面向对象设计原则,准确支撑薪资计算等核心业务逻辑。