1. 再论向上转型

    • 在某些方法中,仅接收基类作为参数,而不是特殊的导出类,会使得程序更容易扩展。
  2. 转机
    • 方法调用绑定

      • 前期绑定(编译期绑定):在编译期将一个方法调用和方法主体关联起来。
      • 后期绑定(动态绑定或运行时绑定):在程序运行阶段,判断对象类型,将方法调用与方法主体绑定。
      • Java中除static方法和final方法外,其他所有的方法都是后期绑定。
    • 只有非private的方法才可以被覆盖;与private重名的方法,是一个全新的方法。
    • 只有普通的方法调用时多态的。如果访问某个成员变量,则在编译期就根据对象类型确定了所访问的域是基类的还是子类的。
    • 静态的方法不具有多态性。
  3. 构造器和多态
    • 构造器调用过程

      • 调用基类构造器,这个步骤会不断重复下去,直到该层次的根,然后再依次回归。
      • 按声明顺序调用成员的初始化方法。
      • 调用导出类构造器的主体。
    • 继承与清理
      • 在覆盖基类的清理方法时,一定要先调用基类的清理方法。
    • 构造器内部的多态方法的行为
      • 如果在构造器内部调用了导出类中的方法,由于导出类还未初始化,将有可能导致运行时错误。
      • 初始化的实际过程
        • 在上述构造器调用过程之前,首先会将分配给对象的存储空间初始化为0。
      • 编写构造器的准则:用尽可能简单的方法使对象进入正常状态;如果可以的话,避免调用其他方法。
      • 在构造器内唯一能够安全调用的方法是基类中的final方法(包括private方法)。
  4. 协变返回类型
    • 表示在导出类 中的被覆盖方法可以返回基类方法的返回类型的某种导出类型。
  5. 用继承进行设计
    • 一条准则:用继承表达行为间的差异,用变量表达状态上的变化。
    • 纯继承与扩展
      • 只有在基类中已经建立的方法才可以在导出类中被覆盖,称作纯粹的"is-a"关系。基类和导出类有完全相同的接口。
      • 如果导出类中除了基类的接口,还有扩展接口,则称为"is-like-a"关系。缺陷是扩展接口无法进行向上转型。
    • 向下转型与运行时类型识别
      • 向下转型不一定是安全的,因为必须确定具体的子类对象类型,才能确定是否能够转型。比如运行时对象类型为基类,则将其转为子类时会抛出运行时异常。
      • RTTI(运行时类型识别)机制可以检查转型是否正确。如果运行时转型失败,将抛出异常。

初读"Thinking in Java"读书笔记之第八章 --- 多态的更多相关文章

  1. 初读"Thinking in Java"读书笔记之第五章 --- 初始化与清理

    用构造器确保初始化 构造器可以确保每个对象都会得到初始化,Java毁在创建对象时自动调用构造器. 构造器采用与类名相同的名称,因此并不适合"每个方法首字母小写的风格". 构造器默认 ...

  2. 初读"Thinking in Java"读书笔记之第二章 --- 一切都是对象

    用引用操纵对象 Java里一切都被视为对象,通过操纵对象的一个"引用"来操纵对象. 例如, 可以将遥控器视为引用,电视机视为对象. 创建一个引用,不一定需要有一个对象与之关联,但此 ...

  3. 初读"Thinking in Java"读书笔记之第九章 --- 接口

    抽象类和抽象方法 abstract void f();抽象方法是仅有声明而没有方法体的方法. 包含抽象方法的类叫做抽象类,如果一个类包含了一个抽象方法,则该类必须限定为抽象类. 抽象类和抽象方法可以使 ...

  4. 初读"Thinking in Java"读书笔记之第七章 --- 复用类

    组合语法 将对象引用置于新类中,即形成类的组合. 引用初始化方法 在定义处初始化. 在类的构造器中初始化. 在使用这些对象之前,进行"惰性初始化". 使用实例初始化. 继承语法 J ...

  5. 初读"Thinking in Java"读书笔记之第六章 --- 访问权限控制

    包:库单元 包内包含有一组类,他们在单一的名字空间下被组织在一起. 通过import ***.***.*可以将某个包下的所有类导入到当前文件中. 每个Java源文件最多只能有一个public类,且名称 ...

  6. 初读"Thinking in Java"读书笔记之第四章 ---控制执行流程

    true和false Java不允许将数字作为布尔值使用. 所有条件表达式都将布尔值作为判断条件,决定执行路径. if-lese 迭代 while,do-while,for为三个迭代语句. ,逗号操作 ...

  7. 初读"Thinking in Java"读书笔记之第三章 --- 操作符

    更简单的打印语句 导入自己编写的静态类库,即可使用print();打印 使用Java操作符 操作符:+,-,*,/,=,==,!=,+=,?:,%等 几乎所有操作符都只能操作"基本类型&qu ...

  8. think in java 读书笔记 3 —— 数据报

    目录 think in java 读书笔记 1 ——移位 think in java 读书笔记 2 —— 套接字 think in java 读书笔记 3 —— 数据报 概要 1. 数据报基本知识 2 ...

  9. head first java读书笔记

    head first java读书笔记 1. 基本信息 页数:689 阅读起止日期:20170104-20170215 2. 标签 Java入门 3. 价值 8分 4. 主题 使用面向对象的思路介绍J ...

