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

时间:2012-11-14 02:31:35

标签: 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;
}

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

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

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

以下是我测试它的方式:

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

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

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

或重申如何

return Employee.computeGrossPay() 

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

2 个答案:

答案 0 :(得分:7)

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

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

现在,您可能会收到编译错误,因为computeGrossPay正在尝试访问实例(非静态)字段,而该方法未在Employee的实例上调用。出于这个原因,computeGrossPay应该是一个实例方法:

private double computeGrossPay() { ... }

然后就会这样调用:

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

(这使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;
}

但这很丑陋并没有多大意义。

上面,我只是假设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视为静态字段。我这样做只是作为一个例子,但它似乎可以采取任何一种方式:所有员工可以有一个单一的工资率,或者每个员工都有自己的工资率。这取决于你的程序的上下文,这取决于你。

答案 1 :(得分:0)

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

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