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。有人能解释一下我到底怎么了吗?如果您需要澄清我的问题,请务必告诉我
# 1 楼答案
让我们看看我们正在打印的信息:
所有这些方法都存在于基类
Employee
中。它们在每个子类中都被覆盖。当我们调用方法时,如果它在子类中被重写,则调用被重写的方法在第一个示例中,我们对声明为
Secretary
的对象调用fileLegalBriefs()
。Secretary
类没有这个方法,所以这是一个错误,尽管对象实际上是一个LegalSecretary
,它有这个方法# 2 楼答案
如果不能在
Secretary
或LegalSecretary
的实例上从Employee
调用方法,就不会有任何继承点!这就是继承的含义——父类的方法由子类继承在第一个示例中,
LegalSecretary
是子类,Secretary
是父类。无法对Secretary
的实例调用fileLegalBriefs()
,因为该方法是在LegalSecretary
中定义的,并且父对象不是从其子对象继承的