2017-02-18 7 views
0

Я уверен, что у этого есть простое решение, но я новичок в Java и не могу его обработать.Вызов метода суперкласса из переопределенного метода подкласса

У меня есть подкласс Payroll, который расширяет надкласс Pay, он содержит переопределенный метод, называемый 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; 
} 
} 

подкласс Payroll не содержит другой код

Ниже приведен код, который принимает входные данные пользователя, чтобы присвоить значения инициализируются переменные

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()), он устанавливает переменную, унаследованную CalPayroll, от Pay, а не переменные, унаследованные классом 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 я обновил свое решение, теперь plz. –

+0

Спасибо JackJay, я проверю это завтра! –