0

このコードを見てください:

class Foo {
    public int a;
    public Foo() {
        a = 3;
    }
    public void addFive() {
        a += 5;
    }
    public int getA() {
        System.out.println("we are here in base class!");
        return  a;
    }
}

public class Polymorphism extends Foo{
    public int a;
    public Poylmorphism() {
        a = 5;
    }
    public void addFive() {
        System.out.println("we are here !" + a);
        a += 5;
    }
    public int getA() {
        System.out.println("we are here in sub class!");
        return  a;
    }

    public static void main(String [] main) {
        Foo f = new Polymorphism();
        f.addFive();
        System.out.println(f.getA());
        System.out.println(f.a);
    }
}

ここでは、class の object の参照をPolymorphismtype の変数Foo、古典的な多態性に代入します。ここaddFiveで、クラスでオーバーライドされたメソッドを呼び出しますPolymorphism。次に、クラス Polymorphism でオーバーライドされた getter メソッドから変数値を出力します。したがって、答えは 10 になります。しかし、パブリック変数aが SOP されると、答えは 3 になります!!

どうしてそうなった?参照変数の型が Foo なのに、Polymorphism クラスのオブジェクトを参照していました。では、なぜアクセスf.aしてもクラスの a の値が出力されないのPolymorphismでしょうか? 助けてください

4

2 に答える 2

5

あなたはaof を隠していますPolymorphism- 実際にはコンパイラの警告が表示されるはずです。したがって、これらは 2 つの異なるaフィールドです。メソッドとは対照的に、フィールドは仮想にすることはできません。public フィールドをまったく持たず、private 状態を変更するためのメソッド (カプセル化) のみを使用することをお勧めします。

仮想にしたい場合は、アクセサ メソッドを使用してプロパティとして作成する必要があります (例: what you have: getA)。

于 2012-09-16T11:31:04.797 に答える
2

これは、クラス変数をオーバーライドできないためです。クラス変数にアクセスするときは、オブジェクトの型ではなく、参照の型によって、何を取得するかが決まります。

サブクラスで a の再宣言を削除すると、期待どおりの動作になると思います。

于 2012-09-16T11:32:08.673 に答える