将一个方法调用同一个方法主体关联起来被称为绑定。

若在程序执行前期进行绑定(如果有的话,由编译器和连接程序实现),叫做前期绑定。

当编译器只有一个引用时,它无法知道究竟调用哪个方法才对,解决的办法就是后期绑定,它的含义就是在运行时根据对象的类型进行绑定。后期绑定也叫做动态绑定或运行时绑定。

java中除了static方法和final(private方法属于final方法)之外,其他所有的方法都是后期绑定。这意味着同城情况下,我们不必判定是否应该进行后期绑定----它会自动发生。

有一个基类Shape,以及多个导出类--Circle、Square、Triangle等,每个类中都有draw(),erase()方法,向上转型可以像下条语句这么简单:

Shape s = new Circle();

这里,创建了一个Circle对象,并把得到的引用立即赋值给Shape,这样看似错误(将一种类型赋值给另一种类型);但实际上是没有问题的,因为通过继承,Circle就是一种Shape。

假设你调用一个基类方法(它已在导出类中被覆盖)

s.draw();

你可能认为调用的是Shape的draw(),因为这毕竟是一个Shape的引用,那么编译器是怎么知道去做其他的事情呢?由于后期绑定(多态),还是调用了Circle.draw()方法。

下面的例子稍微有不同:

public classShape

{public voiddraw(){}public voiderase(){}

}public class Circle extendsShape

{public voiddraw()

{

System.out.println("Circle.draw()");

}public voiderase()

{

System.out.println("Circle.erase()");

}

}public class Square extendsShape

{public voiddraw()

{

System.out.println("Square.draw()");

}public voiderase()

{

System.out.println("Square.erase()");

}

}public class Triangle extendsShape

{public voiddraw()

{

System.out.println("Triangle.draw()");

}public voiderase()

{

System.out.println("Triangle.erase()");

}

}public classRandomShapeGenerator

{private Random rand = new Random(47);publicShape next()

{switch(rand.nextInt(3))

{default:case 0 : return newCircle();case 1 : return newSquare();case 2 : return newTriangle();

}

}

}public classShapes

{private static RandomShapeGenerator rsg =

newRandomShapeGenerator();public static voidmain(String[] args)

{

Shape [] s= new Shape[9];for (int i = 0; i < s.length; i++)

s [i]=rsg.next();for(Shape shp : s)

{

shp.draw();

}

}

}

输出为:

Triangle.draw()

Triangle.draw()

Square.draw()

Triangle.draw()

Square.draw()

Triangle.draw()

Square.draw()

Triangle.draw()

Circle.draw()

Shape基类为自它那里继承来的所有导出类建立了一个公用接口----也就是说,所有形状都是可描绘和擦除。导出类通过覆盖这些定义,来为每种特殊类型的几何形状提供单独的行为。

RandomShapeGenerator是一种“工厂”,在我们每次调用next()方法时,它可以随机选择的为Shape对象产生一个引用。请注意向上转型是在return语句后发生的。每个return语句取得一个指向某个Circle、Square或者Triangle的引用,并将其以Shape类型从next()方法中发送出去。所以无论我们在什么时候调用next()方法时,是绝对不可能知道具体类型到底是什么的,因为我们总是只能获得一个通用的Shape引用。

main()包含了一个Shape引用组成的数组,通过调用RandomShapeGenerator.next()来填入数据。此时,我们只知道自己拥有一些Shape,初次之外不会知道更具体的情况(编译器也不知道)。然而,当我们遍历数组时,并为每个数组元素调用draw()方法时,与类型有关的特定行为会神奇地正确发生。

随机选择几何形状是为了更好的看出编译器不需要获得任何特殊信息就能进行正确的调用。对draw()方法的所有调用都是通过动态绑定进行的。

