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. Python之selenium+pytesseract 实现识别验证码自动化登录脚本

    今天写自己的爆破靶场WP时候,遇到有验证码的网站除了使用pkav的工具我们同样可以通过py强大的第三方库来实现识别验证码+后台登录爆破,这里做个笔记~~~ 0x01关于selenium seleniu ...

  2. 物理机安装Kali Linux + Windows10双系统安装教程

    转自 https://www.linuxidc.com/Linux/2018-08/153429.htm 一.镜像下载: 根据需求下载自己需要的版本 从官网下载kali 2018.2 的安装包:htt ...

  3. CVE-2016-5159 利用脏牛漏洞Linux提权复现

    当前路径: /var/www 磁盘列表: / 系统信息: Linux zico 3.2.0-23-generic #36-Ubuntu SMP Tue Apr 10 20:39:51 UTC 2012 ...

  4. java学习4-面向对象(上)

    1.类和对象 修饰符可以是public.final.abstract或者完全省略这三个修饰符 类名命名规则:每个单词首字母大写,其他字母全部小写,单词与单词之间不使用分隔符 修饰符:可以省略,也可以是 ...

  5. (转)python中@property详解

    转:https://www.cnblogs.com/zhangfengxian/p/10199935.html

  6. 06 python学习笔记-常用模块(六)

    一.  模块.包 1.什么是模块? Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句,是用来组织代码的.模块能定义函数 ...

  7. 如何在Idea中编译构建Spring Framework 5.x

    如何在Idea中编译构建Spring Framework 5.x 安装配置Gradle(略) 下载源码:git clone https://github.com/spring-projects/spr ...

  8. 蓝桥杯基础练习 Huffuman树

    基础练习 Huffuman树 问题描述 Huffman树在编码中有着广泛的应用.在这里,我们只关心Huffman树的构造过程. 给出一列数{pi}={p0, p1, -, pn-1},用这列数构造Hu ...

  9. (Java) RedisUtils

    package com.vcgeek.hephaestus.utils; import org.springframework.beans.factory.annotation.Autowired; ...

  10. html中<button>标签的type

    HTML的<button>标签的type主要有三种可选值,reset.submit.button. 其中reset为重置按钮,用于清除form表单的数据:submit为提交按钮,点击后会对 ...