Java薪资计算程序问题:修改工时后薪资未更新且静态变量异常
问题分析与解决方案:Payroll类静态变量导致的薪资计算错误
嘿,我一眼就瞅出你遇到的问题根源了——你在Payroll类里把salary和payout声明成**静态变量(static)**了!这可是个典型的新手坑,静态变量属于整个类,不是每个实例单独拥有的,所以所有Payroll对象都会共享这两个值,这就导致了后面的混乱。
具体问题拆解
- 静态变量覆盖问题:当你创建第一个员工
e1时,salary被赋值为30*25=750,但创建第二个员工e2时,构造器里的salary = hrs*rate;直接把salary改成了20*25=500。因为是静态变量,所有实例调用getSalary()都会返回最后一次赋值的500,这就是为什么e1修改工时后薪资还是显示500。 - 缺少薪资更新逻辑:你调用
e1.increaseHrs(10)成功增加了工时,但没有同步更新对应的薪资,就算修复了静态变量的问题,薪资还是原来的旧值。
修改后的代码实现
先改Payroll类,把静态变量改成实例变量,同时增加工时修改后的薪资更新逻辑:
public class Payroll { // 移除static,让每个员工实例拥有自己的薪资 private double salary; private String employee_number; private int hours; private double hourly_rate; public Payroll(String num, int hrs, double rate) { this.employee_number = num; this.hours = hrs; this.hourly_rate = rate; // 初始化当前员工的薪资 this.salary = hrs * rate; } public String getNum() { return employee_number; } // 这里返回类型改成int,和hours的类型一致 public int getHrs() { return hours; } public double getRate() { return hourly_rate; } public double getSalary() { return salary; } public void increaseHrs(int amount) { hours += amount; // 工时增加后,重新计算薪资 this.salary = this.hours * this.hourly_rate; } }
然后修改TestPayroll类,把总薪资计算改成直接累加两个员工的薪资(原来的静态payout逻辑不合理,总薪资应该是所有员工薪资的总和,不属于单个实例):
import java.util.Date; import java.text.DateFormat; import java.text.NumberFormat; class TestPayroll { public static void main(String[] args) { Date d = new Date(); DateFormat df = DateFormat.getDateInstance(DateFormat.MEDIUM); NumberFormat nf = NumberFormat.getCurrencyInstance(); System.out.println("Payroll For Week Ending " + df.format(d)); System.out.println("------------------------------------"); Payroll e1 = new Payroll("444-4444", 30, 25); displaySalary(e1, nf); System.out.println("Employee # ...... " + e1.getNum()); System.out.println("Hours worked .... " + e1.getHrs() + " hours"); System.out.println("Hourly rate ..... " + e1.getRate() + "/hour"); System.out.println("Your salary is .. " + nf.format(e1.getSalary())); System.out.println("------------------------------------\n"); Payroll e2 = new Payroll("555-5555", 20, 25); displaySalary(e2, nf); System.out.println("Employee # ...... " + e2.getNum()); System.out.println("Hours worked .... " + e2.getHrs() + " hours"); System.out.println("Hourly rate ..... " + e2.getRate() + "/hour"); System.out.println("Your salary is .. " + nf.format(e2.getSalary())); System.out.println("------------------------------------"); e1.increaseHrs(10); displaySalary(e1, nf); System.out.println("Increase " + e1.getNum() + " by 10 hours"); System.out.println("Employee # ...... " + e1.getNum()); System.out.println("Hours worked .... " + e1.getHrs() + " hours"); System.out.println("Hourly rate ..... " + e1.getRate() + "/hour"); System.out.println("Your salary is .. " + nf.format(e1.getSalary())); System.out.println("------------------------------------\n"); // 直接计算两个员工的薪资总和 double totalPayout = e1.getSalary() + e2.getSalary(); System.out.println("Total payout amount .. " + nf.format(totalPayout)); System.out.println("------------End of Report-----------\n"); } public static void displaySalary(Payroll e, NumberFormat nf) { // 暂时没逻辑可以留空,或者根据需要补充 } }
修改后的运行结果
Payroll For Week Ending May 16, 2018 ------------------------------------ Employee # ...... 444-4444 Hours worked .... 30 hours Hourly rate ..... 25.0/hour Your salary is .. $750.00 ------------------------------------ Employee # ...... 555-5555 Hours worked .... 20 hours Hourly rate ..... 25.0/hour Your salary is .. $500.00 ------------------------------------ Increase 444-4444 by 10 hours Employee # ...... 444-4444 Hours worked .... 40 hours Hourly rate ..... 25.0/hour Your salary is .. $1,000.00 ------------------------------------ Total payout amount .. $1,500.00 ------------End of Report-----------
这样修改后,e1修改工时后的薪资会正确显示为1000,总薪资也会是1000+500=1500,完全符合你的需求啦!
内容的提问来源于stack exchange,提问作者Ingrid James
相关产品推荐
相关产品推荐

