在一般的方法内部,动态绑定的调用是在运行时才决定的,因为对象无法指定它是属于方法所在的那个类,还是属于哪个类的导出类
如果要调用构造器内部的一个动态绑定方法,就要用到那个方法的被覆盖后的定义
例子:
class Parent {
void draw() {
System.out.println("Parent draw()");
}
Parent() {
System.out.println("before Parent draw()");
draw();
System.out.println("after Parent draw()");
}
}
class Son extends Parent {
private String content = "sun";
Son(String content) {
this.content = content;
System.out.println("Son constructor(), content is " + content);
}
void draw() {
System.out.println("Son draw(), content is " + content);
}
}
public class Test {
public static void main(String[] args) {
new Son("moon");
}
}
//Output:
before Parent draw()
Son draw(), content is null
after Parent draw()
Son constrcutor(), content is moon
Son draw(), content is moon
Parent.draw()方法设计被覆盖,这种覆盖是在Son中发生的。但Parent构造器会调用这个方法,结果导致了对Son.draw()的调用,由于被覆盖的draw()方法在Son构造器之前调用,所以content为null