在以下情况下覆盖具有不同参数的方法时,将调用哪种方法?

时间:2012-12-15 15:05:26

标签: java object equals

假设我要覆盖Object的方法equals():

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

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

SomeClass显然也是一个Object,如果我使用带有SomeClass实例的equals作为参数,那么将调用哪个方法?

3 个答案:

答案 0 :(得分:6)

这不是压倒性的,它正在超载。如果你这样做,你最终将得到两个equals方法:一个将被调用({1}}个实例的子类化合物,另一个用于任何其他对象。

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

equals(SomeClass)

答案 1 :(得分:1)

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

但是,如果将对象实例化为父类,则行为会有所不同。这与动态绑定有关,这在这里有很好的解释:Question about Java overloading & dynamic binding

请注意,如果您希望在Object为SomeClass类型时执行其他操作,则还可以在标准equals函数中使用instanceof SomeClass。 (不是试图开始讨论,但这是一个选择)

答案 2 :(得分:1)

使用参数public boolean equals(SomeClass s)或子类SomeClass调用SomeClass时,系统会调用public boolean equals(Object o)

对于任何其他对象,它将被调用public boolean equals(Object o)

但是当你在其他API中调用equals方法时,他们会调用{{1}}。这将导致错误的行为。 Java Collection API就是一个例子。

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