12

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

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

4

3 に答える 3

15
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 で定義されたいくつかの新しいフィールドが常に含まれる可能性があります。

于 2013-03-21T14:14:30.563 に答える
15

これは、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);

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

于 2013-03-21T14:13:12.680 に答える
6

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

public アクセサー メソッドを提供することは、カプセル化が機能する方法です。アクセスを制御できるように、データを非公開にし、その値を取得または設定するメソッドを提供します。

于 2013-03-21T14:09:15.383 に答える