以下のスニペットを考慮してください。 A
とB
がBreakOOP
クラス内にカプセル化されている場合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の基本的な概念の一部に反しているようです。誰かがなぜこのコンパイルを説明することができますか?その背後にある理由は何ですか?
これはコンパイルされます。これは、仕様には、プライベートメンバーがトップレベルクラスのスコープの内側、つまりあなたのカスの「BreakOOP」内に表示されているということが記載されているためですe(JLSの関連セクションを参照する必要があります)。 – Thomas
内部クラスは、その親クラスから可視性ルールを取得します。これはなぜですか? - 議論するまでは、これはJavaでのやり方です。したがって、Bからsuper.aにアクセスすることは、BreakOOPクラスの2つのプライベート変数と似ています。より広範な保護が必要な場合は、別のコンパイル単位に移動する必要があります。 – mtj
[サブクラスのスーパーキーワードを使用してスーパークラスのプライベートフィールドにアクセスする]の可能な複製(http://stackoverflow.com/questions/31478718/access-to-superclass-private-fields-using-the-super-keyword-in -a-subclass) –