2012-03-10 8 views
0

を使用する方法を継承だから私はここで、親クラスを持っているB.getA()が呼び出されたとき、それは返し、しかしA.Javaは間違ったクラスに

public class A 
{ 
    private int a = 1; 
    public int getA() 
    { 
    return a; 
    } 
} 

public class B extends A 
{ 
    private int a = 2; 
} 

を拡張A、クラスBとして参照さクラスBの2の代わりにクラスAの1を使用しました。私は数ヶ月前に同様の問題を抱えていたので、それは奇妙なことに驚いていました。唯一の違いは、メソッドがArrayListにオブジェクトを追加することです。

ありがとうございました。

答えて

6

プライベート変数は、サブクラスに対してもプライベート変数です。 A.aとB.aは全く異なる2つの分野です。サブクラス内のデータを変更する場合は、保護されたフィールドにするか、オプションで抽象的なゲッターを親クラスに追加して、サブクラスでオーバーライドします。

+0

したがって、継承されたメソッドはAa?だからB.aを呼び出すために継承されたメソッドをオーバーライドする必要があります。 –

+0

はい。そうです。 (しかし、あなたは 'B.a 'と呼ぶことはありません...あなたはそれを使うでしょう。メソッドを呼び出すだけです。) –

+0

私はゲッターについて話しています。 –

2

理由はかかわらず、フィールドのアクセス修飾子の、クラスで定義されたフィールドは、サブクラスでオーバーライド決してであるということです。

スーパークラスのフィールドと同じ名前のサブクラスにフィールドを宣言すると、そのサブクラスには実際にその名前を持つ2つのフィールドがあります。スーパークラスから継承されたフィールドはサブクラスでに隠されていますが(アクセス規則で許可されている場合)、サブクラスでスーパークラスのバージョンにアクセスできます。例えばフィールド名をクラス名で修飾します。

(あなたの特定の例では、アクセスルールはAで宣言さaにアクセスするためにBを禁止privateフィールドやメソッドが唯一のクラス自体またはネストされたクラスからアクセスすることができます。しかし、そうであっても、があります任意のBインスタンスのaという2つのフィールド)

関連する問題