【问题标题】:Correctly calling a method in a different class | Java正确调用不同类中的方法 |爪哇
【发布时间】:2015-09-28 10:32:21
【问题描述】:

我有一个超类 Employee 和它的子类(HourlyEmployee 和 CommissionEmployee)以及一个测试器类。

当我运行程序并获取用户值时,在它询问小时/销售额并计算工资之后 - 给出的值是 0.0。工资计算不正确 - 或根本不正确 - 为什么会这样?我该如何正确计算?

abstract class Employee {

// Data members
private String firstName;
private String lastName;
private int employeeNumber;
private int numberOfEmployees;
protected int hours;
protected int sales;
protected double pay;

// Default constructor
public Employee() {
    firstName = null;
    lastName = null;
    employeeNumber = 0;
    numberOfEmployees = 0;
}

// Getter and setter methods
public String getFirstName() {
    return firstName;
}
public void setFirstName(String firstName) {
    this.firstName = firstName;
}

public String getLastName() {
    return lastName;
}
public void setLastName(String lastName) {
    this.lastName = lastName;
}

public int getEmployeeNumber() {
    return employeeNumber;
}
public void setEmployeeNumber(int employeeNumber) {
    this.employeeNumber = employeeNumber;
}

public int getNumberOfEmployees() {
    return numberOfEmployees;
}
public void setNumberOfEmployees(int numberOfEmployees) {
    this.numberOfEmployees = numberOfEmployees;
}

// Abstract method to be implemented in sublcasses
public abstract void earnings();

@Override
public String toString(){
    return "First Name: " + getFirstName() + "\n" + "Last Name: " + getLastName() + "\n" +
            "Employee Number: " + getEmployeeNumber() + "\n" + "Number of Employees: "
            + getNumberOfEmployees();
}

}

`

public class HourlyEmployee extends Employee {

// Constructor
   public HourlyEmployee() {
        //Calls default constructor in superclass
        super();
   }

   // Establish the amount of pay for hourly employees
   int rate = 15;

   // Override earnings method
   @Override
   public void earnings(){
         pay = hours * rate;
   }

   // Return String representation of class
   public String toString(){
         return "First Name: " + getFirstName() + "Last Name: " + getLastName() +
        "Employee Number: " + getEmployeeNumber() + "Number of Employees: "
        + getNumberOfEmployees();
  }
  }

`

public class CommissionEmployee extends Employee {

     // Constructor
     public CommissionEmployee() {
         //Calls default constructor in superclass
         super();
     }

     // Establish the amount of pay for hourly employees
     double commission = 0.10;

     // Override earnings method
     @Override
     public void earnings(){
         pay = commission * sales;
     }

     // Return String representation of class
     public String toString(){
     return "First Name: " + getFirstName() + "Last Name: " + getLastName() +
        "Employee Number: " + getEmployeeNumber() + "Number of Employees: "
        + getNumberOfEmployees();
     }
}

`

import java.util.LinkedList;
import java.util.Scanner;

public class EmployeeTester {

    public static void main(String[] args) {

        // Protected double only visible in superclass and subclass.
        // Must be declared again in tester class.
        double pay;
        int hours;
        int sales;

        // Create new LinkedList
        LinkedList<Employee> employeeList = new LinkedList<>();

        // Create Scanner obkect
        Scanner keyboard = new Scanner(System.in);

        char yes = 'y';
        int x = 0;

        while(yes == 'y' || yes == 'Y'){

            // Declare & create a HourlyEmployee odject
            HourlyEmployee employee1 = new HourlyEmployee();
            employeeList.add(employee1);

            System.out.print("Enter First Name: ");
            String firstName = keyboard.next();
            employee1.setFirstName(firstName);
            employeeList.get(x).setFirstName(firstName);
            System.out.print("Enter Last Name: ");
            String lastName = keyboard.next();
            employee1.setLastName(lastName);
            employeeList.get(x).setLastName(lastName);
            System.out.print("Enter Employee Number: ");
            int employeeNumber = keyboard.nextInt();
            employee1.setEmployeeNumber(employeeNumber);
            employeeList.get(x).setEmployeeNumber(employeeNumber);
            System.out.print("Enter Number of Employees: ");
            int numberOfEmployees = keyboard.nextInt();
            employee1.setNumberOfEmployees(numberOfEmployees);
            employeeList.get(x).setNumberOfEmployees(numberOfEmployees);
            System.out.print("Enter Hours Worked: ");
            hours = keyboard.nextInt();


            // Calculate earnings
            employee1.earnings();

            System.out.println(employee1.toString());
            System.out.println("Total Earnings: " + employee1.pay);

            x++; // increment x

            System.out.print("Continue? [y/n] ");
            yes = keyboard.next().charAt(0);
        }

            // Declare & create a CommissionEmployee odject
            CommissionEmployee employee2 = new CommissionEmployee();
            employeeList.add(employee2);

            System.out.print("Enter First Name: ");
            String firstName = keyboard.next();
            employee2.setFirstName(firstName);
            employeeList.get(x).setFirstName(firstName);
            System.out.print("Enter Last Name: ");
            String lastName = keyboard.next();
            employee2.setLastName(lastName);
            employeeList.get(x).setLastName(lastName);
            System.out.print("Enter Employee Number: ");
            int employeeNumber = keyboard.nextInt();
            employee2.setEmployeeNumber(employeeNumber);
            employeeList.get(x).setEmployeeNumber(employeeNumber);
            System.out.print("Enter Number of Employees: ");
            int numberOfEmployees = keyboard.nextInt();
            employee2.setNumberOfEmployees(numberOfEmployees);
            employeeList.get(x).setNumberOfEmployees(numberOfEmployees);
            System.out.print("Enter Sales Made: ");
            sales = keyboard.nextInt();

            // Calculate earnings
            employee2.earnings();

            System.out.println(employee2.toString());
            System.out.println("Total Earnings: " + employee2.pay);

            x++; // increment x

            System.out.print("Continue? [y/n] ");
            yes = keyboard.next().charAt(0);

        }     
    }

【问题讨论】:

  • 您如何处理输入的小时数?看来你没有用它来计算?它初始化为零并将保持为 0,因此 0 * 15 = 0。在其他类中与 sales 相同
  • 你为什么一直在employee1employee2 上调用setter,然后employeeList.get(x) 上调用它?
  • 我的 2 美分:我不会依赖用户通过调用 earnings() 来更新 pay 值。您可以让 getter “根据要求”计算它或更新小时/销售额设置器中的值。

标签: java methods encapsulation superclass


【解决方案1】:

需要给员工对象设置 hours 和 sales,目前是 0,因为作为 int,sales 和 hours 都被初始化为 0,

所以,commission * sales 将变为 0,hours * rate 将变为 0。

在 EmployeeTester 中,将 Hours 设置为 HourlyEmployee 对象

System.out.print("Enter Hours Worked: ");
hours = keyboard.nextInt();
employee1.setHours(hours);

在 EmployeeTester 中,将 Sales 设置为 CommissionEmployee 对象

System.out.print("Enter Sales Made: ");
sales = keyboard.nextInt();
employee2.setSales(sales);

【讨论】:

    【解决方案2】:

    你需要在Employee中添加setHours方法

    public void setHours(int hours) {
            this.hours = hours;
        }
    

    在获得数小时后在 EmployeeTester 中调用此方法。

    【讨论】:

      猜你喜欢
      • 2015-05-23
      • 2020-08-08
      • 2015-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多