假设我要覆盖Object的方法equals():
public boolean equals(Object o){
//something
}
public boolean equals(SomeClass s){
//something else
}
SomeClass显然也是一个Object,如果我使用带有SomeClass实例的equals作为参数,那么将调用哪个方法?
答案 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方法。