Когда переопределенный метод вызывается через ссылку на суперкласс, Java определяет, какую версию этого метода выполнить, основываясь на типе объекта, на который ссылается во время вызова. Таким образом, это определение выполняется во время выполнения.
Это тип объекта, на который ссылаются (а не тип ссылочной переменной), который определяет, какая версия переопределенного метода будет выполняться.
A variable = new B();
variable.doSomething();
// Output: classB