2017-02-18 121 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; 
} 


} 

下面是从calc_payroll方法在超

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 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

如果可能的话PLZ发表您既充满类,你可能是在创建类的实例初始化没有那些价值。默认情况下,所有的'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())时,它将从Pay中设置由CalPayroll继承的变量,而不是由Payroll类继承的变量。你所要做的就是为Payroll实例和当前类设置变量,因为它们都延伸到Pay。请执行以下操作更换您while环路,

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

谢谢JackJay,我明天会看看! –