选择具有多个选项的覆盖方法java

澄清 – 据我所知,下面的方法都是Object.equals 覆盖 。 他们是否超载而我没有正确理解这一点?

我正在运行此代码:

 public class AA { private int _val=0; public AA() { _val=5; } } public class BB extends AA { public BB() { .... } public boolean equals(BB ob) { return false; } public boolean equals(Object ob) { return true; } public boolean equals(AA ob) { return true; } public static void main(String args[]) { AA a2=new BB(); BB b1=new BB(); if((a2.equals(b1))) System.out.println("hi"); } } 

AA类没有equals方法

我试图找出第二种方法是触发而不是第一种方法。 我的理解是:

  • 由于类AA没有equals方法,我想在编译时编译器想要从Object类运行equals
  • 在运行时,编译器发现a2实际上是一个BB对象,因此具有equalsObject重写方法的方法。

但是,我不清楚的是,如果发送的对象被定义并且实际上是BB对象,则选择第二种方法(Object ob)而不是第一种方法(BB ob)

非常感谢您的反馈!

当你调用a.equals(b) ,编译器会查看AA中的equals方法。 如果它在那里找到合适的,它会使用它。 在这种情况下,AA没有称为’等于’的方法。 所以它加强了inheritance链,并再次看起来。 这一次,它正在查看Object,它找到了Object.equals(Object) 。 在运行时,它会找到覆盖最多的版本并调用它。

因此,如果它仍然只是寻找一个名为’equals’的方法,为什么它不能在运行时找到更具体的版本equals(BB)

BB.equals(BB) 被视为Object.equals(Object)的重写。 它有一个更具体的参数,并且不能处理普通的Object。 想象一下这些类型是名称的一部分:

  • equals_Object
  • equals_BB

编译器选择了equals_Object方法,因此在运行时JVM将找不到equals_BB方法,因为它没有查找它。

在运行时选择重载,它们是在编译时选择的,当编译器只知道对象是AA 。 根据对象的实际运行时类型,仅在运行时选择覆盖 ,但仍会使用在编译时选择的重载。