1) Они должны быть static
, чтобы не быть переопределенными в каком-либо подклассе.Надеюсь, вы понимаете.
<Addendum>
Шрини, из вашего комментария кажется, что есть необходимость объяснить вещи, чтобы избежать некоторых заблуждений.Прежде всего, знайте, что static
методы не могут быть переопределены.Переопределение является исключительным в объектах, и оно облегчает полиморфизм.Тогда как статические методы принадлежат классу.Нашел пару хороших ресурсов для поддержки моего аргумента и для вас, чтобы понять, что статические методы не могут быть переопределены.
Теперь для вашей второй реплики вы правы, говоря, что они имеют доступ на уровне пакета и не могут быть переопределены в подклассах за пределамипосылка.Но я не знаю, почему вы пренебрегаете случаем, когда подклассы существуют в одном пакете.Это действительный случай, ИМО.На самом деле было бы абсурдно называть метод, подобный access$000()
, или что-то подобное, в реальной работе.Но не стоит недооценивать вероятность случайного переопределения.Может быть случай, когда подкласс Outer
, скажем SubOuter
, тоже имеет внутренний класс.Я не пытался javap
в этом случае сам, просто догадывался.
</Addendum>
2) Даже если вы думаете, что это не будет изменено, техническикак уже указывалось выше, существует возможность, что использование final
может обеспечить легкую оптимизацию компилятором.