2013-08-07 31 views
5

Iちょうど内部クラスは次のように別の内部クラスのプライベートメンバにアクセスできることを発見した:TestInner2のなぜ内部クラスは別の内部クラスのプライベートメンバーにアクセスできますか?

public class TestOutter { 
    class TestInner1 { 
     private int mInt = 1; 
    } 
    class TestInner2 { 
     public int foo(TestInner1 value) { 
      return value.mInt; 
     } 
    } 
} 

メソッドfooがTestInner1のプライベートメンバミントにアクセスすることができます。

しかし、私はこれまでにこのケースを見たことがありません。私はTestInner2のコードにTestInner1のプライベートメンバーにアクセスできるという意味を知らない。

Googleの内部クラスについて検索しましたが、検索結果の中に内部クラスにこの機能がないことがわかりました。また、The Java Language Specificationも参照していますが、それについては言及していません。

+0

"外側"のクラス定義内のすべてがプライベートメンバーにアクセスできます。 – jtahlborn

+1

あなたはこの質問を参照することができますhttp://stackoverflow.com/questions/1801718/why-can-outer-java-classes-access-inner-class-private-members?lq=1 – san

+0

なぜこの論理はあなたに悪いですか? 'TestInner2'は' TestOutter'の不可欠な部分であり、 'TestOutter'は' TestInner1'へのアクセス権を持っているので 'TestInner2'もそうです。それは私にとってはうまくいくようです。 –

答えて

4

"それ以外の場合、メンバーまたはコンストラクタがprivate宣言されている場合、アクセスはメンバーまたはコンストラクタの宣言を囲む最上位クラス(§7.6)の本体内で発生する場合にのみ許可されます。 JLS 6.6.1この場合、TestOutterが最上位クラスであるため、すべてのprivateフィールドが表示されます。

基本的には、メンバーprivateを宣言する目的は、他のクラス(サブクラスなど)を干渉させないようにすることで、正確性を保証することです。最上位クラスはJavaコンパイル単位であるため、この仕様では、同じファイル内のアクセスが適切に管理されていることを前提としています。

+0

ありがとう!あなたの答えはこの質問についてかなり明確です! – user1260771

2

これは、外部クラスのメンバーである内部クラスが、その外部クラスのすべてのプライベート変数にアクセスできるためです。また、他の内部クラスも外部クラスのメンバであるため、すべてのプライベート変数もアクセス可能です。

編集:家(外側のクラス)に2つのソファクッションの砦(内側のクラス)があり、もう一方の兄弟はあなたの兄弟であるように考えてください。あなたの砦は両方とも家にあり、家の中のすべてのものにアクセスできます。そして、お母さん(Java)は完全に不自由で、あなたの兄弟と分かち合う必要があると言っています。自分の砦が欲しいのなら、あなたは自分のお金でそれを買わなければなりません。 )。

関連する問題