隐藏的字段虽然继承

zig*_*ggy 10 java oop inheritance scjp

在以下代码示例中:

class Parent { 
    int x =5;
    public Integer aMethod(){

        System.out.print("Parent.aMthod ");
        return x;
    }
}

class Child extends Parent {
    int x =6;
    public Integer aMethod(){
        System.out.print("Child.aMthod "); 
        return x;
    }
}


class ZiggyTest2{

    public static void main(String[] args){

        Parent p = new Child();
        Child c = new Child();

        System.out.println(p.x + " " + c.x);

        System.out.println(p.aMethod() + "  \n");
        System.out.println(c.aMethod() + "  \n");
    }   
}
Run Code Online (Sandbox Code Playgroud)

并输出:

5 6
Child.aMthod 6  

Child.aMthod 6
Run Code Online (Sandbox Code Playgroud)

p.aMethod()当px打印6时,为什么不打印6?

谢谢

编辑

哎呀一个小错字:问题应该是"为什么p.aMethod()在px print 5时不打印5" - 谢谢@thinksteep

Arj*_*jms 12

当您访问类成员字段(实例变量)时,没有进行多态分辨率p.x.换句话说,您将从编译时已知的类中获得结果,而不是运行时已知的结果.

对于方法调用,这是不同的.它们在运行时被分派到引用指向的实际类的对象,即使引用本身具有超类型.(在VM中,这通过invokevirtual操作码发生,参见例如http://java.sun.com/docs/books/jvms/second_edition/html/Instructions2.doc6.html#invokevirtual).

  • 在字节码级别上讨论时,不应省略用于获取字段值的字节码.它是`getfield`(参见[JVM-Spec](http://java.sun.com/docs/books/jvms/second_edition/html/Instructions2.doc5.html#getfield)) (2认同)