2017-02-18 4 views
0

Je suis sûr que cela a une solution simple, mais je suis nouveau à Java et ne peut pas fonctionner.Méthode de superclasse d'appel de la méthode sous-classe substituée

J'ai une sous-classe Payroll qui étend une superclasse Pay, elle contient une méthode surchargée appelée 'calc_payroll'. À partir de cette méthode, je souhaite appeler la méthode de super-classe du même nom et affecter la sortie à une variable dans la méthode de remplacement. Mon code est ci-dessous

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


} 

est Ci-dessous le code de la méthode calc_payroll dans la superclasse

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

la méthode fonctionne superclasse sans problème pour calculer et retourner le salaire brut lorsqu'il est appelé à partir d'une sous-classe différente, mais en l'appelant d'une méthode avec le même nom, la ligne d'impression dans le code ci-dessus (que j'ai étiqueté pour tester) affiche 0 pour toutes les variables

Le code pour la classe 'Pay' complète est ci-dessous comme demandé

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

La paie de sous-classe contient aucun autre code

Voici le code qui accepte l'entrée d'utilisateur pour attribuer des valeurs aux variables initialisées

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);  
} 


} 

Je suis confus!

+0

Plz poster vos deux classes complètes si possible, vous pourriez être pas initialisant les valeur tout en créant instance de la classe. Par défaut, tout 'int' obtient' 0', et 'float',' double' obtient '0.0'. –

+0

Pouvez-vous développer sur "lors de l'appel d'une méthode avec le même nom" ... –

+0

@OusmaneMahyDiaw OP veut juste appeler une méthode dans une méthode qui l'écrase. –

Répondre

0

Veuillez poster le code complet. Il semble que, pour une raison quelconque, vos variables de la méthode super classe ne reçoivent pas de valeurs correctement. Et ils sont initialisés avec leurs valeurs par défaut qui font tout 0. Je serai en mesure d'aider mieux si vous collez la classe complète.

1

Il est clair que le code ttlHours, stHours and rate n'est pas initialisé avec une valeur raisonnable. Donc quand vous appelez simplement super.calc_Payroll(), des valeurs comme 0 or 0.0 sont utilisées comme je l'ai expliqué dans mon commentaire. Il est bon de définir d'abord les valeurs de ces variables avant d'appeler super.calc_Payroll().

SetHours(23.4); //some value 

SetHoursStr(5); //some value 

SetRate(2.3); //some value 

Aussi vous n'avez pas constructeur de Pay classe, essayez de faire et toutes les variables initialisant uninitialised dans le constructeur ou utiliser setter/getter méthodes pour définir et obtenir des valeurs.

Comme vos deux classes étendent la classe Pay, cela crée le problème auquel vous êtes confronté. Lorsque vous appelez SetHours(Read.AcceptInputDouble()), il a défini la variable héritée par CalPayroll de Pay, et non les variables héritées par la classe Payroll. Ce que vous avez à faire est de définir des variables pour l'instance Payroll ainsi que pour la classe actuelle car les deux s'étendent Pay. Procédez comme suit remplacer votre boucle while comme,

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

mon mauvais, je pensais que vous vouliez seulement le code de la classe Pay, j'ai édité le poste original avec le code qui accepte l'entrée de l'utilisateur pour assigner des valeurs aux variables initialisées –

+0

@RickD j'ai mis à jour ma solution, plz vérifier maintenant. –

+0

Merci JackJay, je vais vérifier demain! –