ティロはあなたの最初の質問「これはどうして可能ですか?」に良い答えを追加しました。2番目の質問について少し詳しく説明したいと思います。なぜこの動作が許可されるのですか?
手始めに、この動作は内部クラスに限定されないことを完全に明確にしましょう。これは、定義上、静的でないネストされた型です。この動作は、静的である必要があり、囲んでいるインスタンスを持つことができない、ネストされた列挙型とインターフェースを含む、すべてのネストされた型に対して許可されます。基本的に、モデルは次のステートメントまで簡略化されています。ネストされたコードは、囲んでいるコードへの完全なアクセス権を持ち、その逆も同様です。
では、なぜでしょうか。私は例がその点をよりよく示していると思います。
あなたの体とあなたの脳を考えてください。ヘロインを腕に注入すると、脳が高くなります。あなたの脳の扁桃体領域が、あなたの個人的な安全に対する脅威であると彼が信じているもの、たとえばスズメバチを見つけた場合、彼はあなたの体を反対方向に向けさせ、あなたがそれについて2度「考える」ことなく丘に向かって走ります。
ですから、脳は体の本質的な部分です-そして奇妙なことに、逆もまた同様です。このような密接に関連するエンティティ間のアクセス制御を使用すると、関係の主張が失われます。アクセス制御が必要な場合は、クラスをさらに明確なユニットにさらに分離する必要があります。それまでは同じユニットです。さらなる研究の原動力となる例は、JavaがIterator
通常どのように実装されているかを見ることです。
囲んでいるコードからネストされたコードへの無制限のアクセスは、ほとんどの場合、ネストされた型のフィールドおよびメソッドにアクセス修飾子を追加するのにかなり役に立たないものにします。そうすることで混乱が増し、Javaプログラミング言語の新参者に誤った安心感を与える可能性があります。