如果方法调用是动态绑定的,那么编译器为何会抱怨

对于类型B,未定义方法run()

为什么编译器检查在类b中运行的方法的存在

这是代码

import java.lang.*;

public class Program
{
    public static void main(String [] args)
    {
        B a = new A();
          a.run();//compiler complains at this line.
        a.p(10);
        a.p(10.0);
    }
}
    class B {
        public void p(int i)
        {
            System.out.println(i*2);
        }
    }

    class A  extends B{
        public void p(int i)
        {
            System.out.println(i);
        }
        public void run(){

        }
    }

最佳答案

Java在设计上是一种静态类型的语言,这意味着编译器必须知道并能够保证每个具体对象中都存在该方法的实现。 (Maxim Shoustin的答案很好地演示了此设计决策背后的原因。)

如果编译器假设没有任何保证,则未知对象将碰巧具有特定的方法,那么它将使Java成为鸭子类型的语言。这可能有其自身的优势,但并不符合Java的设计目标。

实际上,在静态类型的语言中,可以动态解析虚拟(意味着非最终)方法(例如您的run()方法),但是用于解析它们的策略仍在编译时编写。例如,在多态的许多实现中,该策略可能涉及读取vTable(包含该对象的虚拟方法的实际实现的地址的表)的正确偏移量-利用语言的类型安全性来获取某些内容动态调度期间的性能。

关于java - 如果方法调用是动态绑定(bind)的,那么编译器为何会提示xxx类型的方法xyz未定义,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18805980/

10-15 00:04
查看更多