Java 在以下情况下,使用不同参数重写方法时将调用哪个方法?

Java 在以下情况下,使用不同参数重写方法时将调用哪个方法?,java,object,equals,Java,Object,Equals,假设我要重写Object的方法equals(): public boolean equals(Object o){ //something } public boolean equals(SomeClass s){ //something else } SomeClass显然也是一个对象,所以如果我使用equals和SomeClass的实例作为参数,将调用哪个方法?这不是重写,而是重载。如果您这样做,您将得到两个equals方法:一个将

假设我要重写Object的方法equals():

    public boolean equals(Object o){
      //something
    }

    public boolean equals(SomeClass s){
      //something else
    }

SomeClass显然也是一个对象,所以如果我使用equals和SomeClass的实例作为参数,将调用哪个方法?

这不是重写,而是重载。如果您这样做,您将得到两个
equals
方法:一个将为(subsectof)
SomeClass
实例调用,另一个将为任何其他对象调用

需要注意的一点是,方法绑定将是静态的:编译器将根据所声明的引用类型决定调用哪个方法。因此,下面将调用
equals(Object)
,而不是
equals(SomeClass)


如果像示例中那样重载函数,并正常实例化对象,那么如果为equals函数提供SomeClass,则将调用带有SomeClass作为参数的equals函数。对于任何其他类,将调用带有对象作为参数的equals函数

但是,如果将对象实例化为父类,则行为会有所不同。这与动态绑定有关,这里对此进行了很好的解释:


请注意,如果您希望在对象为SomeClass类型的情况下执行其他操作,您还可以在标准的equals函数中使用SomeClass的
instanceof
。(不尝试开始讨论,但这是一个选项)

当您使用参数
SomeClass
SomeClass
的子类调用它时,将调用
公共布尔等于(SomeClass s)

对于任何其他对象,调用的将是
公共布尔等于(对象o)

但当在其他API中调用equals方法时,它们将调用
公共布尔equals(objecto)
。这将导致错误的行为。Java集合API就是一个例子


所以不要像这样重载equals方法。

这是重载,调用重载方法的决定发生在编译时,所以调用具有参数SomeClass的方法,将调用哪个方法?为什么不写一个测试用例呢,这是一个20-30行java代码的问题。@AmitD他在一个实例中说。我们不知道引用SomeClass对象的变量的类型。这是不正确的。请参阅Costi的答案。@user802421这是编译时的决定,因此,如果您使用Object调用对象方法,请执行此操作。谢谢您的回答。有什么方法可以避免你文章第二段中描述的行为吗?没有,唯一的方法是坚持重写
equals(Object)
方法,并在内部执行一些
测试实例。
equals(SomeClass s)
也将使用
SomeClass
的子类型参数调用
Object o = new SomeClass();
o.equals(o);  // invokes SomeClass.equals(Object)