2016-09-27 8 views
3

以下のスニペットを考慮してください。 ABBreakOOPクラス内にカプセル化されている場合Javaでのカプセル化と情報隠蔽の破棄

package breakoop; 

public class BreakOOP { 

    public static class A{ 
     private int a; 
    } 

    public static class B extends A{ 
     public int f(){ 
      return super.a; 
     } 
    } 

    public static void main(String[] args) { 
     B b = new B(); 
     System.out.println(b.f()); 
    } 
} 

例のみコンパイル。

これは、OOPの基本的な概念の一部に反しているようです。誰かがなぜこのコンパイルを説明することができますか?その背後にある理由は何ですか?

+1

これはコンパイルされます。これは、仕様には、プライベートメンバーがトップレベルクラスのスコープの内側、つまりあなたのカスの「BreakOOP」内に表示されているということが記載されているためですe(JLSの関連セクションを参照する必要があります)。 – Thomas

+0

内部クラスは、その親クラスから可視性ルールを取得します。これはなぜですか? - 議論するまでは、これはJavaでのやり方です。したがって、Bからsuper.aにアクセスすることは、BreakOOPクラスの2つのプライベート変数と似ています。より広範な保護が必要な場合は、別のコンパイル単位に移動する必要があります。 – mtj

+0

[サブクラスのスーパーキーワードを使用してスーパークラスのプライベートフィールドにアクセスする]の可能な複製(http://stackoverflow.com/questions/31478718/access-to-superclass-private-fields-using-the-super-keyword-in -a-subclass) –

答えて

3

これを確認してください:https://docs.oracle.com/javase/tutorial/java/javaOO/nested.htmlstaticクラスがトップレベルクラスのプライベートメンバーにアクセスできるようにすることでカプセル化を強化していると言います(それを行う必要があることもあります)。そしてaは、順番にクラスB内部にはアクセスできるようになりBreakOOPの範囲にあるクラスAのプライベートメンバー、です。

1

Java Language Specification状態:

プライベートクラスのメンバ又はコンストラクタは、唯一のメンバーまたはコンストラクタの宣言を囲むトップレベルクラス(7.6)の本体内にアクセス可能です。クラスAB以来

は、ルールが適用され、BAのプライベートメンバーを見ることができますBreakOOPの本体内に定義されています。 OOPの概念については

ABは、静的な内部クラスであるため、彼らは真の内部クラスを持っていること(つまり、あなたが作成するBreakOOPのインスタンスを必要としないBreakOOPとの特別なライフサイクルの関係を持っていませんAまたはBの新しいインスタンスですが、まだプライベートメンバーにアクセスできるという点では多少の特別な関係がありますが、そのような関係がなければ内部クラスではなく、真のトップレベルクラスになるはずです

関連する問題