具有超类和子类签名的Java 2函数-选择超类,尽管子类';s类型是子类

具有超类和子类签名的Java 2函数-选择超类,尽管子类';s类型是子类,java,inheritance,overloading,dynamic-dispatch,method-dispatch,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){

我有以下代码:

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
的方法,由于
b1
Main
的一个实例,因此我们将进入
Main
equals
实现,而不是
Object

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

我看了那两篇文章:
-没有解释我的情况,但是在这种情况下,
s
的类型应该是Object

-这个答案,如果是真的,据我所知,支持我的理论


非常乐意解释。

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

将此代码添加到
equals(Object other)
方法的开头

if(other instanceof String)
return equals((String)other);
除此之外,我不确定equals方法如何有用,因为您正在执行此操作
returnother==newobject()。你可能应该做的是更接近这个.equals(其他)