动态绑定:在运行时根据对象的类型调用恰当的方法。Java中除了static方法(构造方法可看做static方法)和final方法(private方法可看做final方法)之外,其他普通方法都是动态绑定的。
测试在构造方法中调用该类的多态方法,代码如下。
package polymorphism;
class ConstructSuper{
protected int rr = 1;
ConstructSuper(){
System.out.println("ConstructSuper() before f()");
f();
System.out.println("ConstructSuper() after f()");
}
void f(){
System.out.println("ConstructSuper.f()");
}
}
class ConstructSub extends ConstructSuper{
private int r = 1;
ConstructSub(int r){
this.r = r;
System.out.println("ConstructSub.ConstructSub(), r="+r+", rr="+rr);
}
void f(){
System.out.println("ConstructSub.f(), r="+r+", rr="+rr);
}
}
public class PolyConstruct {
public static void main(String[] args) {
new ConstructSub(5);
}
}
/*程序输出为:
ConstructSuper() before f()
ConstructSub.f(), r=0, rr=1
ConstructSuper() after f()
ConstructSub.ConstructSub(), r=5, rr=1
*/
从运行结果中,可以对Java对象的创建过程该文章中进行一个补充,即:将分配给对象的存储空间初始化成默认值之后,如果存在继承关系则首先“创建”基类对象(即:将基类对象的存储空间初始化为默认值、按照声明顺序调用成员的初始化方法、调用基类构造方法),其次才是按照声明的顺序调用自己的成员的初始化方法,最后调用自己的构造方法。
虽然此程序调用没有出现错误,但是还是要避免这样的调用方法,因为如果被调用的f()方法中的成员还未进行初始化,则很容易出现错误。