java 方法绑定_java 方法调用绑定相关推荐

  1. java 静态绑定原理_Java方法的静态绑定与动态绑定讲解

    一:绑定 把一个方法与其所在的类/对象 关联起来叫做方法的绑定.绑定分为静态绑定(前期绑定)和动态绑定(后期绑定). 二:静态绑定 静态绑定(前期绑定)是指:在程序运行前就已经知道方法是属于那个类的, ...

  2. java实验楼使用说明_Java 方法

    Java 方法 一.实验介绍 1.1 实验内容 本实验将学习Java方法的定义与语法规则.方法重载以及参数与返回值的相关内容. 1.2 实验知识点 方法的定义 方法重载 参数与返回值 1.3 实验环境 ...

  3. java传递实例_Java方法的参数传递机制实例详解

    本文实例讲述了Java方法的参数传递机制.分享给大家供大家参考,具体如下: 参数传递机制 对于程序设计语言来说,一般方法(函数)的参数传递有两种:按值传递和按引用传递. 按值传递意味着当将一个参数传递 ...

  4. java 方法 时间_Java 方法

    方法的概念 方法就是将功能重复的代码封装成一段独立的小程序,通过调用方法的方式以提高代码的复用性(减少代码重复) int year = 2020; if ( year % 4 == 0 &&a ...

  5. java 方法 示例_Java方法参考类型和示例

    java 方法 示例 Java Method Reference was introduced in Java 8, along with lambda expressions. The method ...

  6. java方法头_java方法学习

    java方法学习 方法概念 什么是方法 方法就是完成某些事情的过程,如:实现两个数相加,用方法add(数值1,数值2). 1.System.out.print(),System是系统的一个类,out是 ...

  7. java 默认参数_Java 方法的参数可以有默认值吗?

    Java 方法的参数可以有默认值吗? 例如 void method(String p1, int p2, bool p3=false); 回答 Java不支持这种特性, 如果你真的有需求,你可以 通过 ...

  8. java永久区_Java方法区和永久代

    目前有三大Java虚拟机:HotSpot,oracle JRockit,IBM J9. JRockit是oracle发明的,用于其WebLogic服务器,IBM JVM是IBM发明的用于其Websph ...

  9. java 返回值_Java方法返回值详解

    Java方法返回值详解 每个方法都是为了完成某个特定的功能,例如:登录功能.求和功能等,既然是功能,那么当这个功能完成之后,大多数情况下都会有一个结果的,比如,登录成功了或者失败了(true/fals ...

最新文章

  1. Java 和 C 长期霸权结束
  2. KD树是什么? 为什么要用KD树? KD树怎么用? KD树和KNN的关联是什么?
  3. Python(Dict和Set类型)
  4. python线程检测网段脚本!
  5. Image Pro Plus测量组织平均厚度
  6. 关于java.math.BigDecimal的操作(亲测)
  7. typescript设置只读属性和任意类型
  8. ocp跟oce的区别 oracle_Oracle视频10g 11g认证视频教程 OCA/OCP 从入门到精通 数据库DBA...
  9. VUE 解决:Method “xxx“ has already been defined as a data property.
  10. Windows服务无法引用.dll的错误
  11. Windows引导及安装
  12. jsp面试问题_JSP面试问答
  13. 博客访问量,有没有可能是系统所为?
  14. 微信小程序电子签名实现并识别文字
  15. WGS84 与 北京54 坐标系互转
  16. 联想ideapad710s的win10转win7
  17. UIButton基础以及使用block+UIButton处理点击事件
  18. python2.7实现简单日记本,兼容windows和linux
  19. mysql 中文截取_中文字符串截取
  20. 每天学习10句英语-第九天

热门文章

  1. python之helloworld
  2. 人脸方向学习(十三):Face Tracking-人脸跟踪KCF解读
  3. 人脸方向学习(十一):Face Landmark Detection-PFLD解读
  4. ubuntu防火墙问题
  5. 解决WordPress无法发送电子邮件
  6. excel制作跨职能流程图_你会用Excel制作流程图吗?超级强大的功能
  7. html鼠标平滑滚动效果,JS特效代码 JS动态平滑滚动菜单效果
  8. mysql主从复制原理详解_深入研究MySQL(三)、主从复制原理及演示
  9. vue中有汉字和数字。怎么截取汉字保留数字_Excel提取中文,数字和字母,一分钟搞定!...
  10. c++ regex 替换汉字_C++ - 正则表达式(regex) 替换(replace) 的 详解 及 代码