Java多态处理: Incorrect output?

标签 java arrays polymorphism test-data

在下面的类(class)中,我尝试打印工资系统中员工的详细信息。 请注意,Porter、Pharmacist 和 Surgeon 均继承自 Employee。

但是,它只是重复打印添加到数组中的第一个员工的详细信息。我知道预期的输出,但我无法重现它。

类(class):

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

请注意,预期输出应该是打印测试数据每个成员的详细信息,即每个药剂师、外科医生等......

最佳答案

罪魁祸首是:

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;

        }
    }

}

它只是将列表中的所有员工设置为首次调用该函数的参数;当你第一次调用它时,employees 充满了 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.

关于Java多态处理: Incorrect output?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24066550/

相关文章:

Java maven Junit读取systemproperties变量来加载属性文件

java - Android引起的java.lang.outofmemory错误

jQuery 数组与 == 的比较?

c++ - 使用基本数组来实现兼容性

c++ - 派生类对象覆盖对象 vector 中基类的函数

java - 多态性混合对象、列表和接口(interface)

java - 什么是用于在 Java 中使用堆栈进行长减法的(递归或非递归)算法的示例?

java - 如何使java应用程序成为windows服务?

javascript - 无法获取映射的映射以返回值

java - 我可以从 super 的 super 调用重写的方法吗?