public class Test
{
public static abstract class Node
{
private Node kid;
public abstract int getN();
public Node(Node kid) { this.kid = kid; }
public final Node copyWithNewChild(Node newKid)
{
return new Node(newKid)
{
public int getN()
{
return Node.this.getN(); //****
}
};
}
}
}
正如您所看到的,我有一个名为Node
的基类,方法getN()
将被子类覆盖。
假设我有一个名为RedNode
的类Node
并为getN()
提供了具体的实现,并且还有另一个名为SquareRedNode
的类,扩展了RedNode
并且还为getN()
提供了一个实现。
(当然,其他东西也可以延伸SquareRedNode
(即,家谱可以无限增长))
现在提问,编译器如何确定执行getN()
时要调用哪个copyWithNewChild()
(我不是要求选择“什么”实现,我可以通过编译/执行代码轻松搞清楚。我想知道如何它已完成。)
谢谢,
答案 0 :(得分:4)
编译器没有弄明白,它是一个虚方法,直到运行时它才得到解析。
JVM查看它正在调用getN
的对象的类,并查看它是否实现了getN
。如果是,则使用它,否则它会查看超类并查看它是否实现了它。它以这种方式向上进行,直到找到实现。