在下面的类(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/