我有一个名为 Student
的类和一个名为 AthleteStudent
的子类:
public class Student {
protected String name;
protected String age;
public void hello () {
system.out.println("Hello I'm Student");
}
}
public class AthleteStudent extends Student {
protected String sport;
public void hello () {
system.out.println("Hello I'm AthleteStudent");
}
public void changeDepartement() {
.....
}
}
现在让我们来看看这些测试用例:
AthleteStudent ats = new AthleteStudent("test", 22, "Karate");
Student std;
std = ats; // upcasting OK
/* ats and std point to the same object, i.e AthleteStudent */
ats.hello(); /* Hello I'm AthleteStudent => polymorphism OK */
std.hello(); /* Hello I'm AthleteStudent => polymorphism OK */
这里我不明白的是这个:
即使 std
引用了 AthleteStudent
,我也无法访问方法 changeDepartement()
。
std.changeDepartement(); // Doesn't work
只有当我们像这样转换这个对象时它才会起作用
((AthleteStudent) std).changeDepartement(); // OK
为什么我们需要强制 std
成为一个 AthleteStudent
对象,知道它被视为一个 AthleteStudent
对象?对于第一个示例,std.hello()
打印了来自 AthleteStudent
实现的那个,没有问题。
最佳答案
这不是多态性的损失。这是缺少duck typing .当编译器静态地只知道它是一个 Student
时,它不会允许您调用非 Student
方法。即使您知道,在运行时,Java 的静态类型系统也会拒绝它。其他语言有不关心的鸭子打字。 Java 不是其中之一。
关于java - 类型转换失去了多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29459546/