Это чисто теоретический вопрос.
Дано три простых класса:
class Base {
}
class Sub extends Base {
}
class SubSub extends Sub {
}
И функция, предназначенная для работы с этими классами:
public static void doSomething(Base b) {
System.out.println("BASE CALLED");
}
public static void doSomething(Sub b) {
System.out.println("SUB CALLED");
}
Кажется, что следующий код:
SubSub ss = new SubSub();
doSomething(ss);
может законно привести к печати BASE CALLED или SUB CALLED, поскольку SubSub может быть приведен к обоим из них. Фактически, удаление Sub-версии функции приводит к печати BASE CALLED. На самом деле происходит то, что «SUB CALLED» печатается. Похоже, это означает, что то, какая функция вызывается, не зависит от порядка, в котором определены функции, так как базовая версия была вызвана первой.
Java просто просматривает все различные версии функции и выбирает ту, которая требует наименьшего обхода стека наследования? Это стандартизировано? Это записано в какой-либо документации?