所以我是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()?
答案 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变量是全局声明的,因为如果它们是,那么如果它们都引用相同的变量,那么拥有该类的对象是没有意义的。