前言:

  封装:通过合并特征和行为创建新的数据类型。

  实现隐藏:通过将细节“私有化”,把接口和实现分离。

  多态:消除类型间的耦合关系。也称作动态绑定,后期绑定或运行时绑定。

8.1再论向上转型:

  对象既可以作为本身的类型使用,也可以作为基类的类型使用。这种做法成为向上转型。

  其代码表现就是:父类引用指向子类。

  多态允许在参数的地方使用,即参数处声明基类,用于接受基类或导出类实现。

8.2转机(主要是介绍如何实现多态)

  为了解决多态问题,在java中提供了后期绑定的方法,即在运行时根据对象的类型进行绑定。也成为动态绑定或运行时绑定。

  注:java中除了static方法和final方法,其他方法都是后期绑定。final关键字可以关闭动态绑定。

  final关键字最好根据设计来决定是否使用。千万不能通过final来提高性能,因为并不会提升性能,而且也会让程序的设计显得混乱。

  多态可以让程序员将:改变的事物与未变的事物分离开来。

  这里再次提高了试图重写基类的private方法是一种很错误的行为。

  只有普通方法的调用是多态的,静态方法不具有多态性(实际上final也没有,而且由于private隐式指向final,所以也没有)。

8.3构造器与多态

  构造器是不具有多态的,他们本质上是static方法,只不过是隐式声明。

  前面提到过:基类的构造器总是在导出类的构造过程中被调用,且按照继承层次逐渐向上调用。

  对于复杂的继承体系:

    1)调用基类的构造器

    2)按声明顺序调用成员变量的初始化方法。

    3)调用导出类的构造器本体。

  注:继承体系中,为什么这样调用?因为在导出类中要求基类是已经存在的,且基类的一切成员(public protect)都可以访问到。

  涉及到内存方面的构造过程:

    1)将分配给对象的存储空间初始化成二进制的零。

    2)调用基类构造器。

    3)按照声明的顺序调用成员的初始化方法。

    4)调用导出类的构造器主体。

  实际上构造器中,除了初始化成员外,唯一能够安全调用的方法是基类的final方法了(也适用于private方法,他们隐式为final)。

8.4协变返回类型:

  这是jdk1.5中。

  导出类的被覆盖的方法可以返回基类方法的返回类型的某种导出类型。

8.5用继承进行设计:

  实际上是表明了在继承用于设计的时候,一定要慎重,:

  继承要求在编译时就要知道确切的类型。

  用继承表达行为间的差异,并用字段表达状态上的改变。

纯继承与扩展:

  纯继承是is-a的关系:基类可以接受发送导出类的任何消息,因为二者有着完全相同的接口。我们只需要从导出类向上转型,永远不需要知道正在处理的对象的确切类型。

  实际上extends用于扩展接口,这样是一种is-like-a的关系。导出类就像一个基类,除了有着同基类相同的接口外,还有自己额外方法实现的特性。

  导出类中接口的扩展部分不能被基类访问。对于这种类型,在向上转型时的问题就在于,扩展部分不能被基类访问。

  为了解决向上转型中,无法识别扩展部分,提出了向下转型的概念。

  但是有可能出现的问题:你不知道到底要转成哪个类型。这时候就会出现运行期异常:(ClassCastException)。

  实际上在java中每一次转型都会的得到检查,称之为“运行时类型识别”(RTTI)。

  

  

  

  

