2

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

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

ii) 现在允许用户重复输入每周数据。如果是Worker对象,用户必须输入 ID 和工时。如果是MachineWorker对象,用户必须输入 ID、hoursWorked 和pieces。一旦这些值在调用addWeekly()之前通过数组搜索以定位具有给定 ID 的对象。要传递给addWeekly的参数的数量(1 或 2)取决于所引用的对象的类型。要确定被引用对象的类型(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();

            }

        }
    }
4

3 回答 3

1

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

此外,您在打印薪水或奖金时不检查 null。在循环的任何时候,只会创建一种类型的对象,a[i] 或 b[i] 中的一个肯定为 null,从而导致 NullPointerException。

于 2012-10-15T17:06:50.170 回答
1

在您已经编写的循环之后,您需要另一个循环,以允许用户输入工人的工作时间。这可能是一个while不断要求输入的循环。然后,您将选择某种退出循环的输入。在循环中,您要求数小时并接受 2 或 3 个参数。

目前你没有存储你的工人/机器工人。您需要创建一个数组来存储它们。您还需要创建它们都将扩展/实现的基类或接口。这将允许您创建一个数组来存储它们。

然后,您遍历您的 Workers/MachineWorkers 数组,当您找到匹配的 id 时,您可以使用 yourinstanceof来确定是否需要传递 1 个或 2 个参数。如果它是 MachineWorker,您应该将其转换为这样,然后使用 2 个参数调用适当的方法。

于 2012-10-15T17:10:45.433 回答
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();
        }

    }
}
于 2012-10-15T18:08:03.400 回答