【问题标题】:Inheritance Error in javajava中的继承错误
【发布时间】:2014-06-20 09:50:01
【问题描述】:

这是所有的超类,Employee类。

import java.util.Scanner;
import java.util.Calendar;
import java.util.*;

class Employee {
    Scanner in = new Scanner(System.in);
    Calendar cal = Calendar.getInstance();
    String name;
    String number;
    int month;
    int week;
    double pay;

    void load() {
        System.out.println("Enter name of employee");
        name = in.nextLine();
        System.out.println("Enter social security number");
        number = in.nextLine();
        System.out.println("Enter employee's birthday month(1-12)");
        month = in.nextInt();
        System.out.println("Enter employee's birthday week(1-4)");
        week = in.nextInt();

    }

    public String toString() {
        return "employee : " + name + "  social security number : " + number
                + "  paycheck : $" + pay;
    }

    void getBonus() {
        int mont = cal.get(Calendar.MONTH);
        int day = cal.get(Calendar.DAY_OF_MONTH);
        if (month == mont + 1 && week == (day / 7) + 1)
            pay = pay + 100;
    }

}

这是雇员的子类。

import java.util.Scanner;

class Hourly extends Employee {
    Scanner in = new Scanner(System.in);
    double pay;
    int hpay;
    int hours;

    void load() {
        System.out.println("Enter hourly pay");
        hpay = in.nextInt();
        System.out.println("Enter no. of hours worked last week");
        hours = in.nextInt();
    }

    double getEarnings() {
        if (hours > 40)
            pay = 1.5 * (hours - 40) * hpay + hpay * 40;
        else
            pay = hpay * hours;
        return pay;
    }
}

还有 2 个这样的子类,最后我有了测试文件。

import java.util.Scanner;

class driver {
    public static void main(String args[]) {
        int i;
        Scanner in = new Scanner(System.in);
        System.out.println("Enter no. of employees");
        int a = in.nextInt();
        for (i = 1; i <= a; i++) {
            System.out
                    .println("Enter type : Hourly(1),Salaried(2),Salaried plus commision(3)");
            int b = in.nextInt();
            if (b == 1) {
                Hourly h = new Hourly();
                h.super.load();// error cannot find symbol h
                h.load();
                h.getEarnings();
            }
            if (b == 2) {
                Salaried s = new Salaried();

                s.load();
                s.getEarnings();
            }
            if (b == 3) {
                Salariedpluscommision sp = new Salariedpluscommision();
                sp.super();// error that super should be in first line but then
                            // where can i define sp
                sp.super.load();// cannot find symbol sp
                sp.load();
                sp.getEarnings();
            }

        }

    }
}

我在这些代码中有 3 个错误,因为我是初学者,所以我不知道如何解决这些错误。 我的程序从用户那里获取员工的详细信息并计算该员工的薪水。 另外,我很困惑如何在用户完成输入所有员工的详细信息后最后打印所有员工的薪水。我可以用数组来做这些吗? 但首先,我必须消除这些错误,并建议我应该更多关注哪些主题较弱。

提前谢谢你

【问题讨论】:

  • 请问您可以缩进您的代码吗?这真的很难阅读。
  • 谁想要 +2 rep 进行编辑?
  • 与其告诉我们您有“3 个错误”,不如告诉我们您遇到了什么错误?对您来说可能全是希腊语,但错误消息是有目的的。
  • 错误?编译时间?运行时间?
  • 我已经注释了驱动类中的错误(最后一个代码)

标签: java inheritance polymorphism superclass


【解决方案1】:

几个建议:

  1. 将Employee设为抽象类并添加public abstract getEarnings();方法
  2. 简化驱动程序例程以使用 switch / case 而不是多个 if 语句
  3. 创建一个 ArrayList 来收集所有员工的列表
  4. 使用员工的“类型”来创建正确的类型...尽管使用相同的变量名称
  5. 创建“正确类型”的员工后,加载并获取收入 ....(打印收入?
  6. 只创建对象.. 不要使用“super”

请考虑以下驱动程序:

import java.util.ArrayList;
import java.util.Scanner;

class driver {
public static void main(String args[]) {
    ArrayList<Employee> employees = new ArrayList<Employee>();
    Employee emp;
    double earnings;

    int i;
    Scanner in = new Scanner(System.in);
    System.out.println("Enter no. of employees");
    int a = in.nextInt();
    for (i = 1; i <= a; i++) {
        System.out.println("Enter type : Hourly(1),Salaried(2),Salaried plus commision(3)");
        int b = in.nextInt();
        emp = null;
        switch (b) {
        case 1:
            emp = new Hourly();
            break;
        case 2:
            emp = new Salaried();
            break;
        case 3:
            emp = new Salariedpluscommision();
            break;
        default:
            System.out.println("You entered an invalid employee type.");
            break;
        }
        if (emp != null) {
            emp.load();
            earnings = emp.getEarnings();
            employees.add(emp);
            System.out.println("Earnings are: " + earnings + "for " + emp.getName());
        }

【讨论】:

    【解决方案2】:

    您似乎对关键字super 有点困惑。

    在代码中

    Salariedpluscommision sp=new Salariedpluscommision();
    sp.super();//error that super should be in first line but then where can i define sp
    sp.super.load();//cannot find symbol sp
    sp.load();
    sp.getEarnings();
    

    编译器告诉你 super 不能在你使用它的地方使用。

    很可能您在driver 代码和代码中根本不需要它

    Salariedpluscommision sp=new Salariedpluscommision();
    sp.load();
    sp.getEarnings();
    

    会做你认为你需要这些调用的事情。

    同样,在前面的代码中,您可能只是删除该行

    h.super.load();// error cannot find symbol h
    

    然而,由于它是编码的,您可能需要从子类中调用一些超类方法,这就是关键字的用途。

    Hourly 和可能的其他子类中,您可能希望在子类load 方法中调用Employee load 方法:

    void load(){
        super.load();
        System.out.println("Enter hourly pay");
        hpay = in.nextInt();
        System.out.println("Enter no. of hours worked last week");
        hours = in.nextInt();
    }
    

    这似乎是您尝试使用driver 中的一些非编译代码。

    【讨论】:

    • 但我的课程就像雇员 -> 每小时 -> 司机。从驱动程序类,我正在制作扩展员工类的每小时类的对象。现在,我想在驱动程序类中应用员工类的 Load 方法。那么,我如何从驱动程序类中调用该方法?这就是我使用 h.super.load(); 的原因
    • 查看我的最新编辑。在我注意到您可能正在尝试的内容之后,我正在解决这个问题。
    • 是的,我知道了。谢谢
    猜你喜欢
    • 2014-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-11
    • 1970-01-01
    相关资源
    最近更新 更多