通过return语句java调用私有方法

Uvr*_*vrD 6 java

所以我是java的新手,我正试图绕过这个.到目前为止,我正在编写一个调用私有方法的公共方法,这两个方法都写在同一个类中.在测试公共方法时,我能够针对对象employeeOne调用public方法,该对象的参数由用户提供.我不确定这里有私有方法调用,但是因为看起来我在类(我认为)上调用它而不是具有已定义属性的对象.

所以这是我在一个名为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;
}
Run Code Online (Sandbox Code Playgroud)

我试图想办法在另一个类中调用这个方法,显然因为它是一个私有方法,所以我不能在它编写的类之外的任何地方调用它.所以我写了一个调用的方法来调用私人方法

public double grossPayDisplay()
{
    return Employee.computeGrossPay();
}
Run Code Online (Sandbox Code Playgroud)

这是我的问题发挥作用:到目前为止,此代码的工作,但我不是完全清楚为什么它的工作原理.

这是我测试它的方式:

System.out.println(employeeOne.grossPayDisplay());
Run Code Online (Sandbox Code Playgroud)

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

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

或者重申如何做

return Employee.computeGrossPay() 
Run Code Online (Sandbox Code Playgroud)

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

Pau*_*ora 7

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

这"有效",但对我来说似乎不正确.字段类似于hoursWorked属于每个人的属性Employee- 尝试static从该字段的声明中删除.

现在,您可能会收到编译错误,因为computeGrossPay在没有在实例上调用该方法时,尝试访问实例(非静态)字段Employee.因此,computeGrossPay应该是一个实例方法:

private double computeGrossPay() { ... }
Run Code Online (Sandbox Code Playgroud)

然后会像这样调用它:

public double grossPayDisplay()
{
    return this.computeGrossPay();
}
Run Code Online (Sandbox Code Playgroud)

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

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

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;
}
Run Code Online (Sandbox Code Playgroud)

但这非常难看,并没有那么多意义.

上面,我只是假设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;
}
Run Code Online (Sandbox Code Playgroud)

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

最后一点:你会注意到我一直payRate像对待静态场一样对待.我这样做只是作为一个例子,但它似乎可以采取任何一种方式:所有员工可以有一个单一的工资率,或者每个员工都有自己的工资率.这取决于您的程序的上下文,这取决于您.