Тіло додав гарну відповідь на ваше перше запитання "Як це можливо?". Я хотів би трохи детальніше зупинитися на другому заданому питанні: Чому така поведінка дозволена?
Для початку давайте просто зрозуміти, що така поведінка не обмежується внутрішніми класами, які за визначенням є нестатичними вкладеними типами. Така поведінка дозволена для всіх вкладених типів, включаючи вкладені перерахунки та інтерфейси, які повинні бути статичними і не можуть мати примірник, що вкладається. В основному модель є спрощенням до наступного твердження: Вкладений код має повний доступ до коду, що додається - і навпаки.
Отже, чому тоді? Я думаю, що приклад ілюструє кращу точку.
Подумайте про своє тіло та свій мозок. Якщо ви вводите героїн в руку, ваш мозок стає високим. Якщо в районі міндалі вашого мозку побачите, що він вважає, це загроза вашій особистої безпеки, скажіть, наприклад, оса, він змусить ваше тіло повернутись навпаки і бігти за пагорби, не ви «думати» про це двічі.
Отже, мозок - це невід'ємна частина тіла - і, як не дивно, навпаки. Використання контролю доступу між такими тісно пов’язаними суб’єктами втрачає їх вимогу про відносини. Якщо вам потрібен контроль доступу, то вам потрібно більше розділити класи на справді окремі одиниці. До цього часу вони є одним і тим же підрозділом. Рушійним прикладом для подальших досліджень буде подивитися, як Iterator
зазвичай реалізується Java .
Необмежений доступ від вкладеного коду до вкладеного коду робить його здебільшого досить марним додавати модифікатори доступу до полів та методів вкладеного типу. Це додає безладу і може забезпечити помилкове відчуття безпеки для нових бажаючих мови програмування Java.