У меня есть вопрос о том, как эта программа выбирает метод.
Код (без конструкторов):
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);
}
}
Main:
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), но он не выходит из статического поиска, так почему он выбран?