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