java编程思想第八章多态的更多相关文章

  1. 《 Java 编程思想》CH08 多态

    在面向对象的程序设计语言中,多态是继数据抽象和继承之后的第三种基本特征. 多态通过分离做什么和怎么做,从另一个角度将接口和实现分离开来. "封装"通过合并特征和行为来创建新的数据类 ...

  2. Java编程思想学习(六) 多态

    1.Java语言的三大特性:继承.封装和多态. 继承:复用类的一种方法,可以简省很多代码: 封装:通过合并特征和行为来创建新的数据类型.[这种“数据类型”跟Java本身提供的8大“基本数据类型”的地位 ...

  3. Java编程思想学习(一)----对象导论中多态的理解

    1.1抽象过程 1)万物皆对象. 2)程序是对象的集合,他们通过发送消息来告知彼此所要求做的. 3)每个对象都有自己的由其他对象所构成的存储. 4)每个对象都拥有其类型. 5)某一特定类型的所有对象都 ...

  4. 《Java编程思想》学习笔记_多态

    多态 多态指一个行为产生多种状态,针对父类类型可接收其子类类型,最终执行的状态由具体子类确定,其不同子类可呈现出不同状态.例如人[父类]都会跑步[行为],但小孩[子类]跑步.成年人[子类]跑步.运动员 ...

  5. Java编程思想 (1~10)

    [注:此博客旨在从<Java编程思想>这本书的目录结构上来检验自己的Java基础知识,只为笔记之用] 第一章 对象导论 1.万物皆对象2.程序就是对象的集合3.每个对象都是由其它对象所构成 ...

  6. 《Java编程思想》阅读笔记一

    Java编程思想 这是一个通过对<Java编程思想>(Think in java)第四版进行阅读同时对java内容查漏补缺的系列.一些基础的知识不会被罗列出来,这里只会列出一些程序员经常会 ...

  7. 《Java编程思想》学习笔记(二)——类加载及执行顺序

    <Java编程思想>学习笔记(二)--类加载及执行顺序 (这是很久之前写的,保存在印象笔记上,今天写在博客上.) 今天看Java编程思想,看到这样一道代码 //: OrderOfIniti ...

  8. Java编程思想重点笔记(Java开发必看)

    Java编程思想重点笔记(Java开发必看)   Java编程思想,Java学习必读经典,不管是初学者还是大牛都值得一读,这里总结书中的重点知识,这些知识不仅经常出现在各大知名公司的笔试面试过程中,而 ...

  9. java编程思想-复用类总结

    今天继续读<java 编程思想>,读到了复用类一章,看到总结写的很好,现贴上来,给大家分享. 继承和组合都能从现有类型生成新类型.组合一般是将现有类型作为新类型底层实现的一部分来加以复用, ...

随机推荐

  1. 字符串哈希小结(BKDR,RK)

    前言 A:这么简单的东西,怎么现在才学?? B:别提了,还不是因为菜o(╥﹏╥)o A:那打算讲些什么东西 B:\(BKDRHash\).\(Rabin-karp\)以及简单应用 简洁 所谓字符串哈希 ...

  2. LVS/NAT 配置

    LVS/NAT 配置 实验环境 三台主机:Linux Centos 6.4 32位 调度器Director:192.168.1.160(内网IP).192.168.2.20(公网IP) HTTP真实服 ...

  3. java验证类ValidUtils

    ValidUtils.java package com.lyqc.utils; import org.apache.commons.lang.StringUtils; public class Val ...

  4. Python字符串格式转换

    转换类型 转换类型 说明 d, i 带符号十进制 b 无符号二进制 o 无符号八进制 u 无符号十进制 x 无符号十六进制(小写) X 无符号十六进制(大写) e 科学计数法表示的浮点数(小写) E ...

  5. 使用log4j2打印Log,log4j不能打印日志信息,log4j2不能打印日志信息,log4j和logj2,idea控制台信息乱码(文末)

    说来惭愧,今天就写了个"hello world",了解了一下log4j的日志. 本来是想在控制台打印个log信息,也是遇到坎坷重重,开始也没去了解log4j就来使用,log4j配置 ...

  6. linux命令:head 命令

    head 与 tail 就像它的名字一样的浅显易懂,它是用来显示开头或结尾某个数量的文字区块,head 用来显示档案的开头至标准输出中,而 tail 想当然尔就是看档案的结尾. 1.命令格式: hea ...

  7. review29

    数组流 流的源和目的地除了可以是文件外,还可以是计算机内存. 1.字节数组流 字节数组输入流ByteArrayInputStream和字节数组输出流ByteArrayOutputStream分别使用字 ...

  8. 深入剖析Redis主从复制

    [http://sofar.blog.51cto.com/353572/1413024/]   [Redis 主从复制的内部协议和机制]   一.主从概述 Redis 支持 Master-Slave( ...

  9. GIT 应用gitreview方式提交代码过程

    t status -- 是不是修改的文件 git diff (文件名) -- 看文件修改位置 git add (文件名的空格串) git commit -- 提交到本地 git stash -- 暂存 ...

  10. C#下利用正则表达式实现字符串搜索功能的方法(转)

    关键字:正则表达式.元字符.字符串.匹配: 1.正则表达式简介:正则表达式提供了功能强大.灵活而又高效的方法来处:.NET框架正则表达式并入了其他正则表达式实现的: 2.字符串搜索:正则表达式语言由两 ...