具有父类(super class)和子类签名的 Java 2 函数 - 尽 pipe 类的类型是子类,但仍选择父类(super class)

标签 java inheritance overloading dynamic-dispatch method-dispatch

我有以下代码:

public class Main {

    public boolean equals(String other){
        return other == new Object();
    }

    public boolean equals(Object other){
        return other == new Object();
    }

    public static void main(String[] args){
        String s = "";
        Object b1 = new Main();
        System.out.println(b1.equals(s));

    }

}

据我所知,equals方法选择应该这样进行: 在编译时,将选择签名,并且从s开始是编译时类型(例如 type ),参数为 String 的方法应该选择,并且因为 b1Main 的一个实例然后我们将输入我们的Main实现equals而不是Object的。

但是,在调试时我看到我输入了 Main使用 Object 类型的参数实现.

我看过那两篇文章:
Overloaded method selection based on the parameter's real type - 没有解释我的情况,而是解释 s 类型的情况本来就是对象。

https://stackoverflow.com/a/8356435/4345843 - 据我所知,这个答案如果属实,则支持我的理论。

很乐意提供解释。

最佳答案

这是因为您将 Main 实例分配给 Object 变量。 Object 不包含 equals(String) 方法,因此选择唯一适合的方法 - equals(Object)

关于具有父类(super class)和子类签名的 Java 2 函数 - 尽 pipe 类的类型是子类,但仍选择父类(super class),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38410226/

相关文章:

c++ - 基于值与常量引用的函数重载

java - JSON 对象数组到 Java POJO

c# - 在 C# 中继承事件处理程序

Java 不断跳过我的扫描仪对象

C#继承和对象引用

c++ - 引用基类时是否需要命名空间

python - 为什么 Python 属性需要同名的辅助函数?

c++ - 使用 CRTP 继承

java - HTML文档 : does Swing "optimize out" span elements?

java - Java EE 7 和 Java EE 6 之间的区别