Код, который вы написали в методе execute_work () в классе C, по сути эквивалентен следующему:
public void perform_work() {
A someA = this;
someA.perform_work();
}
, который, как вы, вероятно, знаете, не меняет тип объекта, на который ссылается переменная someA. Это все еще объект типа C, и вызов метода execute_work () для ссылки на него вызовет реализацию из класса C.
Представьте себе следующий сценарий:
public static void perform_more_work(A someA) {
someA.perform_work();
}
public void perform_work() {
perform_more_work(this);
}
Должно быть очевидно, какой метод будет вызываться приведенным выше кодом.