这里的绑定指的是对象和方法间的关联
绑定有两种形式静态绑定static-binding(早绑定early-binding)和动态绑定dynamic-binding(晚绑定late-binding,或运行时绑定runtime-binding)
静态绑定是在编译时绑定,而动态绑定是在运行时根据对象的实际情况来选择绑定父类或者是某个子类的方法
在执行效率上,静态绑定要优于动态绑定,但丧失了灵活性
在C++中,函数默认是静态绑定的(动态绑定需要声明virtual关键字,也就是虚函数),而Java中则是默认动态绑定
静态绑定很好理解我们的重点是动态绑定,下面是一个动态绑定的例子
class
SuperClass
...
{
public void show() ...{
System.out.println("Object of SuperClass!");
}
}
class ChildClass1 extends SuperClass ... {
public void show() ...{
System.out.println("Object of ChildClass1!");
}
}
class ChildClass2 extends ChildClass1 ... {
public void show() ...{
System.out.println("Object of ChildClass2!");
}
}
public class DynamicBind ... {
public static void main(String[] args) ...{
SuperClass[] s = ...{
new SuperClass(),new ChildClass1(), new ChildClass2()
};
for (int i = 0 ; i < 3 ; i++) ...{
s[i].show();
}
}
}
public void show() ...{
System.out.println("Object of SuperClass!");
}
}
class ChildClass1 extends SuperClass ... {
public void show() ...{
System.out.println("Object of ChildClass1!");
}
}
class ChildClass2 extends ChildClass1 ... {
public void show() ...{
System.out.println("Object of ChildClass2!");
}
}
public class DynamicBind ... {
public static void main(String[] args) ...{
SuperClass[] s = ...{
new SuperClass(),new ChildClass1(), new ChildClass2()
};
for (int i = 0 ; i < 3 ; i++) ...{
s[i].show();
}
}
}
运行结果
Object of SuperClass!
Object of ChildClass1!
Object of ChildClass2!
在以上代码中,最后一行s[i].show();在程序运行时才动态地根据对象的类型决定要调用哪个类中的方法,具体实机制现细节,请参看上溯造型的相关知识 http://blog.csdn.net/nyzhl/archive/2007/06/03/1636658.aspx
另: private,static,final等关键字声明的方法都是静态绑定的