继承与多态

了解继承

继承的关系意味着子类继承了父类的实例变量和方法。
父类比较抽象,子类比较具体。

继承层次的设计

  1. 找出具有共同属性和行为的对象(用继承来防止子类中出现重复的程序代码)
  2. 设计代表共同状态与行为的类
  3. 决定子类是否需要让某项行为(也就是方法的实现)有特定不同的运行方式,即方法由子类覆盖
  4. 通过寻找使用共同行为的子类来找出更多抽象化的机会。

“是一个”与”有一个”

当一个类继承自另外一个类时,我们会说这是子类去继承父类。若你想要知道某物是否应该要继承另一物时,则可以用is-a测试来检验。
is-a测试适用在继承层次的任何地方。如果你的继承层次树设计得很好,那么多有的子类都应该通过任意个上层父类的IS-A测试。
如果类Y是继承自类X,且类Y是类Z的父类,那么Z应该能够通过IS-A X的测试。

子类能继承下来哪些东西?

4种权限:private default protected public
存取权限(access level)控制了谁可以接触什么。

public类型的成员会被继承
private类型的成员不会被继承

要点:

  • 子类是extends父类出来的
  • 子类会继承父类所有public类型的实例变量和方法,但不会继承父类所有private类型的变量和方法
  • 继承下来的方法可以被覆盖掉,但实例变量不会被覆盖掉
  • 使用is-a测试来验证继承结构的合理性
  • is-a关系是单方向的。河马是动物,但动物不一定是河马
  • 当某个方法在子类中被覆盖过,调用这个方法会调用到覆盖过的版本
  • 如果类Y是extends类X,且类Y是类Z的父类,则Z应该能通过IS-A X的测试。

继承的意义

通过设计继承的过程累积面向对象的经验值。
通过提取出一组类间共同的抽象性,能够排除掉重复的程序代码而将这个部分放在父类,如此一来,如果有共同的部分需要修改,那么就只需改一个地方,不需要动子类。

  • 避免重复的程序代码
  • 定出共同的协议

多态

多态下,引用类型与对象可以是不同的类型
运用多态时,引用类型可以是实际对象类型的父类
参数和返回类型也可以多态,如果方法参数声明为父类类型,那么在运行时可以传入任何的子类对象。

问题
你能够继承任何一个类么?就像类的成员一样如果类是私有的你就不能继承?
有三种方法可以防止某个类被作为子类
第一种是存取控制:就算类不能标记为私有的,但它还是可以不标记公有。非公有的类只能被同一个包的类作出子类。
第二种是使用final这个修饰符,这表示它是继承的末端,不能被继承
第三种是让类只拥有private的构造程序
为什么会做出标识final的类,这样有什么好处?
一般来说,不会标识final,但如果需要安全-确保方法都是你写的版本,此时就需要final
可不可以只用final去标识方法而不是用整个类
如果想防止特定的方法被覆盖,可以将该方法标识上final这个修饰符,将整个类标识为final表示没有任何的方法可以被覆盖

覆盖的规则

  • 参数必须要一样,且返回类型必须要兼容
  • 不能降低方法的存取权限:存取权限必须相同,或者更为开放。

方法的重载(overload)

重载的意义是两个方法的名称相同,但参数不同,所以重载与多态毫无关系

重载版的方法只是刚好有相同名字的不同方法,它与继承或多态无关,重载的方法与覆盖方法不一样。

  • 返回类型可以不同
  • 不能只改变返回类型
  • 可以更改存取权限

