java - 为什么代码执行超类'方法而不是子类'?
问题描述
我在练习多态性和继承时偶然发现了一个我无法理解的解决方案
有以下简单的代码:
public class A{
protected int _i;
public A(int i){
_i = i;
}
public boolean equals (A other){
System.out.print("A ");
return ((other!=null) && (_i==other._i));
}
}
public class B extends A{
public B(int i){
super(i+1);
}
public boolean equals (B other){
System.out.print("B ");
return ((other!=null) && (_i==other._i));
}
}
public class C extends B{
public C(int i){
super(i);
}
public boolean equals (Object other){
System.out.print("C ");
return ((other!=null) && (other instanceof C) && (_i==((C) other)._i));
}
}
//main:
public class DriverABCD{
public static void main(String[] args){
A a = new A(1);
B b = new B(1);
C c = new C(1);
a=c;
System.out.println (b.equals(a));
}
}
输出是 A 'A true'。问题是我不明白为什么。
据我了解a=c
,使“a”成为对象 C 的引用(垃圾收集器删除对象 A)。
所以(b.equals(a))
转到 B 类并执行 equals(B other),因为 C 扩展了 B。
我哪里错了?
解决方案
忽略 的值,并考虑如果您只知道所涉及的类型a
,您会调用什么方法。b
c
a
是一个A
并且b
是一个B
。你调用一个名为 a 的方法equals
并B
传入一个A
. 与该调用最匹配的方法是public boolean equals (A other)
in A
。
推荐阅读
- function - Powershell - 创建指定大小限制的新 zip 文件夹并将 jpg 图像从一个文件夹移动到新的 zip 文件夹
- javascript - 在 React-Slick 上修改 CSS
- android - 输入'未来
' 不是 'Widget' 类型的子类型(在构建 Builder(dirty) 时引发了以下 _TypeError: - python - 无法使用 Python 库添加 ADZO 变量组
- postgresql - psql 将值的常量列表用作表
- python - 如何使用numpy(首选)或python 3将数组作为单独的列添加到CSV文件而不覆盖CSV文件或数据?
- javascript - How to split a html string with start and end character
- javascript - Center Custom Cursor
- reactjs - Do I have to use the
when I want to use in ReactJs? - amazon-dynamodb - Create rule in AWS IoT core to insert data into an existing row in DynamoDB