6

所以我是java新手,我正试图解决这个问题。到目前为止,我正在编写一个调用私有方法的公共方法,这两个方法都写在同一个类中。在测试公共方法时,我可以针对一个对象employeeOne 调用公共方法,该对象的参数由用户提供。我不确定这里的私有方法调用发生了什么,因为看起来我是在类(我认为)而不是具有已定义属性的对象上调用它。

所以这是我在一个名为 Employee 的类中编写的私有方法:

private static double computeGrossPay()
{
    if (hoursWorked <= 40)
    {
        grossPay = (hoursWorked * payRate);
    }
    else if (hoursWorked >= 40)
    {
        grossPay = ((40 * payRate) + ((1.5 * payRate) * (hoursWorked - 40)));
    }
    return grossPay;
}

我试图找出一种在另一个类中调用这个方法的方法,显然因为它是一个私有方法,我不能在它所写的类之外的任何地方调用它。所以我写了一个公共方法来调用私有方法

public double grossPayDisplay()
{
    return Employee.computeGrossPay();
}

这就是我的问题发挥作用的地方:到目前为止,这段代码有效,但我并不完全清楚它为什么有效。

这是我测试它的方法:

System.out.println(employeeOne.grossPayDisplay());

employeeOne 是从 Employee 类创建的对象,其参数由用户提供,我的问题是:

编译器如何从 Employee.computeGrossPay() 中的 Employee 转到 employeeOne?

或重申如何

return Employee.computeGrossPay() 

实际上将属性传递给 computeGrossPay()?

4

2 回答 2

7

computeGrossPay是一个静态方法,这意味着它属于类本身,而不是任何特定的Employee对象。静态方法只能访问其他静态成员,所以看起来你的字段也hoursWorked必须是静态的。

这“有效”,但对我来说似乎不正确。像这样的字段hoursWorked是应该属于每个人的属性Employee- 尝试static从该字段的声明中删除。

现在,您可能会遇到编译错误,因为computeGrossPay当该方法未在Employee. 出于这个原因computeGrossPay,可能应该是一个实例方法:

private double computeGrossPay() { ... }

然后它会被这样调用:

public double grossPayDisplay()
{
    return this.computeGrossPay();
}

(这grossPayDisplay看起来有点毫无意义 - 你可以computeGrossPay公开)

或者,computeGrossPay可以保持静态并以 aEmployee作为参数:

private static double computeGrossPay(Employee employee)
{
    if (employee.hoursWorked <= 40)
    {
        employee.grossPay = (employee.hoursWorked * payRate);
    } else if (hoursWorked >= 40)
    {
        employee.grossPay = ((40 * payRate) + ((1.5 * payRate) * (employee.hoursWorked - 40)));
    }
    return employee.grossPay;
}

但这很丑陋,而且没有多大意义。

上面,我只是假设grossPay也是一个实例字段 - 但它的使用方式感觉有点奇怪。由于总工资是即时计算的,因此似乎不应该将其保存在字段中。考虑使其成为方法中的局部变量:

private double computeGrossPay()
{
    double grossPay; //declare the local variable

    //assign it depending on hoursWorked
    if (hoursWorked <= 40)
    {
        grossPay = (hoursWorked * payRate);
    }
    else
    {
        grossPay = ((40 * payRate) + ((1.5 * payRate) * (hoursWorked - 40)));
    }

    //return its value
    return grossPay;
}

(对于最后一点,该方法是否为静态无关紧要)

最后一点:您会注意到我一直将payRate其视为静态字段。我只是举个例子,但它似乎可以采取任何一种方式:所有员工都可以有一个单一的工资率,或者每个员工都可以有自己的工资率。这仅取决于您的程序的上下文,这取决于您。

于 2012-11-14T02:41:52.740 回答
0

我不相信编译器会从员工到员工。您的私有方法被声明为静态,因此它引用的变量(根据静态的定义)对于该类的任何成员都是通用的。

您的 hoursWorked、grossPay 和 payRate 变量是否在全局范围内声明,因为如果它们是,那么如果它们都引用相同的变量,那么拥有该类的对象是没有意义的。

于 2012-11-14T02:42:48.983 回答