
本文详解如何通过实例变量而非静态变量保存构造函数参数,并修正加班工资计算逻辑,实现准确的周薪计算。
在面向对象编程中,将构造函数参数正确绑定到实例状态是实现业务逻辑准确性的基础。你当前代码的核心问题在于: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() 方法需完整实现该逻辑:
立即学习“Java免费学习笔记(深入)”;
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×15.50×1.5 = $620.00 + $465.00 = $1085.00
? 补充建议(提升健壮性)
- 添加输入校验(如 worked
- 使用 final 修饰常量(如 REGULAR_HOURS)增强可读性;
- 重写 toString() 时避免硬编码字段名,可借助 IDE 自动生成或 String.format() 提升可维护性;
- 若 Employee 是抽象类,确保 WeeklyPay() 是 abstract 或已提供默认实现。
通过以上调整,你的 Hourly 类即可真正实现“一对象一状态、一调用一结果”的面向对象设计原则,准确支撑薪资计算等核心业务逻辑。










