gpt4 book ai didi

java - 通过继承隐藏字段

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:54:26 24 4
gpt4 key购买 nike

在下面的代码示例中:

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

输出:

5 6
Child.aMthod 6

Child.aMthod 6

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

谢谢

编辑

哎呀,一个小错别字:问题应该是“为什么 p.aMethod() 在 p.x 打印 5 时不打印 5”——谢谢@thinksteep

最佳答案

当您访问像 p.x 这样的类成员字段(实例变量)时,不会进行多态解析。换句话说,您将从编译时已知的类中获得结果,而不是运行时已知的结果。

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

关于java - 通过继承隐藏字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8647248/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com