java - 在像 Java 这样的静态类型语言中动态方法解析背后的原因是什么

标签 java overriding

我对 Java 中引用变量的动态/静态类型和动态方法解析的概念有点困惑。

考虑:

public class Types {

    @Override
    public boolean equals(Object obj){
        System.out.println("in class Types equals()");
        return false;//Shut-up compiler!
    }

    public static void main(String[] args){
        Object typ = new Types();
        typ.equals("Hi");//can do this as String is a subclass of Object
    }
}

首先:引用变量typ是类型Types,不是吗?!

那么为什么 typ 有一个静态类型对象和一个动态类型类型来覆盖方法?

其次:编译器​​没有足够的信息来调用正确的equals()吗?

如果类 Types 没有重写的 equals(),那么它可以调用 Object.equals() 方法。

在这种情况下,类 Types 可以,并且编译器知道这一点。

为什么这不能像重载一样进行早期绑定(bind)?为什么将它留给 JVM?

最佳答案

这是面向对象编程的基本基石。

它归结为多态性。参见 here进一步阅读。

您绝对希望子类 可以覆盖行为;因为这允许您保持客户端代码不变;但你仍然能够引入新的/不同的行为;只需将另一个 对象传递给该客户端代码即可。

客户端代码知道调用哪个方法;但是 dispatch 必须在运行时发生。仅仅是因为编译器不知道(在大多数情况下)传入参数的确切类型。

关于java - 在像 Java 这样的静态类型语言中动态方法解析背后的原因是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44760553/

相关文章:

java - 更好地记录 Jackson 解析错误

java - 未找到 persistence.xml - 使用 NoSql 数据库的 Gradle-Spring-MVC 项目

java - 如何在托管的 spring 事务中运行遗留代码?

java - 如何从 Java 中的二维数组中删除占位值?

css - 覆盖仅在某些页面上可见的 css

java - JUnit:测试对象不在列表中

Django 管理模板覆盖在生产环境中不起作用

c++ - 为什么覆盖虚函数时不考虑访问限定符?

Java:调用父类(super class)的构造函数,该构造函数调用设置子类字段的重写方法

C# 组合框重写 ToString