Java协变返回类型

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);
}
}
3个回答

13

但是该方法被定义为返回 A。所以访问的是 A.x - Bozho
1
@kris,你正在使用A的引用调用方法,在其中它具有返回类型A - jmj
好的,即使 test.getObject() 返回 B 的一个实例,test 变量仍然是 Base 引用。因此,在打印 x 的情况下,它会调用 Base:getObject() 吗? - kris979
test.getObject() instanceof B 返回 true - 这就是让我感到困惑的地方! - kris979
1
因为instanceof检查发生在运行时,而A.x在编译时实现。 - Bozho

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);
    }
}

这段代码将会输出 - 在子程序中和1

简洁明了的答案。 - STEEL

0

@kris979 虽然你返回了 B,但我认为不同之处在于返回类型是 A。因此,A 中 x 的值即 1 被打印出来。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接