好吧,您可以将引用声明s1
为 type Graduate
。通过声明 的引用,您获得的主要好处super type
是多态性的强大功能。
使用超类型引用,指向一个子类对象,您可以将同一个引用绑定到多个子类对象。调用的实际方法将在运行时根据所指向的对象来决定。但是,这样做的主要条件是,该方法也应该在子类中定义,否则编译器将无法找到方法声明。
在这里,您被迫这样做downcast
,因为您还没有在超类中定义方法。Student
由于编译器无法在类中看到该方法的定义。它不知道实际对象s1
指向什么。请记住,编译器仅检查引用类型以查找方法声明。
通常,每当您看到自己在代码中向下转换为子类时,这几乎总是表明有问题(但也有一些例外)。你应该修改你的类。
让我们看看使用超类引用而不是子类引用可以获得什么好处:
例如:假设您有另一个子类Student
as:
class Phd extends Student {
getResearchTopic(){...}
}
并且您还在Student
课堂上提供了一个定义(默认定义):
class Student {
getResearchTopic(){...}
}
现在,您创建以下两个对象,它们都被Student
引用指向:
Student student = new Phd();
student.getResearchTopic(); // Calls Phd class method
student = new Graduate();
student.getResearchTopic(); // Calls Graduate class method
因此,只需一个引用,您就可以访问特定于子类的方法。
您可以在factory method
模式中看到此功能的一个主要实现,其中单个静态方法根据某些条件返回不同子类的对象:
public static Student getInstance(String type) {
if (type.equals("graduate"))
return new Graduate();
else if (type.equals("phd"))
return new Phd();
}
因此,您可以看到相同的方法返回不同子类的对象。
你可以做以上所有事情只是因为一个概念:
Super 类引用可以引用任何子类对象,但反之则不行。