随机推荐

  1. ios高级开发之多线程(二)NSThread技术

    多线程技术是有多套解决方案的,那么我们该如何选择呢? 技术方案 简介 语言 线程生命周期 使用频率 pthread 1.一套通用的多线程API 2.适用于UNIX,linux,windows等 3.跨 ...

  2. 从scratch到python——猜数游戏

    ` 之前讲解了从scratch到python,基于python turtle库的实现,讲解了用scratch和python turtle绘图的实现,以及让小猫动起来和当角色被单击的例子. 本节课讲继续 ...

  3. BeanUtils的copyproPerties方法的用法

    转自:Hassan Blog的博客 一.简介:  BeanUtils提供对Java反射和自省API的包装.其主要目的是利用反射机制对JavaBean的属性进行处理.我们知道,一个JavaBean通常包 ...

  4. React---简单实现表单点击提交插入、删除操作

    import React,{Component,Fragment} from 'react' class App extends Component { constructor(){ super() ...

  5. (简单)华为P9plus VIE-AL00的usb调试模式在哪里开启的经验

    每次我们使用pc接通安卓手机的时候,如果手机没有开启Usb调试模式,pc则没能成功检测到我们的手机,有时,我们使用的一些功能比较强的的app比如之前我们使用的一个app引号精灵,老版本就需要打开Usb ...

  6. 树中的路径和 Sum of Distances in Tree

    2019-03-28 15:25:43 问题描述: 问题求解: 写过的最好的Hard题之一. 初看本题,很经典的路径和嘛,dfs一遍肯定可以得到某个节点到其他所有节点的距离和.这种算法的时间复杂度是O ...

  7. linux批量配置ip

    获取使用的网卡接口 ip a 2.查看系统版本 cat /etc/redhat-release 3.执行配置脚本 wget  http://d.sshby.com/biaozhun.tar&& ...

  8. 【HDU - 1429】胜利大逃亡(续) (高级搜索)【状态压缩+BFS】

    Ignatius再次被魔王抓走了(搞不懂他咋这么讨魔王喜欢)…… 这次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢的某些地方安装了带锁的门,钥匙藏在地牢另外的某些地方.刚开 ...

  9. 记一次oracle数据库复制过程

    记录一次自己数据库复制的过程(从公司测试环境复制到客户测试环境),主要是每次自己都会忘记,不如记录一下,方便自己以后找,因此,本篇内容不会很详细,主要是用于给我自己提醒,相对于一种记笔记的效果. cm ...

  10. warmpserver 配置别人能访问自己的项目地址

    1.首先必须给自己的ip和域名地址给别人,绑定hosts  如:10.33.31.20 www.bai.com 2.找到apache 的  httpd.conf  . 用notepadd打开,然后找到 ...