我有一个关于这个程序如何选择方法的问题。
代码(除了构造函数):
class Father {
int x;
..
public int m(Father f) {
return (f.x - this.x);
}
}
class Son extends Father {
int y;
...
public int m(Father f) {
return 100;
}
public int m(Son s) {
return super.m(s) + (s.y - this.y);
}
}
主要的:
Father f1, f2;
Son s1;
f1 = new Father(3);
f2 = new Son(3,10);
s1 = new Son(4,21);
System.out.println(f1.m(s1) + f2.m(s1));
我不明白为什么要f2.m(s1)
打印 100。就我个人而言,我理解如果有 2 个方法同名,如果有重载,则选择使用静态类型,如果覆盖则使用动态类型;
f1.m(s1)
动态搜索Father.m(Son)
方法,但它不存在,而是Father.m(Father)
被选择
f2.m(s1)
动态搜索一个Son.m(Son)
存在并且是重载的方法,所以我认为它现在应该优先考虑静态类型并搜索一个Father.m(Son)
不存在但最接近的方法是Father.m(Father)
. 取而代之的Son.m(Father)
是选择方法:是被 Son.m(Son) 方法重载的方法,可以,但不是从静态搜索中出来的,那为什么选择它呢?