2017-02-18 11 views
0

これは単純な解決策を持っていると確信していますが、私はJavaを使い慣れていないので、それを解決できません。オーバーライドされたサブクラスメソッドからスーパークラスメソッドを呼び出す

私はスーパークラスPayを拡張するサブクラスPayrollを持っています。これには、 'calc_payroll'というオーバーライドされたメソッドが含まれています。このメソッドから、同じ名前のスーパークラスメソッドを呼び出して、オーバーライドメソッドの変数に出力を割り当てたいとします。私のコードは

以下
public class Payroll extends Pay 
{ 
    public double calc_Payroll() 
{ 
    double grossPay = super.calc_Payroll(); 
    double taxAmt = tax(grossPay); 
    double netPay = grossPay - taxAmt; 

    System.out.println(grossPay); 

    return netPay; 
} 


} 

異なるサブクラスから呼び出された場合給与総額を計算して返すために問題のないスーパー

public double calc_Payroll() 
{ 
    double otRate = rate * 1.77; 
    double otHours = ttlHours - stHours; 

    if(stHours == 0) 
    { 
     grossPay = otHours * rate; 
    } 

    else 
    { 
     grossPay = ((stHours * rate) + (otHours * otRate)); 
    } 

    System.out.println(stHours + "//" + otHours + "//" + rate);//for testing 

    return grossPay; 
} 

でcalc_payroll方法からコードスーパークラスメソッド関数ですが、下にあります同じ名前のメソッドから呼び出すと、上のコードのprint行(テスト用にラベル付けしたもの)はすべての変数に対して0を表示します。

フル 'Pay'クラスのコードは、以下のとおりです。

public class Pay 
{ 
private double ttlHours; 
private int stHours; 
private double rate; 
double grossPay = 0.0; 
final double TAXL = 0.07; 
final double TAXM = 0.1; 
final double TAXH = 0.16; 

public void SetHours(double a) 
{ 
    ttlHours = a; 
} 

public void SetHoursStr(int a) 
{ 
    stHours = a; 
} 

public void SetRate(double a) 
{ 
    rate = a; 
} 

public double GetHours() 
{ 
    return ttlHours; 
} 

public int GetStHours() 
{ 
    return stHours; 
} 

public double GetRate() 
{ 
    return rate; 
} 

public double taxRate() 
{ 
    double taxRate = 0.0; 

    if(grossPay <= 399.99) 
    { 
     taxRate = TAXL; 
    } 
    else if(grossPay <= 899.99) 
    { 
     taxRate = TAXM;   
    } 
    else 
    { 
     taxRate = TAXH; 
    } 

    return taxRate; 
} 

public double tax(double grossPay) 
{ 
    double ttlTax = 0.0;   

    if(grossPay < 400.00) 
    { 
     ttlTax += (grossPay * TAXL); 
    } 

    else if(grossPay < 900.00) 
    { 
     ttlTax += (grossPay * TAXM); 
    } 

    else 
    { 
     ttlTax += (grossPay * TAXH); 
    } 

    return ttlTax; 
} 

public double calc_Payroll() 
{ 
    double otRate = rate * 1.77; 
    double otHours = ttlHours - stHours; 

    if(stHours == 0) 
    { 
     grossPay = otHours * rate; 
    } 

    else 
    { 
     grossPay = ((stHours * rate) + (otHours * otRate)); 
    } 

    System.out.println(stHours + "//" + otHours + "//" + rate);//for testing 

    return grossPay; 
} 
} 

サブクラスの給与は、他のコード

以下

が含まれていない、私は混乱している初期化された変数

