Thilo hat eine gute Antwort auf Ihre erste Frage "Wie ist das möglich?" Hinzugefügt . Ich möchte auf die zweite gestellte Frage etwas näher eingehen: Warum ist dieses Verhalten zulässig?
Lassen Sie uns zunächst klarstellen, dass dieses Verhalten nicht auf innere Klassen beschränkt ist, die per Definition nicht statische verschachtelte Typen sind. Dieses Verhalten ist für alle verschachtelten Typen zulässig, einschließlich verschachtelter Aufzählungen und Schnittstellen, die statisch sein müssen und keine umschließende Instanz haben dürfen. Grundsätzlich ist das Modell eine Vereinfachung bis auf die folgende Aussage: Verschachtelter Code hat vollen Zugriff auf umschließenden Code - und umgekehrt.
Warum also? Ich denke, ein Beispiel veranschaulicht den Punkt besser.
Denken Sie an Ihren Körper und Ihr Gehirn. Wenn Sie Heroin in Ihren Arm injizieren, wird Ihr Gehirn hoch. Wenn die Amygdala-Region Ihres Gehirns erkennt, was seiner Meinung nach eine Bedrohung für Ihre persönliche Sicherheit darstellt, beispielsweise eine Wespe, wird er Ihren Körper dazu bringen, sich umzudrehen und auf die Hügel zu rennen, ohne dass Sie zweimal darüber nachdenken.
Das Gehirn ist also ein wesentlicher Bestandteil des Körpers - und seltsamerweise auch umgekehrt. Durch die Verwendung der Zugriffskontrolle zwischen solchen eng verbundenen Unternehmen verfällt ihr Anspruch auf Beziehung. Wenn Sie eine Zugriffskontrolle benötigen, müssen Sie die Klassen stärker in wirklich unterschiedliche Einheiten unterteilen. Bis dahin sind sie die gleiche Einheit. Ein treibendes Beispiel für weitere Studien wäre, zu untersuchen, wie ein Java Iterator
normalerweise implementiert wird.
Der uneingeschränkte Zugriff von eingeschlossenem Code auf verschachtelten Code macht es größtenteils ziemlich nutzlos, Zugriffsmodifikatoren zu Feldern und Methoden eines verschachtelten Typs hinzuzufügen. Dies führt zu Unordnung und kann für Neueinsteiger der Java-Programmiersprache ein falsches Sicherheitsgefühl darstellen.