【Head First Java 读书笔记】(七)继承的更多相关文章

  1. Java 读书笔记 (七) 变量

    Java语言中, 所有的变量在使用前必须声明.声明变量的基本格式: type identifier [ =value],[,identifier [=value]...]; 声明变量的实例,有些包含了 ...

  2. think in java 读书笔记 2 —— 套接字

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

  3. Thinking In Java读书笔记--对象导论

    Thinking In Java读书笔记--对象导论[对象]服务提供者==>将对象看做一个服务提供者[程序员分类][类创造者]/[客户端程序员] [访问控制存在的原因?][1]客户端程序员无法触 ...

  4. head first java读书笔记

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

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

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

  6. think in java 读书笔记 1 ——移位

    目录 think in java 读书笔记 1 ——移位 think in java 读书笔记 2 —— 套接字 think in java 读书笔记 3 —— 数据报 在Think in Java中 ...

  7. Java基础笔记-抽象,继承,多态

    抽象类: abstract修饰 抽象方法必须定义在抽象类中,抽象类不能创建对象. 在抽象方法中可以不定义抽象方法,作用是:让该类不能建立对象. 特点是: 1.定义在抽象类中 2.方法和类都用abstr ...

  8. Java读书笔记1

    Java逍遥游记读书笔记 前言 必须先来一句,这是入门级别,高手勿喷~ 写Android的时候总有一些语句不是很理解,其实大部分是Java的内容,所以想系统的学下Java. 这本书——<Java ...

  9. java读书笔记二

    这是我的一些读书笔记: 我研究了一下面向对象: 面向对象符合人类看待事物的一般规律,对象的方法的实现细节是包装的,只有对象方法的实现者了解细节 我觉得面向过程是由过程.步骤.函数组成,过程是核心,面向 ...

  10. Effective Java读书笔记完结啦

    Effective Java是一本经典的书, 很实用的Java进阶读物, 提供了各个方面的best practices. 最近终于做完了Effective Java的读书笔记, 发布出来与大家共享. ...

随机推荐

  1. socket通信循环

    server-----------------#!/usr/bin/env python # encoding: utf-8  # Date: 2018/6/5 import socket phone ...

  2. GIL线程与进程选择

    #!/usr/bin/env python # encoding: utf-8  # Date: 2018/6/18 # 计算密集型.应该启动多进程# from multiprocessing imp ...

  3. windows administrator提升system

    最近刚好有这个需求,本想开一个super cmd,但是win10上不兼容不太好. 于是使用PsExec来提升system权限. 微软传送地址:https://docs.microsoft.com/en ...

  4. IDA Pro 权威指南学习笔记(十四) - 操纵函数

    IDA 无法定位一个函数调用,由于没有直接的方法到达函数,IDA 将无法识别它们 IDA 可能无法正确确定函数的结束部分,需要手动干预,以更正反汇编代码中的错误 如果编译器已经将函数分割到几个地址范围 ...

  5. Tkinter Entry

    Python - Tkinter输入(Entry): 用于接受用户Entry小窗口部件单行文本字符串.   用于接受用户Entry小窗口部件单行文本字符串. 如果你想显示多行文本可以编辑,那么你应该使 ...

  6. apt-get使用国内镜像源

    apt-get 1.复制原文件备份(万一弄坏源文件可恢复) sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak 2.编辑源列表文件 sudo ...

  7. [z]计算机架构中Cache的原理、设计及实现

    前言 虽然CPU主频的提升会带动系统性能的改善,但系统性能的提高不仅仅取决于CPU,还与系统架构.指令结构.信息在各个部件之间的传送速度及存储部件的存取速度等因素有关,特别是与CPU/内存之间的存取速 ...

  8. 页面生成柱状图 --- D3.js

    转载自:https://www.cnblogs.com/fastmover/p/7779660.html D3.js从入门到"放弃"指南 前言 近期略有点诸事不顺,趁略有闲余之时, ...

  9. linux下使用adb查看android手机的logcat

    root@ubuntu:/home/song# adb logcat -s VLC

  10. script放置最佳位置(转载)

    html文件是自上而下的执行方式,但引入的css和javascript的顺序有所不同,css引入执行加载时, 程序仍然往下执行,而执行到<script>脚本是则中断线程,待该script脚 ...