Метод f()
в A1
помечен private
.Это означает, что оно не унаследовано A2
или A3
.Это означает, что полиморфизм не найдет переопределяющие методы f()
в A2
или A3
.Однако, поскольку A1
является вложенным классом, включающий класс Main
все еще имеет к нему доступ, поэтому он компилируется.В результате A1
печатается 3 раза.
Вы можете увидеть ошибку, если попытаетесь разместить аннотацию @Override
в f()
в A2
.Если вы измените f()
на public
, protected
или не будете использовать модификатор доступа («пакетный доступ») в A1
, тогда f()
будет наследоваться, как вы ожидаете, так что вывод будет таким, как вы ожидаетес выводом A1
, A2
и A3
.