Parent类有方法a,ChildA childB都有方法a, 一个逻辑在调Parent类型的a方法时,传入ChildA实例和ChildB实例都是可以运行的,这称为Java的多态机制。
这是如何做到的呢?
这是如何做到的呢?
OO的设计诀窍:Javac编译器不产生传统意义上的函数调用。传统编译器会产生【前期绑定】,即编译器在编译阶段将产生对一个具体函数名字的调用,而运行时将这个调用解析到要被执行的代码的绝对地址,而在OOP中程序直到运行时才能够确定代码的地址,所以采用【后期绑定】的概念,当向对象发送消息时,被调用的代码直到运行时才确定。
Java中除了static方法和final方法(private方法属于final方法,构造方法属于隐式static方法)之外,其他所有的方法都是后期绑定,并且所有的属性都不具备多态,即类的属性域是在编译器决定的。
Javac编译器在编译时确保方法的存在,并对调用参数和返回值执行类型检查(无法提供此类保证的预言被称为弱类型的),但是并不知道将被执行的确切代码。为了执行后期绑定,Java使用了一小段特殊的代码来代替绝对地址调用。这段代码使用对象中存储的实际类型信息来计算方法体字节码指令的地址。
【前期绑定】:将一个方法调用同一个方法主体关联起来被称为绑定,若在程序执行前进行绑定(如果有的话,由编译器和连接程序实现),叫做前期绑定。
【后期绑定】:在运行时根据对象的类型绑定具体方法主体的字节码指令地址。后期绑定的预言必须具有某种在运行时判断对象类型的机制,从而调用恰当的方法。不管怎样,实现的思路都是在运行时对象中安置能找到具体类型地址的信息。