8

以下のコードが「1」を出力するのはなぜですか?

class A {
    int x = 1;
}

class B extends A {
    int x = 2;
}

class Base {

    A getObject() {
        System.out.println("Base");
        return new B();
    }
}

public class CovariantReturn extends Base {

B getObject() {
   System.out.println("CovariantReturn");
   return new B(); 
}
/**
 * @param args
 */
public static void main(String[] args) {
    Base test = new CovariantReturn();
    System.out.println(test.getObject() instanceof B);
    System.out.println(test.getObject().x);
}
}
4

3 に答える 3

13

ポリモーフィズムの影響を受けないフィールドを参照しているためです。代わりにを使用getX()した場合は、が返され2ます。

あなたが求めているのは、xクラスで定義されたフィールドの値ですA(がBase.getObject()返されるためA)。CovariantReturnを返すメソッドをオーバーライドしますがB、オブジェクトをとして参照していませんCovariantReturn

フィールドがポリモーフィズムの影響を受けない方法について少し詳しく説明すると、フィールドアクセスはコンパイル時に実現されるため、コンパイラーが何を認識しても、それがアクセスされます。あなたの場合、メソッドはreturnAを定義しているのでA.x、アクセスされます。一方、メソッドは実行時型に基づいて呼び出されます。したがってA、のインスタンスを返すが返すように定義した場合でもB、呼び出すメソッドはで呼び出されBます。

于 2011-05-26T10:39:28.927 に答える
0

Bozho が指摘したように、インスタンス変数はポリモーフィズムの影響を受けません。簡単な小さな例を挙げましょう。

class Base {
    int i = 1;
    void method() {
        System.out.println("in base");
    }
}

class Sub extends Base {
    int i = 2;

    void method() {
        System.out.println("in sub");
    }
}

public class Test { 
    public static void main(String[] args) {
        Base obj = new Sub();
        obj.method();
        System.out.println(obj.i);
    }
}

このコードは出力されます - in sub and 1

于 2013-01-08T19:16:41.747 に答える