访问者模式讨论篇:java的动态绑定与双分派

发表于:2015-4-08 09:32

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:卡奴达摩的专栏    来源:51Testing软件测试网采编

  java的动态绑定
  所谓的动态绑定就是指程执行期间(而不是在编译期间)判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。java继承体系中的覆盖就是动态绑定的,看一下如下的代码:
class Father {
public void method(){
System.out.println("This is Father's method");
}
}
class Son1 extends Father{
public void method(){
System.out.println("This is Son1's method");
}
}
class Son2 extends Father{
public void method(){
System.out.println("This is Son2's method");
}
}
public class Test {
public static void main(String[] args){
Father s1 = new Son1();
s1.method();
Father s2 = new Son2();
s2.method();
}
}
  运行结果如下:
  This is Son1′s method
  This is Son2′s method
  通过运行结果可以看到,尽管我们引用的类型是Father类型的,但是运行时却是调用的它实际类型(也就是Son1和Son2)的方法,这就是动态绑定。在java语言中,继承中的覆盖就是是动态绑定的,当我们用父类引用实例化子类时,会根据引用的实际类型调用相应的方法。
  java的静态绑定
  相对于动态绑定,静态绑定就是指在编译期就已经确定执行哪一个方法。在java中,方法的重载(方法名相同而参数不同)就是静态绑定的,重载时,执行哪一个方法在编译期就已经确定下来了。看一下代码:
class Father {}
class Son1 extends Father{}
class Son2 extends Father{}
class Execute {
public void method(Father father){
System.out.println("This is Father's method");
}
public void method(Son1 son){
System.out.println("This is Son1's method");
}
public void method(Son2 son){
System.out.println("This is Son2's method");
}
}
public class Test {
public static void main(String[] args){
Father father = new Father();
Father s1 = new Son1();
Father s2 = new Son2();
Execute exe = new Execute();
exe.method(father);
exe.method(s1);
exe.method(s2);
}
}
21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号