2012-05-02 24 views
1

私は2クラスあります属性および多型

public class Increase { 
public int a=3; 
public void add(){ 
    a+=5; 
    System.out.println("f"); 
} 
} 

class SubIncrease extends Increase{ 
    public int a=8; 
    public void add(){ 
     a+=5; 
     System.out.println("b" + a); 

    } 
} 

をしかし、私は

Increase f=new SubIncrease(); 
    System.out.println(f.a); 
    f.add(); 
    System.out.println(f.a); 

を実行したときに、私はこの出力を得た:これはなぜ起こるか

3 
b13 
3 

誰も私を理解するのに役立つ可能性があり? a属性の値は、メソッドaddで変更されました。これは、2番目の出力行で示されています...なぜ元の値に戻るのでしょうか?

答えて

5

Javaでは、フィールドはオーバーライドされず、非表示になります。つまり、Increase.aSubIncrease.a個別のフィールドで、別々に変更および照会することができます。変数fの型がIncreaseであるため、式f.aはスーパークラスフィールドの値を返します。しかし、add()メソッドは、がオーバーライドされ、f.add()がサブクラス・メソッドを呼び出して、サブクラス・フィールドを変更します。

フィールドを隠すことはめったに意味がないため、避けるべきです。サブクラスに異なるデフォルト値を持つフィールドを持つ場合は、スーパークラスでのみ定義し、サブクラスのコンストラクタで値を代入します。

関連する問題