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

誰かが私がこれが起こる理由を理解するのを手伝ってもらえますか?2番目の出力行に示されているように、属性の値がメソッドaddで変更されました...なぜ元の値に戻るのですか?

4

1 に答える 1

5

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

フィールドを非表示にすることはほとんど意味がないため、避ける必要があります。サブクラスで別のデフォルト値を持つフィールドが必要な場合は、スーパークラスでのみ定義し、サブクラス コンストラクターでそれに値を割り当てます。

于 2012-05-02T09:33:31.510 に答える