这是学习java过程中提出的与多态性相关的问题。
示例有两个类: AA
作为父母 BB
作为一个孩子。我们创建两个对子对象的引用—一个在父类变量中,另一个在子类变量中:
AA aa = new BB();
BB bb = new BB();
如果我们通过父引用调用子方法并传递子类型变量,它将被视为 Object
.
aa.equals(bb); //call BB.equals (Object ob)
为什么?为什么调用方法的变量类型会影响参数类型识别?
以下是完整代码:
public class AA
{
}
public class BB extends AA
{
public boolean equals (Object ob){
.............
}
public boolean equals (AA ob){
.............
}
public boolean equals (BB ob){
.............
}
}
public class Main
{
public static void main(String[] params) {
{
AA aa = new BB();
BB bb = new BB();
System.out.println(aa.equals(bb)); //call BB.equals (Object ob) Why?
System.out.println(bb.equals(bb)); //call BB.equals (BB ob)
}
}
}
1条答案
按热度按时间gajydyqb1#
第一:当你把一个引用赋给一个更宽的类型时——例如,当你写的时候
AA aa = new BB();
,您是在告诉编译器忘记这一点aa
是一个BB()
. 这只是一个例子AA
现在,就编译器而言,因为您告诉编译器将其视为AA
.下一步:
AA
只有一个equals
方法,继承自Object
:equals(Object)
.下一步:
BB
将该方法重写为equals(Object)
,以便调用实现。(这是许多原因中的一个,定义任何
equals
方法而不是equals(Object)
.)