动态绑定

在doStuff()的代码里,最让人吃惊的是尽管我们没作出任何特殊指示,采取的操作也是完全正确和恰当的。我们知道,为Circle调用draw()时执行的代码与为一个Square或Line调用draw()时执行的代码是不同的。但在将draw()消息发给一个匿名Shape时,根据Shape句柄当时连接的实际类型,会相应地采取正确的操作。这当然令人惊讶,因为当Java编译器为doStuff()编译代码时,它并不知道自己要操作的准确类型是什么。尽管我们确实可以保证最终会为Shape调用erase(),为Shape调用draw(),但并不能保证为特定的Circle,Square或者Line调用什么。然而最后采取的操作同样是正确的,这是怎么做到的呢?
将一条消息发给对象时,如果并不知道对方的具体类型是什么,但采取的行动同样是正确的,这种情况就叫作“多形性”(Polymorphism)。对面向对象的程序设计语言来说,它们用以实现多形性的方法叫作“动态绑定”。编译器和运行期系统会负责对所有细节的控制;我们只需知道会发生什么事情,而且更重要的是,如何利用它帮助自己设计程序。
有些语言要求我们用一个特殊的关键字来允许动态绑定。在C++中,这个关键字是virtual。在Java中,我们则完全不必记住添加一个关键字,因为函数的动态绑定是自动进行的。所以在将一条消息发给对象时,我们完全可以肯定对象会采取正确的行动,即使其中涉及上溯造型之类的处理。

时间: 2016-05-27

动态绑定的相关文章

java-Java动态绑定,对象已经向上转型了,为何优先使用的方法依然是子类的方法。

问题描述 Java动态绑定,对象已经向上转型了,为何优先使用的方法依然是子类的方法. 情况如下,我写了个测试类. son类 public class son extends father { public son() { fs=""new son""; } public void say() { System.out.println(""son say()""); } father类 public class father {

ajax的异步请求-我用dropdownlist动态绑定数据,用ajax实现数据获取,第一遍遍历之后,不再刷新

问题描述 我用dropdownlist动态绑定数据,用ajax实现数据获取,第一遍遍历之后,不再刷新 我数据放在returndata.aspx的datatable中,第一次执行是可以的,当选择dropdownlist中不同的option会返回不同的信息,但是当遍历完datatable中的所有rows之后,dropdownlist的onchange事件失效了,获取的内容不再更新. 1. Defalut.aspx <script type=""text/javascript"

C++中的继承(inheritance) 和动态绑定(dynamic binding) 简介

继承(inheritance)和动态绑定(dynamic binding) 是面向对象的重要组成部分, 即继承(inheritance)和多态(polymorphism), 可以使 派生类(derived class)拥有 基类(base class) 的接口(interface); 派生类可以覆写(override)基类的虚函数(virtual function), 符合特定的功能; 派生类可以隐式地转换为基类 (derived-to-base conversion), 但不可逆, 因为派生类

C++的静态绑定和动态绑定概述

C++在面向对象编程中,存在着静态绑定和动态绑定的定义,本节即是主要讲述这两点区分. 我是在一个类的继承体系中分析的,因此下面所说的对象一般就是指一个类的实例. 首先我们需要明确几个名词定义: 静态类型:对象在声明时采用的类型,在编译期既已确定: 动态类型:通常是指一个指针或引用目前所指对象的类型,是在运行期决定的: 静态绑定:绑定的是静态类型,所对应的函数或属性依赖于对象的静态类型,发生在编译期: 动态绑定:绑定的是动态类型,所对应的函数或属性依赖于对象的动态类型,发生在运行期: 从上面的定义

动态绑定事件(java AWT)

新AWT事件模型给我们带来的一个好处就是灵活性.在老的模型中我们被迫为我们的程序动作艰难地编写代码.但新的模型我们可以用单一方法调用增加和删除事件动作.下面的例子证明了这一点:   //: DynamicEvents.java // The new Java 1.1 event model allows you to // change event behavior dynamically. Also // demonstrates multiple actions for an event.

关于动态绑定的理解

在子类和父类里面有同名函数的时候,如果生成一个子类的对象,并在子类的对象里面调用这个函数,那么到底会是调用的是谁的函数呢?例如 class Base{ int i=47; int f(){ return g(); } int g(){ return i; } } class Dervied extends Base{ int i=27; int g(){ file://override父类里面的方法 return i; } } public class test { public static

php动态绑定变量的用法

 本文实例讲述了php动态绑定变量的用法.分享给大家供大家参考.具体如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 private function bindVars($stmt,$params) { if ($params != null) { $types = ''; //initial sting with types foreach($params a

关于innerHTML后丢失动态绑定的EVENT问题

 用innerHTML取出一段内容后再innerHTML回去,那么原来动态绑定的事件就会丢失,如: html: 代码如下: <body><div id='d1'>点击</div></body> script: 代码如下: document.getElementById('d1').onclick=function(){alert(1)}; var html=document.body.innerHTML; document.body.innerHTML=ht

Chrome扩展页面动态绑定JS事件提示错误

 开发Chrome扩展时,页面的popup.html中需要js的时候,直接将JS写在动态绑定JS事件会提示错误,下面有个不错的解决方法,大家可以参考下 问题描述:    当开发Chrome扩展时,页面的popup.html中需要js的时候,直接将JS写在动态绑定JS事件会提示:    Refused to execute inline script because it violates the following Content Security Policy directive: "scri