关于语言的前期绑定与后期绑定

时间:2023-02-25 23:33:28


绑定指的是一个方法的调用与方法所在的类(方法主体)关联起来。

  前期绑定:在程序执行前方法已经被绑定,此时由编译器或其它连接程序实现。

  后期绑定:在运行时根据具体对象的类型进行绑定。

  在了解了三者的概念之后,很明显我们发现java属于后期绑定。在java中,几乎所有的方法都是后期绑定的,在运行时动态绑定方法属于子类还是基类。但是也有特殊,针对static方法和final方法由于不能被继承,因此在编译时就可以确定他们的值,他们是属于前期绑定的。特别说明的一点是,private声明的方法和成员变量不能被子类继承,所有的private方法都被隐式的指定为final的(由此我们也可以知道:将方法声明为final类型的一是为了防止方法被覆盖,二是为了有效的关闭java中的动态绑定)。java中的后期绑定是有JVM来实现的,我们不用去显式的声明它,这也是面向对象程序设计的最重要的妙诀:编译器不可能产生传统意义上的函数调用。而C++则不同,必须明确的声明某个方法具备后期绑定。

   一个非面向对象编程的编译器产生的函数调用会引起所谓的前期绑定,这么做意味着编译器将产生对一个具体函数名字的调用,而运行时将这个调用解析到将要被执行的代码的绝对地址。而在OOP中,程序知道运行时才能够确定代码的地址,所以当消息发送到一个泛华对象时,必须采用其他的机制。这个机制就是后期绑定。在运行时编译器确保被调用方法的存在,并对调用参数和返回值执行类型检查,但是并不知道将被执行的确切代码。