java—将子类引用视为对象

x4shl7ld  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(320)

这是学习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)
        }
    }
}
gajydyqb

gajydyqb1#

第一:当你把一个引用赋给一个更宽的类型时——例如,当你写的时候 AA aa = new BB(); ,您是在告诉编译器忘记这一点 aa 是一个 BB() . 这只是一个例子 AA 现在,就编译器而言,因为您告诉编译器将其视为 AA .
下一步: AA 只有一个 equals 方法,继承自 Object : equals(Object) .
下一步: BB 将该方法重写为 equals(Object) ,以便调用实现。
(这是许多原因中的一个,定义任何 equals 方法而不是 equals(Object) .)

相关问题