1. 向上转型(upcast)
一个ext class的object可以用base class的reference来指向,即ext class的object reference可以升级为base class的object reference。
如:Base b = new Ext();
2. 动态绑定(dynamic binding)
一般说来,将一个方法调用和一个方法主体关联起来叫做绑定。也可以理解为将方法名和方法body(方法代码段)关联起来叫做绑定。除了static方法和final方法(final包含private)外,Java对其他所有的方法都采用dynamic binding(3月27日补充:请正确理解这句话;more details see [#0x000C]),即直到调用方法的那个时刻才开始绑定。
多态即是利用了动态绑定这一特点。举个例子来说,Base类有个work()方法,Base类的两个子类Ext1和Ext2都覆写了work()方法,现在有一个Base b,它可能是一个new Base(),也可能是一个new Ext1()或是new Ext2()(向上转型允许),若此时调用b.work(),编译器会判断究竟是调用Base类的work()还是Ext1类的work()或是Ext2类的work()。从这个角度来说,动态绑定更像是动态确定reference指向的object,即这个reference到底是指向Base object还是Ext1 object或是Ext2 object。
注意,Ext1和Ext2必须是都覆写了work()方法,如果不是覆写就没有动态绑定的意义了,因为只有覆写才能造成Base、Ext1、Ext2中各有一个同签名不同方法body的work()方法。
p.s. 不存在平行转型(horizontal-cast),即Ext1 e = new Ext2()。
3. field和static方法没有动态绑定
意味着b.field和b.staticFunction()完全看b的声明类型。若是声明了Ext b,则是Ext的field和staticFunction();若是声明了Base b,则是Base的field和staticFunction(),就算有Base b = new Ext()也是如此。
4. 利用多态的一个例子
如在某方法中,不管传进来的参数是Ext1 object还是Ext2 object,都要求执行work()方法,这是可以写成:
return-type xxx(..., Base b, ...)
{
...;
b.work();
...;
}
这就相当于把类型判断交给编译器去执行了。
分享到:
相关推荐
java写webapi源码StringEncrypt — 面向 Python 开发人员的字符串和文件加密 StringEncrypt 允许您使用随机生成的算法加密字符串和文件,每次以所选的编程语言生成唯一的解密代码(所谓的...0x0009 , 0x300E , 0x100F ,
例如: Z(80-162-286)-DICOM^TIFF.be3b767b.dcm.tif是DICOM / TIFF拉链,其中有效载荷切换在偏移侧0x80 , 0x162和0x286 。 -s选项分别提取2个有效负载,并与伪随机字节混合(此后不修复校验和)。 Mitra不会
git clone https://github.com/nil0x42/phpsploit cd phpsploit/ pip3 install -r requirements.txt ./phpsploit --interactive --eval " help help " 特征 高效:超过20个插件可自动执行权限提升任务 运行命令并...
多态类中的虚函数表是Compile-Time,还是Run-Time时建立的? 答案:虚拟函数表是在编译期就建立了,各个虚拟函数这时被组织成了一个虚拟函数的入口地址的数组.而对象的隐藏成员--虚拟函数表指针是在运行期--也就是...
面试题4:设置地址为0x67a9的整型变量的值为0xaa66 面试题5:评论下面这个中断函数 面试题6:评价一个代码片段 第8章 面向对象 8.1 面向对象的基本概念 面试题1:谈谈你对面向对象的认识 面试题2:面向对象的三大...
A:机器指令 B:微指令 C:汇编语言 D:机器码 答案:C 而0x52000000对应0x52这个值使用的是()字节序。 A:小端 B:大端 C:终端 D:前端 答案:A 以下那个窗口是操作和分析二进制的主要位置,也是反汇编代码所在的地方 A...
它提供了一个强大的框架,允许执行数据库对象到Delphi类的对象关系映射,完全支持封装,继承,多态和其他OOP功能。为了从数据库中检索数据,LINQ用作独立于数据库的查询引擎。此外,还有一个功能丰富的ORM建模工具 -...
1.是不是一个父类写了一个virtual 函数,如果子类覆盖它的函数不加virtual ,也能实现多态? virtual修饰符会被隐形继承的。 private 也被集成,只事派生类没有访问权限而已 virtual可加可不加 子类的空间里有父类...
polymiorphism[java] 多态 (polymorphism 多形性[,pɒli'mɒ:fizm]) allowing a single object to be seen as having many types. principle n.原则,原理,主义 ['prinsipl] priority n. 优先级 [prai'ɒriti] ...