2014-06-05 2 views
0

다음 클래스에서는 급여 시스템에서 Employees 세부 정보를 인쇄하려고합니다. 포터, 약사 및 외과 의사는 모두 직원으로부터 상속받습니다.Java 다형성 처리 : 잘못된 출력?

그러나 배열에 추가 된 첫 번째 직원의 세부 정보 만 반복적으로 인쇄합니다. 예상되는 출력을 알고 있지만 그것을 재현 할 수 없습니다.

등급 :

public class PayrollManager { 

    public static final int HOURS_PER_WEEK = 35; 

    public static Employee[] employees = new Employee[6]; 

    public static void main(String[] args) { 

     // create all employees 
     Employee generalEmployee = new Employee("Odd", "Jobbie", 10.50); 
     Employee porter1 = new Porter("Ivana", "Patient", 10.50, "Royal"); 
     Employee porter2 = new Porter("Amanda", "Pushabed", 10.50, "BCH"); 
     Employee surgeon1 = new Surgeon("Jack", "Ripper", 55.25, "Renal", 
       650.00); 
     Employee surgeon2 = new Surgeon("Edward", "Lister", 55.25, "Vascular", 
       800.00); 
     Employee pharmacist = new Pharmacist("Poppy", "Pill", 30.50, 7, 750); 

     // call method to handle adding the employees to the list 
     addEmployeeToList(generalEmployee); 
     addEmployeeToList(porter1); 
     addEmployeeToList(porter2); 
     addEmployeeToList(surgeon1); 
     addEmployeeToList(surgeon2); 
     addEmployeeToList(pharmacist); 

     // show all employees 
     displayAllEmployees(); 
     System.out.println(); 
     // run payroll 
     processWeeklyPayroll(); 

    }// end of main 

    /** 
    * Method to add an Employee to an array 
    * 
    * @param e 
    */ 
    public static void addEmployeeToList(Employee e) { 

     for (int loop = 0; loop < employees.length; loop++) { 
      // check there is a space 
      if (employees[loop] == null) { 
       // add it to free space 
       employees[loop] = e; 

      } 
     } 

    } 

    public static void displayAllEmployees() { 

     for (Employee e : employees) { 

      if (e != null) { 

       e.displayAll(); 
       System.out.println(); 
      } 
     } 
    } 

    public static void processWeeklyPayroll() { 

     for (Employee e : employees) { 

      if (e != null) { 

       e.calculateWeeklySalary(HOURS_PER_WEEK); 
       // line break 
       System.out.println(); 
      } 
     } 

    } 

} 

전류 출력 : 예상 출력 등 즉, 테스트 데이터의 각 구성원 각각 약사, 의사의 세부 사항을 인쇄해야한다는

[Employee] Odd Jobbie 10.500000 
[Employee] Odd Jobbie 10.500000 
[Employee] Odd Jobbie 10.500000 
[Employee] Odd Jobbie 10.500000 
[Employee] Odd Jobbie 10.500000 
[Employee] Odd Jobbie 10.500000 

Odd Jobbie [Base Rate Employee] : 35.000000hrs * £10.500000= £367.500000 
Odd Jobbie [Base Rate Employee] : 35.000000hrs * £10.500000= £367.500000 
Odd Jobbie [Base Rate Employee] : 35.000000hrs * £10.500000= £367.500000 
Odd Jobbie [Base Rate Employee] : 35.000000hrs * £10.500000= £367.500000 
Odd Jobbie [Base Rate Employee] : 35.000000hrs * £10.500000= £367.500000 
Odd Jobbie [Base Rate Employee] : 35.000000hrs * £10.500000= £367.500000 

주 ...

+1

내 생각에 변수는 모두 정적 인 것 같습니다. 관련 수업을 보여주세요 - 이상적으로는 짧지 만 문제를 보여주는 완전한 * 프로그램입니다. (그리고 이상적으로, 통화 값에 대해'double'을 사용하는 것을 중지하십시오 ...) –

답변

1

이것은 범인입니다 :

public static void addEmployeeToList(Employee e) { 

    for (int loop = 0; loop < employees.length; loop++) { 
     // check there is a space 
     if (employees[loop] == null) { 
      // add it to free space 
      employees[loop] = e; 

     } 
    } 

} 

목록의 모든 직원을 함수가 처음 호출되는 인수로 설정하면됩니다. 처음 호출 할 때 직원은 null 요소로 가득 차 있으므로 조건은 항상 true입니다. 두 번째, 세 번째 등의 시간은 모든 요소가 generalEmployee로 설정됩니다.

public static void addEmployeeToList(Employee e) { 

    for (int loop = 0; loop < employees.length; loop++) { 
     // check there is a space 
     if (employees[loop] == null) { 
      // add it to free space 
      employees[loop] = e; 
      break; 
     } 
    } 

} 

을하지만 강하게의 ArrayList를 사용하는 것이 좋습니다 :

빠른 수정 될 것입니다.

ArrayList<Employee> employees = new ArrayList<Employee>(); //here you declare a dinamically resizing list. 
employees.add(e) //this is how you add a new Employee to the list. 
+0

고맙습니다, 그래, arrayList를 사용하는 것을 선호 하겠지만 특별히 배열을 사용하도록 명시된 운동! –