Хотя в XProcedure есть два метода с одинаковым именем - doX, эти две сигнатуры различны. Первый метод получает экземпляр класса A в качестве параметра, а второй - экземпляр класса B.
Когда вы вызываете XProcedure.doX(this)
, вызывается правильный метод в соответствии с классом передаваемого параметра.
"АААА!" печатается из-за вызова super.doY()
.
"BBBB!" печатается из-за вызова XProcedure.doX(this);
.
this
отличается в конструкторе A от this
в конструкторе B по причинам, указанным в ответе Че. Хотя конструктор A вызывается из конструктора B, в области видимости A экземпляр имеет класс A.