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

Cli*_*ira 3 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
    }
}
Run Code Online (Sandbox Code Playgroud)

第一:引用变量typ的类型是Type,不是吗?!

那么,为了方法覆盖,打包有静态类型对象和动态类型类型的原因是什么?

第二:编译器是否有足够的信息来调用正确的equals()?

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

在这种情况下类类具有,并且编译器知道它.

为什么这不能像重载一样早期绑定?为什么要把它留给JVM?

Gho*_*ica 5

这是一个重要的面向对象编程的基石.

它归结为多态性.请参阅此处以进一步阅读

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

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