java编程思想第四版第八章总结
1. 多态的含义
- 面向对象的三大基本特征: 封装,继承,多态。
- 多态是干什么的?
- 多态将做什么和怎么做分离开。从另一个角度将接口是实现类分离开。
- 多态的作用
- 消除类型之间耦合的关系
- 使用多态的好处?
- 能够改善代码的组织结构,提高代码可读性
- 能够创建可扩展的程序。
2. 方法的调用
package net.mindview.polymorphism;
//乐器
class Instrument {
public void play(Note i){
System.out.println("Instrument.play() ");
}
}
//风管乐器
class Wind extends Instrument {
@Override
public void play(Note i) {
System.out.println("Wind.play() ");
}
} public class Music {
//曲调
public static void tune(Instrument i){
i.play(Note.MIDDLE_C);
} public static void main(String[] args) {
Wind wind = new Wind();
tune(wind);
}
}
分析:这里有一个行为很特殊, 就是tune方法,他传递的参数Instrument,调用的也是Instrument的play方法,那么当我在Music中传递一个wind给tune时,他会知道我要调用的方法应该是Wind总的play方法,而不是Instrument中的方法么?是的, 可以.这个过程在前期绑定的时候肯定是不知道的, 他是在后期绑定的时候知道的.
下面来说说什么是绑定?
- 绑定的概念(可以忽略,理解后面的就可以知道他是什么含义了):将一个方法调用同一个方法的主体关联起来被称作绑定。(这时书上这么定义了, 我觉得语义不通,所以不用试图理解这句话)
- 前期绑定:程序执行前,也就是在编译器进行绑定,叫做前期绑定
- 后期绑定:又称为动态绑定, 在运行时根据对象的类型进行绑定。
- java中,除了static方法和final方法(paivate方法属于是final方法)之外,都是后期绑定
- 在讨论,为什么要将一个方法定义为final的呢?
- 之前说的原因是,为了防止方法被覆盖。也就是不允许继承的子类覆盖这个方法
- 更重要的原因是:这样做可以有效地“关闭”动态绑定。或者说,告诉编译器,不需要动态绑定。
3. 什么样的程序是可扩展的?
- 让我们回到"乐器"那个例子. 在系统中再添加多个类型的乐器, tune方法是不需要修改的. 在一个设计良好的OOP程序中, 大多数方法或者所有方法都想tune方法一样,只是与基类接口通讯, 这样的程序是可扩展的.
4. 静态方法不具有多态性. 调用的时那个对象的方法,执行的就是那个对象的方法, 不会向上转型
5.构造器调用的顺序
- 调用基类构造器, 逐级向上
- 按声明顺序调用成员的初始化方法
- 调用导出类构造器
6.忠告: 编写构造器的时候, 用尽可能简单的方法是对象进入正常状态,尽量避免调用其他方法
7.协变返回类型
package net.mindview.polymorphism;
class Grain {
@Override
public String toString() {
return "Grain";
}
} class Wheat extends Grain {
@Override
public String toString() {
return "Wheat";
}
} class Mill {
Grain process(){
return new Grain();
}
} class WheatMill extends Mill {
Wheat process(){
return new Wheat();
}
} public class GovariantReturn { public static void main(String[] args) {
Mill m = new Mill();
Grain g = m.process();
System.out.println(g); WheatMill w = new WheatMill();
Wheat wh = w.process();
System.out.println(wh); } }
- 看上述代码, 理解斜边类型的含义
- 在Mill中定义的process的返回类型Grain,而WheatMill继承自Mill。在WheatMill中的方法process返回的是Wheat,而Wheat是Grain的子类, 这时被允许的。
8.纯继承
- 纯继承:如果子类具有的方法全部是父类的方法,也就是说和父类一模一样,就是is-a的关系, 即纯继承
- 非纯继承:如果子类不仅包含父类方法, 还扩展的新的方法,就是is -like-a的关系
java编程思想第四版第八章总结的更多相关文章
- java编程思想第四版第八章习题
第一题 package net.mindview.polymorphism; //基类-自行车 class Cycle{ } //子类-单轮车 class Unicycle extends Cycle ...
- java编程思想第四版中net.mindview.util包下载,及源码简单导入使用
在java编程思想第四版中需要使用net.mindview.util包,大家可以直接到http://www.mindviewinc.com/TIJ4/CodeInstructions.html 去下载 ...
- 《Java编程思想第四版》附录 B 对比 C++和 Java
<Java编程思想第四版完整中文高清版.pdf>-笔记 附录 B 对比 C++和 Java “作为一名 C++程序员,我们早已掌握了面向对象程序设计的基本概念,而且 Java 的语法无疑是 ...
- Java编程思想第四版勘误
坊间传说这本书翻译得很烂,我倒觉得还好.虽然看原文更准确,但是如果在具备一定编程思维和基础.能够看出来疑问的情况下,还是看中文更快一些,而且这本书本身也不适合初学者看.当然,错误和不通顺还是有的,而且 ...
- Java编程思想第四版完整中文高清版.pdf
Java编程思想第四版完整中文高清版.pdf 链接: https://pan.baidu.com/s/1vV5BHF3L-bnaG6WGurdJ_A 提取码: vigy 复制这段内容后打开百度网盘手机 ...
- 《Java编程思想第四版完整中文高清版.pdf》-笔记
D.2.1 安插自己的测试代码 插入下述“显式”计时代码,对程序进行评测: long start = System.currentTimeMillis(); // 要计时的运算代码放在这儿 long ...
- 《Java编程思想第四版》附录 C Java 编程规则
附录 C Java 编程规则 本附录包含了大量有用的建议,帮助大家进行低级程序设计,并提供了代码编写的一般性指导: (1) 类名首字母应该大写.字段.方法以及对象(句柄)的首字母应小写.对于所有标识符 ...
- java编程思想第四版第十八章总结
一.概述 如何学习java I/O 学习I/O类库 学习I/O发展史,为什么要学习发展史呢? 因为,如果缺乏发展史,我们就会对什么时候使用哪个类,以及什么时候不该使用它们而感到迷惑. 了解nio 二. ...
- java编程思想第四版第九章总结
1. 策略设计模式 参考这篇文章:http://blog.csdn.net/chenjie19891104/article/details/6396458 讲的很清楚,策略设计模式.并且举了一个例子, ...
随机推荐
- .gitignore实现忽略提交
- [AHOI2002]哈利·波特与魔法石
这道题比较简单,就是一个最短路(SSSP).数据水,用Floyd即可AC.这里用了Dijkstra. #include <iostream> #include <cstdio> ...
- 在idea中添加try/catch的快捷键
在idea中添加try/catch的快捷键ctrl+alt+t选中想被try/catch包围的语句,同时按下ctrl+alt+t,出现下图
- 百万年薪python之路 -- python的历史
1.python的历史 2004 Django框架诞生了 python2: 源码不统一,有重复的功能代码 python3: 源码统一,没有重复的功能 2.python是一个什么编程 ...
- Smali语言基础语法
1.Smali语言基础语法-数据类型与描述符 smali中有两类数据类型:基本类型和引用类型.引用类型是指数组和对象,其它都是基础类型. 基本类型以及每种类型的描述符: Java类型 类型描述符 说明 ...
- jupyter qtconsole 的安装
Jupyter qtconsole最近开始研究人工智能算法,发现了一款基于python的科学计算的神器,jupyter qtconsole,简直就是ipython的加强版,每个命令都直接显示帮助信息, ...
- 完美解决Python与anaconda之间的冲突问题
anaconda指的是一个开源的Python发行版本,其包含了conda.Python等180多个科学包及其依赖项.因为包含了大量的科学包,Anaconda 的下载文件比较大(约 515 MB),如果 ...
- mybatis代理机制讲解
问题描述 在使用Mybatis开发中,或者和Spring整合中,在Dao层中的Mapper接口与xml中的sql对应着,在service中直接调用Dao中的方法就可以直接访问sql.如下所示: /** ...
- nginx篇最初级用法之访问认证
1打开conf下的配置文件 在server 之下 location 之上加入 auth_basic "Input Password:"; 弹出的提示信息 auth_basic ...
- Nginx篇--最初级用法web
最近很久都没有写博客了,一来主要是时间不够每天回到家都接近晚上11点了,但是以后每天还是保证一篇随笔.好用来整理总结自己的知识. web服务器很有多例如:Apache nginx tengine li ...