Начнём с Java Core: модификаторы доступа
Модификаторы доступа выглядят простыми, но под капотом у них есть куча тонкостей:
1. У класса фактически только два модификатора: public и default. 2. Самая распространённая ошибка: считать, что protected даёт доступ везде, где есть наследник. Protected работает только в текущем пакете или в наследнике, но только через экземпляр наследника, а не родителя. 3. Default - модификатор, который почти никто не использует. Но его суперсила в том, что он удерживает архитектуру от разрастания публичного API.
4. Private не гарантирует приватность полностью. Есть три лазейки: рефлексия, сериализация, Unsafe / VarHandle. 5. Вложенные классы могут иметь private и быть полностью закрытыми от внешнего мира.
6. Изменять модификатор при наследовании можно только в сторону большей доступности 7. Модификатор влияет на то, как JVM строит таблицы методов. Private методы - не виртуальные; default/protected/public - попадают в виртуальную таблицу. Это влияет на производительность вызовов, механизм override, структуру байткода.