继承与多态

了解继承

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

继承层次的设计

  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. 枚举生成1~n的排序

    /*枚举生成1~n的排列*/ #include <iostream> #include<algorithm> #include<queue> #include< ...

  2. [Python] WeChat_Robot

    在微信中接入一个聊天机器人 1. WeChat 个人接口itchat 2. 图灵机器人 #-*- coding:utf-8 -*- import itchat import requests apiU ...

  3. Java Ant Build详解

    转载地址:http://www.cnblogs.com/wufengxyz/archive/2011/11/24/2261797.html 1,什么是antant是构建工具2,什么是构建概念到处可查到 ...

  4. LeetCode题解 #8 String to Integer (atoi)

    又是一道恶心的简单题. 一开始没想到这么多情况的,幸好LeetCode是个很人性化的oj,能让你知道你在哪个case上错了,否则一辈子都过不了. 考虑不周到只能一个个补了. 列举一下恶心的case / ...

  5. 【转】RocketMQ事务消费和顺序消费详解

    RocketMQ事务消费和顺序消费详解 转载说明:该文章纯转载,若有侵权或给原作者造成不便望告知,仅供学习参考. 一.RocketMq有3中消息类型 1.普通消费 2. 顺序消费 3.事务消费 顺序消 ...

  6. Redis 主从同步配置

    主从功能: 为了防止 Redis 磁盘损坏,导致数据丢失,Redis 提供了复制功能,将一个主数据库的数据自动同步到从数据库,防止数据丢失. 同时还可以配置一主多从来分担主压力,主只接受写的操作,将读 ...

  7. java 蓝桥杯算法提高 字串统计

    思路:这道题用HashMap来保存枚举的字串,key值保存字串-value值保存字串所出现的次数:         通过for循环并使用subString()方法枚举所有符合要求的子串maxStr记录 ...

  8. Spark之 RDD

    简介 RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象,它代表一个不可变.可分区.里面的元素可并行计算的集合. Resilien ...

  9. Android中自定义ListView实现上拉加载更多和下拉刷新

    ListView是Android中一个功能强大而且很常用的控件,在很多App中都有ListView的下拉刷新数据和上拉加载更多这个功能.这里我就简单记录一下实现过程. 实现这个功能的方法不止一个,Gi ...

  10. 【BZOJ3238】差异【后缀自动机+dp】

    题意 分析 这个题目还是很优秀的.sigma(len(Ti)+len(Tj))的值是一定的=n*(n+1)*(n-1)/2.那么关键就是求任意两个后缀的lcp的和了. 我们怎么求两个后缀的lcp?如果 ...