Как Java выбирает какую перегруженную функцию вызывать?

Это чисто теоретический вопрос.

Дано три простых класса:

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 просто просматривает все различные версии функции и выбирает ту, которая требует наименьшего обхода стека наследования? Это стандартизировано? Это записано в какой-либо документации?

Ответы на вопрос(1)

Ваш ответ на вопрос