编译器如何选择正确的重写方法

时间:2014-01-14 19:29:33

标签: java override

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()

(我不是要求选择“什么”实现,我可以通过编译/执行代码轻松搞清楚。我想知道如何它已完成。)

谢谢,

1 个答案:

答案 0 :(得分:4)

编译器没有弄明白,它是一个虚方法,直到运行时它才得到解析。

JVM查看它正在调用getN的对象的类,并查看它是否实现了getN。如果是,则使用它,否则它会查看超类并查看它是否实现了它。它以这种方式向上进行,直到找到实现。