6

だから私はJavaに不慣れで、これに頭を悩ませようとしています。これまでのところ、プライベートメソッドを呼び出すパブリックメソッドを作成しています。どちらも同じクラスで作成されています。publicメソッドをテストするとき、パラメーターがユーザーによって提供されるオブジェクト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()に渡しますか?

4

2 に答える 2

7

computeGrossPayEmployeeは静的メソッドです。つまり、特定のオブジェクトではなく、クラス自体に属します。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つ、私が静的フィールドのように扱い続けていることに気付くでしょう。例としてそれを実行しましたが、どちらの方向にも進む可能性があります。つまり、すべての従業員に単一の支払いレートを設定することも、各従業員に独自の支払いレートを設定することもできます。それはあなたのプログラムの文脈に依存し、それはあなた次第です。

于 2012-11-14T02:41:52.740 に答える
0

コンパイラが従業員から従業員に変わるとは思わない。プライベートメソッドは静的として宣言されているため、それが参照する変数は(静的の定義により)そのクラスのすべてのメンバーに共通です。

hoursWorked、grossPay、およびpayRate変数はグローバルに宣言されていますか。宣言されている場合、それらがすべて同じ変数を参照している場合、そのクラスのオブジェクトを持つことは意味がありません。

于 2012-11-14T02:42:48.983 に答える