java协变返回类型

时间:2011-05-26 10:36:26

标签: java return covariant

为什么下面的代码打印“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);
}
}

3 个答案:

答案 0 :(得分:13)

答案 1 :(得分:0)

@ kris979虽然您要返回B,但我认为不同之处在于返回类型为A.因此,A中的x值即为1。

答案 2 :(得分: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);
    }
}

此代码将打印 - 在sub和1