为什么不根据对象的运行时类型选择此方法?

and*_*and 1 java methods overriding

考虑一下:

class A  {
    int x =5;
}

class B extends A{
        int x =6;
    }
public class CovariantTest {

    public A getObject() {
        return new A();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        CovariantTest c1 = new SubCovariantTest();
        System.out.println(c1.getObject().x);
    }

}

class SubCovariantTest extends CovariantTest {
    public B getObject(){
        return new B();
    }
}
Run Code Online (Sandbox Code Playgroud)

据我所知,JVM根据其对象的真实类型选择一种方法.这里的真实类型是SubCovariantTest,它定义了一个覆盖方法getObject.

该程序打印5,而不是6.为什么?

Meh*_*ari 10

该方法确实由对象的运行时类型选择.运行时类型未选择的是整数字段 x.对象x存在两个副本B,一个用于A.x,一个用于B.x.你是静态的选择领域A类,因为编译时通过返回的对象的类型getObjectA.可以通过向A和添加方法来验证此事实B:

class A  {
    public String print() {
        return "A";
    }
}

class B extends A {
    public String print() {
        return "B";
    }
}
Run Code Online (Sandbox Code Playgroud)

并将测试表达式更改为:

System.out.println(c1.getObject().print());
Run Code Online (Sandbox Code Playgroud)