java - 类型转换失去了多态性

标签 java

我有一个名为 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/

相关文章:

java - 使用 pop3 按日期降序获取邮件

java - Android 绑定(bind)策略,适配器应该做工作,还是 View ?

java - 问题是 maven install - 找不到符号客户端

java - 编写java程序登录HTTP PHP网站

Java:分离 JAR 版本

java - BorderLayout 显示不正确

java - 将 Java 代码格式化为 Word/RTF

java - 搜索 unicode 字符串

JAVA 将 AES key 、初始化 vector 和数据从加密文件中分离出来,并在加密过程中使用这 3 种组合

java - 根据时间戳检索kafka主题中的偏移量