为什么示例1不合法,而示例2是?

时间:2015-04-19 00:40:14

标签: java arrays inheritance polymorphism extends

以下2段代码来自我的教科书。

Secretary steve = new LegalSecretary();
steve.takeDictation("Hello!"); // OK
steve.fileLegalBriefs(); // compiler error


public class EmployeeMain4 {
    public static void main(String[] args) {
        Employee[] employees = {new Employee(), new Lawyer(),
        new Secretary(), new LegalSecretary()};

        // print information about each employee
        for (Employee e : employees) {
            System.out.print(e.getHours() + ", ");
            System.out.printf("$%.2f, ", e.getSalary());
            System.out.print(e.getVacationDays() + ", ");
            System.out.print(e.getVacationForm() + ", ");
            System.out.println(e); // calls toString
       }
    }
}

正如您可能已经知道的那样,这个问题与继承有关。我不明白为什么你可以创建一个对象数组,这些对象的类继承自Employee,并使用它们打印出没有强制转换的信息。第一段代码清楚地表明您需要使用强制转换来使用LegalSecretary()中存在的方法。有人可以解释一下我发生了什么事吗?如果您需要澄清我的问题,请告诉我们!

2 个答案:

答案 0 :(得分:3)

好吧,让我们来看看我们正在打印的信息:

System.out.print(e.getHours() + ", ");
System.out.printf("$%.2f, ", e.getSalary());
System.out.print(e.getVacationDays() + ", ");
System.out.print(e.getVacationForm() + ", ");
System.out.println(e); // calls toString

所有这些方法都存在于基类Employee类中。它们在每个子类中都被覆盖。当我们调用该方法时,如果它在子类中被覆盖,则调用overriden方法。

在第一个示例中,我们在声明为fileLegalBriefs()的对象上调用SecretarySecretary类没有该方法,所以它是一个错误,即使该对象实际上是LegalSecretary,它也有。

答案 1 :(得分:0)

如果您无法在EmployeeSecretary的实例上调用来自LegalSecretary的方法,那么就不会有任何继承点!这就是继承的含义 - 父类的方法由子类继承。

在第一个示例中,LegalSecretary是子类,Secretary是父类。您无法在fileLegalBriefs()的实例上调用Secretary,因为该方法在LegalSecretary中定义且父级不会从其子级继承。