`

[#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();
	...;
}

这就相当于把类型判断交给编译器去执行了。

分享到:
评论

相关推荐

    C++对象模型

    printf("第%d个虚函数地址: 0x%p -> ", i, VTable[i]); void (*f)() = (void (*)())VTable[i]; f(); } cout ; } void Test() { Base b1; Derive d1; int *VTable1 = (int *)(*(int *)&d1); int *VTable2 =...

    IT公司面试笔试题系列

    - **多态实现关键**:当父类定义了一个虚函数时,即使子类覆盖该函数时不显式地使用`virtual`关键字,多态依然可以实现。这是因为虚函数表的存在使得子类能够正确地调用相应的函数版本。 - 示例: ```c++ class ...

    SCJP考试的学习笔记

    - **八进制和十六进制表示**:在Java中,以`0`开头的整数被解释为八进制数,而十六进制数则以`0x`或`0X`开头。 - **数据类型的范围**:对于不同数据类型,其取值范围不同。例如,`char`类型用于表示单个16位Unicode...

    C++11新标准中文版

    C++11,曾被称为C++0x,是C++编程语言的一个重要版本,旨在取代之前的C++98标准及其2003年的更新版本C++03。这一新标准由ISO/IEC JTC1/SC22/WG21 C++标准委员会制定,目的是增强核心语言的功能,并扩大C++标准程序库...

    java写webapi源码-StringEncrypt-Python:StringEncrypt允许您使用随机生成的算法对字符串和文件进行加密

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

    java基础知识点67条

    - **十六进制**: 以0x开头,例如`int a = 0x3A`。 #### 24. ASCII码 - 数字0~9的ASCII码分别为48~57,这对于处理字符和数字之间的转换非常有用。 #### 25. 字符串方法 - `charAt()`方法用于获取字符串中指定索引...

    C++0x Draft Standard 20081008

    14. **多态函数指针(Polymorphic Function Pointers)**:`std::function`可以存储任何可调用对象,包括函数指针、成员函数指针和Lambda表达式。 以上只是C++0x(C++11)标准的一部分关键特性,这些改变极大地丰富...

    Tostring的多态

    在C#中,如果一个类没有显式重写`ToString()`,则会使用默认的实现,它通常返回类名加上内存地址,如`"Namespace.ClassName@0x12345678"`。对于自定义类型,这可能不是很有用,所以通常建议在自定义类型中覆盖`...

    经典Python面试题之Python基础篇.docx

    - **b**: 生成器对象 `<generator object <genexpr> at 0x7f75a5e7b800>`(需进一步迭代获取值) #### 40. 求结果 - **a**: 1 - **b**: 2 - **c**: False - **d**: True #### 41. def func(a, b=[]) 这种写法有...

    C语言学习指南语法教程

    - 十六进制:以 `0x` 或 `0X` 开头,如 `0x1A`。 ##### 3.5 变量与内存 每个变量都对应着一块内存空间,用来存储该变量的值。变量的生命周期决定了内存空间何时分配和释放。 ##### 3.6 CONST常量 `const` 关键字...

    mitra:二进制多态的生成器

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

    java基础考试题及答案.docx

    - **合法赋值**: 十六进制数以`0x`开头,后跟十六进制数字。long型变量可以通过在数值后面加上大写字母`L`来指定。 - **示例**: `long number = 0x345L;` ### 三、String操作注意事项 1. **字符串连接**: String...

    顺丰科技2019 秋招嵌入式软件开发工程师客观题合集二.docx

    面向对象编程的三大特性包括:继承、多态和封装。 #### 题目11:信号量的最小取值 - **题目解析**:本题考查信号量的概念。 - **答案解析**:正确答案为(d)-n+1。当有n个进程共享一个临界资源时,信号量的最小值取...

    0x3xi.github.io

    它支持类、继承、多态等面向对象特性。 2. **动态类型**:变量的类型是在运行时自动确定的,不需要提前声明。 3. **块和闭包**:Ruby中的块允许在函数或方法内部定义一段可执行的代码,并且可以捕获其作用域内的变量...

Global site tag (gtag.js) - Google Analytics