使用多个选项选择重写方法java
为了澄清-据我所知,以下方法都是覆盖使用多个选项选择重写方法java,java,overriding,Java,Overriding,为了澄清-据我所知,以下方法都是覆盖对象的。它们是否超载,而我没有正确理解 我正在运行以下代码: public class AA { private int _val=0; public AA() { _val=5; } } public class BB extends AA { public BB() { .... } public boolean equals(BB ob)
对象的。它们是否超载,而我没有正确理解
我正在运行以下代码:
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
方法,我假设
编译时编译器希望从对象运行等于
班级
- 在运行时,编译器发现a2实际上是一个BB对象
因此具有
等于方法,这些方法重写了
对象
但是,我不清楚的是,如果发送的对象已定义且实际上是BB对象,为什么选择第二种方法(对象ob)
,而不是第一种方法(BB ob)
非常感谢您的反馈 重载不是在运行时选择的,而是在编译时选择的,此时编译器只知道对象是
AA
。根据对象的实际运行时类型,仅在运行时选择覆盖,但仍使用在编译时选择的重载。当调用a.equals(b)
时,编译器会查看AA中的equals
方法。如果它在那里找到合适的,它就会使用它。在这种情况下,AA没有称为“equals”的方法。因此,它将沿着继承链前进,并再次查看。这一次,它正在查看对象,并找到Object.equals(Object)
。在运行时,它会找到最重写的版本并调用它
因此,如果它仍在寻找一个名为“equals”的方法,为什么它在运行时找不到更具体的版本equals(BB)
BB.equals(BB)
不被视为对Object.equals(Object)
的重写。它有一个更具体的参数,不能处理普通对象。假设类型是名称的一部分:
- 等于对象
- 等于BB
编译器选择了
equals_Object
方法,因此在运行时JVM将找不到equals_BB
方法,因为它没有寻找它。如果您能向我们展示classAA
,这将非常有帮助。目前我们能看到的唯一覆盖是equals(Object)
。其余的都超载了。我们不知道重载AA
还提供了什么。还要注意,“在运行时编译器发现…”假设编译器正在运行时执行。事实并非如此。是虚拟机在运行时做事情。@ctst:No,a2
的编译时类型是AA
,而不是BB
。编译器只关心这些。AA没有一个equals方法,编辑它是为了澄清。@Rony:与其说明AA
没有什么,为什么不给我们提供一个完整的例子?@ctst:是的,它覆盖了equals
。。。但重载是在编译时根据编译时类型执行的。如果AA
没有提供任何额外的equals
方法,那么对a2.equals(…)
的任何调用都将调用equals(Object)
重载。