方法调用绑定
将一个方法调用和一个方法主体关联起来称作绑定。
若绑定发生在程序运行前(如果有的话,由编译器和链接器实现),叫做前期绑定。前期绑定是面向过程语言默认的绑定方式,例如 C 语言中,就只有前期绑定这一种方法调用。
在运行时根据对象类型进行绑定,叫做后期绑定,也称为动态绑定或运行时绑定。也就是说编译器不知道对象的类型,但是方法调用机制能找到正确的方法体并调用。每种语言的后期绑定机制不同,但是可以想到,对象中一定存在某种类型信息。
Java 中除了 static 和 final 方法(private 方法也是隐式的 final)外,其他所有方法都是后期绑定。
构造器内部多态方法的行为
class Glyph {
void draw() {
System.out.println("Glyph.draw()");
}
Glyph() {
System.out.println("Glyph() before draw()");
draw();
System.out.println("Glyph() after draw()");
}
}
class RoundGlyph extends Glyph {
private int radius = 1;
RoundGlyph(int r) {
radius = r;
System.out.println("RoundGlyph.RoundGlyph(), radius = " + radius);
}
@Override
void draw() {
System.out.println("RoundGlyph.draw(), radius = " + radius);
}
}
public class PolyConstructors {
public static void main(String[] args) {
new RoundGlyph(5);
}
}
// 运行结果:
Glyph() before draw()
RoundGlyph.draw(), radius = 0
Glyph() after draw()
RoundGlyph.RoundGlyph(), radius = 5
在基类的构造器中,能安全调用的只有基类的 final 方法(也适用于被看作 final 的 private 方法)。