多态性和实例

时间:2012-10-15 16:58:45

标签: java arrays object polymorphism instanceof

我编写了一个Worker和MachineWorker类。它符合要求。但是当我运行它时,在连续三次声明之后程序停止。我找不到问题,我也不知道如何以及何时使用'instanceof'。 我正在写下面的问题以及所有课程......

问题: - (i)声明一个数组,该数组可以存储最多5个 Worker MachineWorker 对象的引用。 a)允许用户输入对象类型和该类型对象的数据(Worker的3个值和MachineWorker的4个值)。 b)构造在公共数组中存储引用的适当对象。

ii)现在允许用户重复输入每周数据。如果是工作人员,则对象用户必须输入ID并且小时工作。如果是 MachineWorker 对象,则用户必须输入ID,hoursWorked和pieces。一旦这些值读取通过数组搜索以在调用 addWeekly()之前找到具有给定ID的对象。将参数数量(1或2)传递给 addWeekly 取决于被引用对象的类型。要确定所引用对象的类型( Worker或MachineWorker ),您可以使用 instanceof 运算符。

请参阅下面的代码: -

 //Worker.java
    public class Worker { 
            public final double bonus=100;    
            protected String name, workerID;
            protected double hourlyRate, totalHoursWorked,tax,grossSalary,netSalary;

            public Worker(){

        }
    public Worker(String name, String workerID, double hourlyRate){
        this.name = name;
        this.workerID = workerID;
        this.hourlyRate = hourlyRate;

        }

    public void addWeekly(double hoursWorked){
        this.totalHoursWorked = this.totalHoursWorked + hoursWorked;
        }

    public double gross(){
        grossSalary = (totalHoursWorked*hourlyRate);
                if(totalHoursWorked>=150){
            grossSalary = grossSalary +100;
            }
            return  grossSalary;
            }
    public double netAndTax(){
        netSalary = grossSalary;
        if(grossSalary>500){
            tax = (grossSalary - 500) *0.3;
            netSalary = (grossSalary - tax);

        }
        return netSalary;
     }
    public String getName(){
        return this.name;
    }

    public String getWorkerID(){
        return this.workerID;
    }

    public double getHourlyRate(){
        return this.hourlyRate;
    }

    public double getTotalHours(){
        return totalHoursWorked;
    }

    public double getGrossSalary(){
        return grossSalary;
        }

    public void addToGross(double amt){
        grossSalary = grossSalary + amt;
    }
    public void displaySalary(){
        System.out.print("Name: " +getName() + "\nID :" + getWorkerID() 
                + "\nHourly Rate: " + getHourlyRate()+ "\nTotalHours Worked" + getTotalHours() + 
                "\nGross pay" + getGrossSalary() + "\nTax: " + netAndTax() + 
                "\nNet Pay: " + netAndTax());
    }

    }




//MachineWorker.java
    public class MachineWorker extends Worker{

        private double targetAmount;
        private double totalPieces, productivityBonus;

        public MachineWorker(String workerName, String workerID, double hourlyRate, double targetAmount)
        {
            super(workerName, workerID, hourlyRate);
            //this.productivityBonus = productivityBonus;
            this.targetAmount = targetAmount;

        }

        public void addWeekly(double hoursWorked, double weeklyAmount)
        {
            totalHoursWorked = hoursWorked + totalHoursWorked;
            totalPieces = weeklyAmount + totalPieces;
        }


        public double productivityBonus()
        {
            productivityBonus = 100 + (totalPieces - targetAmount);
            return productivityBonus;
        }

        public double gross()
        {
            grossSalary = (totalHoursWorked * hourlyRate) + productivityBonus;
            if(totalHoursWorked >= 150)
            {
                grossSalary = grossSalary + bonus;
            }
            return  grossSalary;
        }

        public void addToGross(double amt)
        {
            amt = productivityBonus;
            grossSalary = grossSalary + amt;
        }


        public void displaySalary()
        {

        System.out.println("Name    " + super.name + "\nID  " + 
        super.workerID + "\nHourly rate " + super.hourlyRate + "\nTotal Hours Worked    " + 
        super.totalHoursWorked + "\nGross Pay   $" + super.grossSalary + "\nTax $" + super.tax + "\nNetpay  $" + super.netSalary);
            System.out.println("Productivity Bonus  " + productivityBonus);
        }   
    }





  //Polymorphism PolyWorker.java

import java.util.*;
        public class PolyWorkers
    {
        public static void main(String args[])
        {
            Scanner input = new Scanner(System.in);

            Worker[] a = new Worker[5];
            MachineWorker[] b = new MachineWorker[5];

            char option = '0';
            String choice;
            boolean nChar = false;

            for (int i = 0; i < 5; i++){

                System.out.print("\tType of object " + (i+1) + " [W/M]: ");
                choice = input.nextLine();

                if (choice.length() == 1)
                {
                    option = choice.charAt(0); //pick the first character

                    if (option == 'w' || option == 'W')
                    {
                        System.out.println("\n\tEnter name, ID and hours:   ");
                        String name = input.nextLine();
                        System.out.print("  ");
                        String id = input.nextLine();
                        System.out.print("  ");
                        double hours = input.nextDouble();

                        a[i] = new Worker(name, id, hours);
                        System.out.println();

                    }
                    if (option == 'm' || option == 'M')
                    {
                        System.out.print("\n\tEnter name, ID, hours and pieces: ");
                        String name = input.nextLine();
                        System.out.print("  ");
                        String id = input.nextLine();
                        System.out.print("  ");
                        double hours = input.nextDouble();
                        System.out.print("  ");
                        double pieces = input.nextDouble();

                        b[i] = new MachineWorker(name, id, hours, pieces);
                        System.out.println();
                    }
                System.out.print("\tType of object " + (i+1) + " [W/M]: ");
                choice = input.nextLine();
                }


                a[i].displaySalary();
                b[i].displaySalary();
                b[i].productivityBonus();

            }

        }
    }

