有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么示例1不合法而示例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()中存在的方法,您需要一个cast。有人能解释一下我到底怎么了吗?如果您需要澄清我的问题,请务必告诉我


共 (2) 个答案

  1. # 1 楼答案

    让我们看看我们正在打印的信息:

    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中。它们在每个子类中都被覆盖。当我们调用方法时,如果它在子类中被重写,则调用被重写的方法

    在第一个示例中,我们对声明为Secretary的对象调用fileLegalBriefs()Secretary类没有这个方法,所以这是一个错误,尽管对象实际上是一个LegalSecretary,它有这个方法

  2. # 2 楼答案

    如果不能在SecretaryLegalSecretary的实例上从Employee调用方法,就不会有任何继承点!这就是继承的含义——父类的方法由子类继承

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