You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 03:59:41