zoukankan      html  css  js  c++  java
  • 第七章 多态

    第七章 多态

    多态是继数据抽象和继承之后的第三种基本特征。

    1.再论向上转型

      对象既可以作为它本身的类型使用,也可以作为它的基类型使用。而这种把对某个对象的引用视为对其基类型的引用的做法被称作“向上转型”。向上类型转换(小转大)。

    语法规则:<父类型> <引用变量名> = new <子类型>();

      1.此时通过父类引用变量调用的方法是子类覆盖或继承父类的方法,不是父类的方法。

      2.此时通过父类引用变量无法调用子类特有的方法。

    多态产生的原因:如果能够写一个方法,它仅接受基类作为参数,而不是哪些特殊的导出类。这样做,情况是不是会更好。

    什么叫绑定(前期绑定和动态绑定)

      将一个方法调用同一个方法主体关联起来被称作“绑定”。如果程序在执行前进行绑定,叫做前期绑定。而在运行时根据对象的类型进行绑定,则称之为动态绑定。而这也是进行向上转型的前提。在Java中除了static方法和final(private方法属于final方法)之外,其他所有的方法都是后期绑定。

    只有非private方法才可以被覆盖,但是还需要密切关注覆盖private方法的现象。

    2.抽象类和抽象方法

      仅有声明而没有方法体称之为抽象方法:abstract void f( );包含抽象方法的类叫做“抽象类”。如果一个类包含一个或多个抽象方法,该类必须被限定为抽象的。如果从一个抽象类继承,并想创建该新类的对象,那么就必须为基类中的所有抽象方法提供方法定义,如果不这样做(可以选择不做),那么导出类也是抽象类,且编译器将会强制我们用abstract关键字来限定这个类。

    3.构造器与多态

      基类的构造器总是在导出类的构造过程中被调用,而且按照继承层次逐渐向上链接,以使每个基类的构造器都能得到调用。这样做是有意义的,因为构造器具有一个特殊任务:检查对象是否被正确构造。导出类智能访问它自己的成员,不能访问基类的成员(基类的成员通常是private类型)。只有基类的构造器才具有恰当的知识和权限来对自己的元素进行初始化。因此,必须令所有构造器都得到调用,否则就不可能正确构造完整对象。

    调用构造器应遵循的循序:

    1. 在其他任何事物发生之前,将分配给对象的存储空间初始化成二进制的零。
    2. 调用基类构造器。
    3. 按照声明的顺序调用成员的初始化方法。
    4. 调用导出类的构造器主体。

      销毁对象的顺序应该和初始化顺序相反,应该首先对其导出类进行清理,然后才是基类。这是因为导出类的清理可能会调用基类的某些方法,所以需要使基类中的构件仍起作用而不应过早地销毁它们。

      在构造器内唯一能够安全调用的那些方法是基类中的final方法,(也适用于private方法,它们自动属于final方法),这些方法不能被覆盖,不会出现问题。

    4.用继承进行设计

      向上转型也有缺点:导出类中接口的扩展部分不能被基类访问,因此,一旦我们向上转型,就不能调用那些新方法,通常情况下我们需要重新查明对象的确切类型,以便能够访问该类型所扩充的方法这就是向下转型,向下转型的一般方法是在进行向上转型后,在调用方法时加上((导出类名).对象名).方法。

      在Java中,所有转型都会得到检查!所以即使我们只是进行一次普通的加括弧形式的类型转换,在进入运行期时仍然会对其进行检查,以便保证它的确是我们希望的那种类型。

  • 相关阅读:
    CF280C Game on Tree 概率与期望
    bzoj 3420: Poi2013 Triumphal arch 树形dp+二分
    bzoj 2111: [ZJOI2010]Perm 排列计数 Lucas
    bzoj 3709: [PA2014]Bohater 贪心
    bzoj 1396/2865: 识别子串 后缀自动机+线段树
    【教程】如何搭建一个自己的网站
    C#单例设计模式
    C#双缓冲代码
    Hibernate的查询功能
    hibernate事务规范写法
  • 原文地址:https://www.cnblogs.com/xiaobaidashu/p/12099002.html
Copyright © 2011-2022 走看看