Существуют некоторые неинтуитивные правила, регулирующие переопределяемость закрытых для пакета членов. По сути, вы можете переопределить закрытый для пакета метод, если переопределяющий класс находится в том же пакете. Если это не так, он не может видеть см. Объявление AbstractInner
о run()
и поэтому не может переопределить его. Вместо этого вы объявляете новый метод с той же подписью.
Если вы сделаете run()
защищенным (или общедоступным) в AbstractInner
(и, следовательно, также в Inner
) вместо использования видимости по умолчанию, оно будет работать как задумано.
Напомним, что только в интерфейсах методы объявляются неявно public
. В абстрактных классах они неявно закрыты для пакета.