以下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()
中存在的方法。有人可以解释一下我发生了什么事吗?如果您需要澄清我的问题,请告诉我们!
答案 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()
的对象上调用Secretary
。 Secretary
类没有该方法,所以它是一个错误,即使该对象实际上是LegalSecretary
,它也有。
答案 1 :(得分:0)
如果您无法在Employee
或Secretary
的实例上调用来自LegalSecretary
的方法,那么就不会有任何继承点!这就是继承的含义 - 父类的方法由子类继承。
在第一个示例中,LegalSecretary
是子类,Secretary
是父类。您无法在fileLegalBriefs()
的实例上调用Secretary
,因为该方法在LegalSecretary
中定义且父级不会从其子级继承。