web-dev-qa-db-ja.com

継承されたクラスでプライベート変数を使用する-Java

プライベート変数と継承についてもっと理解する必要があります。以前の私の理解では、クラスにフィールドがあり、クラスを継承している場合、アクセスによって制限されていないフィールド(プライベート変数)は継承されたクラスにあります。しかし、パブリックg/setterメソッドがあれば、基本クラスでプライベート変数を使用できます。

基本クラスのプライベート変数をどのように想像できますか?

8
class A {
  private int a;
  public A(int a) { this.a = a; }
  public int getA() {return a;}
}

class B extends A {
  public B(int b) { super(b); }
  public int getB() {return getA();}
}

int result = new B(10).getA();

結果は10になります。クラスAのプライベートフィールドaはBに継承されていますが、Bは直接アクセスできません。クラスAで定義されたpublic/default/protectedアクセサーメソッドを使用する場合のみ。BはAであるため、常にAと同じフィールドがあり、クラスBで定義された新しいフィールドがいくつかある可能性があります。

11
oikku

これはJavaチュートリアル http://docs.Oracle.com/javase/tutorial/Java/IandI/subclasses.html の内容です:

サブクラスは、その親クラスのプライベートメンバーを継承しません。ただし、スーパークラスにプライベートフィールドにアクセスするためのパブリックメソッドまたは保護メソッドがある場合、これらはサブクラスでも使用できます。

それにもかかわらず、これを参照してください

class A {
   private int i;
}

class B extends A {
}

B b = new B();
Field f = A.class.getDeclaredField("i");
f.setAccessible(true);
int i = (int)f.get(b);

正常に動作し、Bインスタンスからフィールドiの値を返します。つまり、Bにはiがあります。

10

プライベート変数/メンバーは継承されません。それが唯一の答えです。

パブリックアクセサメソッドを提供することは、カプセル化が機能する方法です。データをプライベートにし、値を取得または設定するメソッドを提供して、アクセスを制御できるようにします。

1