2017-02-18 13 views
0

이것은 간단한 해결책이 있지만 확실하지는 않지만 Java를 처음 사용하기 때문에 해결할 수 없습니다.재정의 된 Subclass 메서드에서 Superclass 메서드를 호출하십시오.

나는 슈퍼 클래스 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 방법의 코드는 아래에있는 내 코드는하지만, 동일한 이름의 메소드에서 호출 할 때 위의 코드 (테스트를 위해 레이블을 지정 함)의 인쇄 줄은 모든 변수에 대해 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())을 호출 할 때 CalPayroll에 상속 된 변수는 Payroll 클래스에서 상속 된 변수가 아닌 Pay에서 설정됩니다. 당신이해야 할 일은 Payroll 인스턴스를위한 변수와 현재 클래스를위한 변수를 둘 다 확장하여 Pay으로 확장하는 것입니다. 가능하면 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 내 솔루션을 업데이트, plz 지금 확인하십시오. –

+0

고마워요. JackJay, 내일 확인하겠습니다! –