第八章 多态

    在看本章之前,我对多态的理解还停留在初级阶段.先前对多态的理解就是重载和覆盖,但还有跟深的含义:动态绑定.另一面也说明了本书的强大.哈哈,希望跟我一样还停留在重载和覆盖的理解上的朋友看看这章的原书,个人表示受益匪浅.

 

 

多态也称作动态绑定

    要理解这个概念需要了解一下c中的编译绑定.

 

    对象中会被安置某种"类型信息",以便在运行时判断对象的类型,从而调用恰当的方法。编译器一直不知道对象的类型,但是方法调用机制能找到正确的方法体,并加以调用

 

final和性能:

    Java中除static方法和final方法之外,其他所有的方法都是后期绑定。当方法被声明为final时,便关闭了动态绑定,此时编译器可以编译阶段为final方法的调用生成更高效的代码,但这种效率改观不大,所以不要出于提高性能的目的使用final,而是根据设计

 

通过使用多态产生正确的行为:

    通过多态我们可以编写只于基类打交道的代码,并且这些代码多所有导出类都可以正常运行,如:

        Shape s = new Circle(); //circle extends shape;

        s.draw(); //由于后期绑定,调用的是Circle.draw()方法

 

多态和可扩展性:

    f(BaseClass bs){;} //一个将基类作为形参的例子

    当大多数或者所有方法都遵循上述模型(将基类作为形参),而且只与基类接口通信时,这样的程序是可扩展的。因为可以从通用的基类继承出新的数据类型,而那些操纵接口的方法不需任何改动就可应用于新类。

 

多态的缺陷:

    只有普通的方法调用是多态的(非普通的:域和静态方法),如果直接访问某个域,这个访问将在编译期进行解析

        例:Father f = new Son(); //f.field;输出的是f的域值,但f.getField()输出的是Som的值。

    教训: 通常变量都是private的并且通过get获取,可以避免发生上述现象。

 

静态方法:

静态方法是与类而非对象相关联,所有Father.staticMethod()访问的是Father的方法

 

构造器:

    new一个对象时构造器的调用顺序

        1.调用基类构造器(迭代)。 //这步中可能会出现动态绑定(见本页line45:构造器内部的多态方法的行为)

        2.按声明顺序调用成员的初始化方法 //这步可能会访问父类的域,所有必须在第一步之后。

        3.调用导出类的构造器主体。

        此顺序是一个不断包装的过程

        图小圆->图小圆+小圆外的几点->图小圆+小圆外的几点+外面的圈

 

继承和清理:

    尽管通常不必执行清理动作,一旦选择要执行,销毁顺序将按照创建的逆序进行。(首先清理导出类,然后是基类,因为导出类的清理可能会调用基类的方法)

 

构造器内部的多态方法的行为:

    描述:父类和子类均有一个名为a()的方法(覆盖),并且父类构造器中调用了这个方法,那么在new一个子类时,在执行父类构造器的调用时会将调用主体绑定为子类,并调用子类的方法。

    如何避免?

        在构造器中唯一可以安全调用的方法是基类中的final或private

 

协变返回类型:

    协变:导出类中被覆盖的方法可以返回基类方法的导出类

    程序见cap8->CovariantReturn

 

RTTI(运行时类型识别):

    在Java中所有转型都会得到检查,这种在运行期间对类型进行检查的行为被称作RTTI

 

还是那样,用到的rar附件用图片的方式上传,大家下载来之后把后缀改为rar就可以使用了

http://hi.csdn.net/attachment/201105/22/0_1306070222hdz5.gif

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值