3 个答案:

答案 0 :(得分:1)

您的问题表明您必须将引用存储在公共数组中,而将它们存储在2个不同的数组ab中。由于您有不同类型的对象的不同数组,因此您无需使用instanceOf运算符。有关instanceOf的更多信息,请here

此外,在打印工资或奖金时,您不会检查空值。在循环的任何一点,只会创建一种类型的对象,其中一个[i]或b [i]肯定是null,导致NullPointerException。

答案 1 :(得分:1)

在您编写的循环之后,您需要另一个循环,以允许用户输入工作时间。这可能是一个while循环,会不断要求输入。然后,您将选择某种可以退出循环的输入。在循环内部,你要求几个小时,并采取2或3个参数。

目前您没有存储您的Workers / MachineWorkers。您需要创建一个数组来存储它们。您还需要创建一个它们将扩展/实现的基类或接口。这将允许您创建一个单独的数组来存储它们。

然后循环遍历您的Workers / MachineWorkers数组,当您找到匹配的ID时,使用instanceof来计算是否需要传递1或2个参数。如果它是MachineWorker,你应该这样抛出它,然后用2个参数调用适当的方法。

答案 2 :(得分:1)

您可能希望使用重写方法readfromInput和displaySalary来区分Worker和Machinworker所做的事情。 应该在类中实现不同的行为,而不是在调用的Polyworker类中实现。 如果Machineworker displaySalary显示奖金,则应在MachineWorker的displaySalary中调用

见下面的修改代码

//Worker.java
import java.util.Scanner;

/**
 * a generic worker
 */
public class Worker {
    public final double bonus = 100;
    protected String name, workerID;
    protected double hourlyRate, totalHoursWorked, tax, grossSalary, netSalary;


    public void addWeekly(double hoursWorked) {
        this.totalHoursWorked = this.totalHoursWorked + hoursWorked;
    }

    public double gross() {
        grossSalary = (totalHoursWorked * hourlyRate);
        if (totalHoursWorked >= 150) {
            grossSalary = grossSalary + 100;
        }
        return grossSalary;
    }

    public double netAndTax() {
        netSalary = grossSalary;
        if (grossSalary > 500) {
            tax = (grossSalary - 500) * 0.3;
            netSalary = (grossSalary - tax);

        }
        return netSalary;
    }

    public String getName() {
        return this.name;
    }

    public String getWorkerID() {
        return this.workerID;
    }

    public double getHourlyRate() {
        return this.hourlyRate;
    }

    public double getTotalHours() {
        return totalHoursWorked;
    }

    public double getGrossSalary() {
        return grossSalary;
    }

    public void addToGross(double amt) {
        grossSalary = grossSalary + amt;
    }

    public void displaySalary() {
        System.out.print("Name: " + getName() + "\nID :" + getWorkerID()
                + "\nHourly Rate: " + getHourlyRate() + "\nTotalHours Worked"
                + getTotalHours() + "\nGross pay" + getGrossSalary() + "\nTax: "
                + netAndTax() + "\nNet Pay: " + netAndTax());
    }

    public void readFromInput(Scanner input) {
        name = input.nextLine();
        System.out.print("  ");
        this.workerID= input.nextLine();
        System.out.print("  ");
        this.totalHoursWorked = input.nextDouble();
        System.out.println();
    }

} // Worker

//MachineWorker.java
import java.util.Scanner;
public class MachineWorker extends Worker {

    private double targetAmount;
    private double totalPieces, productivityBonus;

    public void addWeekly(double hoursWorked, double weeklyAmount) {
        totalHoursWorked = hoursWorked + totalHoursWorked;
        totalPieces = weeklyAmount + totalPieces;
    }

    public double productivityBonus() {
        productivityBonus = 100 + (totalPieces - targetAmount);
        return productivityBonus;
    }

    public double gross() {
        grossSalary = (totalHoursWorked * hourlyRate) + productivityBonus;
        if (totalHoursWorked >= 150) {
            grossSalary = grossSalary + bonus;
        }
        return grossSalary;
    }

    public void addToGross(double amt) {
        amt = productivityBonus;
        grossSalary = grossSalary + amt;
    }

    @Override
    public void displaySalary() {
        super.displaySalary();
        System.out.println("Productivity Bonus  " + productivityBonus);
    }

    @Override
    public void readFromInput(Scanner input) {
        super.readFromInput(input);
        this.totalPieces = input.nextDouble();
    }
}

//Polymorphism PolyWorker.java

import java.util.*;

public class PolyWorkers {
    public static void main(String args[]) {
        Scanner input = new Scanner(System.in);
        Worker[] workers = new Worker[5];

        char option = '0';
        String choice;

        for (int i = 0; i < 5; i++) {

            System.out.print("\tType of object " + (i + 1) + " [W/M]: ");
            choice = input.nextLine();

            if (choice.length() == 1) {
                option = choice.toLowerCase().charAt(0); // pick the first character
                switch (option) {
                case 'w': {
                    workers[i] = new Worker();
                    System.out.println("\n\tEnter name, ID and hours:   ");
                }
                    break;
                case 'm': {
                    System.out.print("\n\tEnter name, ID, hours and pieces: ");
                }
                    break;
                } // switch
                workers[i].readFromInput(input);
            }

            workers[i].displaySalary();
        }

    }
}