`

[#0x0009] 多态

    博客分类:
  • Java
EXT 
阅读更多

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允许您使用随机生成的算法对字符串和文件进行加密

    java写webapi源码StringEncrypt — 面向 Python 开发人员的字符串和文件加密 StringEncrypt 允许您使用随机生成的算法加密字符串和文件,每次以所选的编程语言生成唯一的解密代码(所谓的...0x0009 , 0x300E , 0x100F ,

    mitra:二进制多态的生成器

    例如: Z(80-162-286)-DICOM^TIFF.be3b767b.dcm.tif是DICOM / TIFF拉链,其中有效载荷切换在偏移侧0x80 , 0x162和0x286 。 -s选项分别提取2个有效负载,并与伪随机字节混合(此后不修复校验和)。 Mitra不会

    phpsploit:功能齐全的C2框架,通过单行PHP后门以静默方式保留在Web服务器上

    git clone https://github.com/nil0x42/phpsploit cd phpsploit/ pip3 install -r requirements.txt ./phpsploit --interactive --eval " help help " 特征 高效:超过20个插件可自动执行权限提升任务 运行命令并...

    C/C++面试题目及解答.doc

    多态类中的虚函数表是Compile-Time,还是Run-Time时建立的? 答案:虚拟函数表是在编译期就建立了,各个虚拟函数这时被组织成了一个虚拟函数的入口地址的数组.而对象的隐藏成员--虚拟函数表指针是在运行期--也就是...

    C/C++程序员面试指南.杨国祥(带详细书签).pdf

    面试题4:设置地址为0x67a9的整型变量的值为0xaa66 面试题5:评论下面这个中断函数 面试题6:评价一个代码片段 第8章 面向对象 8.1 面向对象的基本概念 面试题1:谈谈你对面向对象的认识 面试题2:面向对象的三大...

    20秋学期(1909、2003、2009-)《计算机病毒分析》在线作业.docx

    A:机器指令 B:微指令 C:汇编语言 D:机器码 答案:C 而0x52000000对应0x52这个值使用的是()字节序。 A:小端 B:大端 C:终端 D:前端 答案:A 以下那个窗口是操作和分析二进制的主要位置,也是反汇编代码所在的地方 A...

    EntityDAC_Source_V2.4.1.rar

    它提供了一个强大的框架,允许执行数据库对象到Delphi类的对象关系映射,完全支持封装,继承,多态和其他OOP功能。为了从数据库中检索数据,LINQ用作独立于数据库的查询引擎。此外,还有一个功能丰富的ORM建模工具 -...

    c++ 面试题 总结

    1.是不是一个父类写了一个virtual 函数,如果子类覆盖它的函数不加virtual ,也能实现多态? virtual修饰符会被隐形继承的。 private 也被集成,只事派生类没有访问权限而已 virtual可加可不加 子类的空间里有父类...

    整理后java开发全套达内学习笔记(含练习)

    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] ...

Global site tag (gtag.js) - Google Analytics