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.构造器调用的顺序

  1. 调用基类构造器, 逐级向上
  2. 按声明顺序调用成员的初始化方法
  3. 调用导出类构造器 

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编程思想第四版第八章总结的更多相关文章

  1. java编程思想第四版第八章习题

    第一题 package net.mindview.polymorphism; //基类-自行车 class Cycle{ } //子类-单轮车 class Unicycle extends Cycle ...

  2. java编程思想第四版中net.mindview.util包下载,及源码简单导入使用

    在java编程思想第四版中需要使用net.mindview.util包,大家可以直接到http://www.mindviewinc.com/TIJ4/CodeInstructions.html 去下载 ...

  3. 《Java编程思想第四版》附录 B 对比 C++和 Java

    <Java编程思想第四版完整中文高清版.pdf>-笔记 附录 B 对比 C++和 Java “作为一名 C++程序员,我们早已掌握了面向对象程序设计的基本概念,而且 Java 的语法无疑是 ...

  4. Java编程思想第四版勘误

    坊间传说这本书翻译得很烂,我倒觉得还好.虽然看原文更准确,但是如果在具备一定编程思维和基础.能够看出来疑问的情况下,还是看中文更快一些,而且这本书本身也不适合初学者看.当然,错误和不通顺还是有的,而且 ...

  5. Java编程思想第四版完整中文高清版.pdf

    Java编程思想第四版完整中文高清版.pdf 链接: https://pan.baidu.com/s/1vV5BHF3L-bnaG6WGurdJ_A 提取码: vigy 复制这段内容后打开百度网盘手机 ...

  6. 《Java编程思想第四版完整中文高清版.pdf》-笔记

    D.2.1 安插自己的测试代码 插入下述“显式”计时代码,对程序进行评测: long start = System.currentTimeMillis(); // 要计时的运算代码放在这儿 long ...

  7. 《Java编程思想第四版》附录 C Java 编程规则

    附录 C Java 编程规则 本附录包含了大量有用的建议,帮助大家进行低级程序设计,并提供了代码编写的一般性指导: (1) 类名首字母应该大写.字段.方法以及对象(句柄)的首字母应小写.对于所有标识符 ...

  8. java编程思想第四版第十八章总结

    一.概述 如何学习java I/O 学习I/O类库 学习I/O发展史,为什么要学习发展史呢? 因为,如果缺乏发展史,我们就会对什么时候使用哪个类,以及什么时候不该使用它们而感到迷惑. 了解nio 二. ...

  9. java编程思想第四版第九章总结

    1. 策略设计模式 参考这篇文章:http://blog.csdn.net/chenjie19891104/article/details/6396458 讲的很清楚,策略设计模式.并且举了一个例子, ...

随机推荐

  1. 前端工程师如何理解 TCP/IP 传输层协议?

    网络协议是每个前端工程师都必须要掌握的知识,TCP/IP 中有两个具有代表性的传输层协议,分别是 TCP 和 UDP,本文将介绍下这两者以及它们之间的区别. TCP/IP网络模型 计算机与网络设备要相 ...

  2. TestLink+Jenkins在Ubuntu16.04搭建集成测试环境

    序章 序1:TestLink和TestLink-API-Python-client 目前TestLink的最新版本是1.9.19 TestLink-API-Python-client支持的TestLi ...

  3. 将JSON反序列化为指定的.NET类型

    前言: 关于将JSON格式数据反序列化为指定的.NET类型数据常见的场景就是,关于网络请求获取请求成功的响应数据.本篇主要讲的的是如何通过使用Newtonsoft.Json中的JsonConvert. ...

  4. java学习-IDEA运行java程序报错

    问题1: 解决办法:依次执行如下两步   问题2: 解决办法:如下两项版本应保持一致

  5. postman-windows下newman的使用

    一.newman的安装 1.安装node.js下载https://nodejs.org/en/ C:\Users\iphauser>node -vv10.16.1C:\Users\iphause ...

  6. python学习-列表、元组和字典(三)

    学习笔记中的源码:传送门 3.1 列表和元组 3.2 不同类型变量的初始化: 数值 digital_value = 0 字符串 str_value = "" 或 str_value ...

  7. python学习-变量和简单类型(二)

    学习笔记中的源码:传送门 1.注释: 单行注释(#):多行注释("""或者''') 2.python标准数据类型:数字(numbers).字符串(string).列表(l ...

  8. ASP.NET WebApi+Vue前后端分离之允许启用跨域请求

    前言: 这段时间接手了一个新需求,将一个ASP.NET MVC项目改成前后端分离项目.前端使用Vue,后端则是使用ASP.NET WebApi.在搭建完成前后端框架后,进行接口测试时发现了一个前后端分 ...

  9. Linux Capabilities 入门教程:基础实战篇

    该系列文章总共分为三篇: Linux Capabilities 入门教程:概念篇 Linux Capabilities 入门教程:基础实战篇 待续... 上篇文章介绍了 Linux capabilit ...

  10. Mysql 索引类型+索引方法

    MYSQL索引: PRIMARY(唯一且不能为空:一张表只能有一个主键索引). INDEX(普通索引). UNIQUE(唯一性索引). FULLTEXT(全文索引:用于搜索很长一篇文章的时候,效果最好 ...