public class CalPayroll extends Pay 
{ 
Payroll nPay = new Payroll(); 
Accept Read = new Accept(); 


public void AcceptPay() 
{ 
    char select = '0'; 

    while(select != 'e' && select != 'E') 
     { 
      System.out.println("Payroll Computation \n");   
      System.out.print("Enter number of hours worked (00.0) <0 for Quick exit>: "); 
      SetHours(Read.AcceptInputDouble()); 
      System.out.print("Enter first number of hours straight (integer or 0 to disable): "); 
      SetHoursStr(Read.AcceptInputInt()); 
      System.out.print("Enter hourly rate of worker (00.00): "); 
      SetRate(Read.AcceptInputDouble()); 
      Screen.ScrollScreen('=', 66, 1); 
      Screen.ScrollScreen(1); 
      displayInfo(); 
      System.out.println("e to exit, any other letter + <Enter> to continue"); 
      select = Read.AcceptInputChar(); 
     } 
} 

public void displayInfo() 
{  
    NumberFormat currency = NumberFormat.getCurrencyInstance(); 
    NumberFormat percent = NumberFormat.getPercentInstance(); 

    System.out.println("Gross pay is :" + currency.format(calc_Payroll())); 
    System.out.println("Tax is :" + percent.format(taxRate())); 
    System.out.println("Net pay is :" + currency.format(nPay.calc_Payroll()));  
    Screen.ScrollScreen(1);  
} 


} 

に値を割り当てるために、ユーザの入力を受け付けたコードです!

+0

、としてあなたwhileループを置き換える次の操作を行い、あなたはそれらの値を初期化しませいる可能性があります。デフォルトでは 'int'は' 0'、 'float'、' double'は '0.0'です。 –

+0

「同じ名前のメソッドから呼び出すときに」展開できますか... –

+0

@OusmaneMahyDiaw OPは、オーバーライドするメソッド内でメソッドを呼び出すだけです。 –

答えて

0

完全なコードを投稿してください。 何らかの理由でスーパークラスメソッドの変数に値が正しく割り当てられていないようです。そして、それらはすべて0になっているデフォルト値で初期化されます。完全なクラスを貼り付けると、私はよりうまく助けることができます。

1

あなたのコードから明らかなように、ttlHours, stHours and rateは適切な値で初期化されていません。だからちょうどsuper.calc_Payroll()を呼び出すとき、私は私のコメントで説明したように0 or 0.0のような値が使用されます。 super.calc_Payroll()を呼び出す前に、これらの変数の値を最初に設定することをお勧めします。

SetHours(23.4); //some value 

SetHoursStr(5); //some value 

SetRate(2.3); //some value 

また、あなたは、Payクラスのコンストラクタを持ってそれを作ると、コンストラクタで初期化されていないすべての変数を初期化してみてくださいまたは値を設定および取得するsetter/getterメソッドを使用しないでください。

両方のクラスがPayクラスを拡張しているため、直面している問題が発生します。 SetHours(Read.AcceptInputDouble())を呼び出すと、Payrollクラスに継承された変数ではなく、CalPayrollによって継承された変数がPayに設定されます。あなたがしなければならないのは、両方ともPayを拡張するので、Payrollインスタンスと現在のクラスの変数を設定することです。クラスのインスタンスを作成しながら、可能な場合はPlzはあなたの完全なクラスの両方を投稿

while(select != 'e' && select != 'E') 
     { 
      System.out.println("Payroll Computation \n");   
      System.out.print("Enter number of hours worked (00.0) <0 for Quick exit>: "); 
      SetHours(Read.AcceptInputDouble()); 
      nPay.SetHours(GetHours()); 
      System.out.print("Enter first number of hours straight (integer or 0 to disable): "); 
      SetHoursStr(Read.AcceptInputInt()); 
      nPay.SetHoursStr(GetStHours()); 
      System.out.print("Enter hourly rate of worker (00.00): "); 
      SetRate(Read.AcceptInputDouble()); 
      nPay.SetRate(GetRate()); 
      Screen.ScrollScreen('=', 66, 1); 
      Screen.ScrollScreen(1); 
      displayInfo(); 
      System.out.println("e to exit, any other letter + <Enter> to continue"); 
      select = Read.AcceptInputChar(); 
     } 
+0

で自分の投稿を編集しました。私はPayクラスのコードがほしいと思っていました。私は元の投稿を編集しました。ユーザー入力を受け入れて初期化された変数に値を割り当てます。 –

+0

@RickD私のソリューションを更新しました、今すぐチェックしてください。 –

+0

ありがとうジャックジェイ、私は明日それをチェックします! –

関連する問題