继承与多态

了解继承

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

继承层次的设计

  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. Nginx加状态监控

    安装Nginx时加上        –with-http_stub_status_module 在nginx.conf server location /nginx_status { stub_sta ...

  2. Python代码审计中一些需要重点关注的项

    SQL注入: 如果是常规没有进行预编译,或者直接使用原生的进行拼凑,那么在view的时候就需要多去观察了 [PythonSQL预编译]https://www.cnblogs.com/sevck/p/6 ...

  3. VRF实例说明

    Virtual Routing Forwarding       VPN路由转发表,也称VPN-instance(VPN实例),是PE为直接相连的site建立并维护的一个专门实体,每个site在PE上 ...

  4. python 3389爆破机

    前言: = =上学后的第一个星期假期,写了个3389爆破器 - 0x01 准备: hydra 钟馗之眼API 0x02代码: import optparse import os import requ ...

  5. Linux配置Oracle 11g自动启动

    http://www.cnblogs.com/edwardcmh/archive/2012/05/11/2495671.html 安装完毕Oracle 11g每次都得手动启动 | 停止数据库(dbst ...

  6. Linux下编译、安装php

    一.apache环境下php的安装步骤如下:[注意:编译安装php前,应先安装好apache,因为编译php时要用到apache的路径] 1. 在http://www.php.net/download ...

  7. HTTP接口开发专题三(发送http请求,调用http接口的流程)

    一.xml数据格式传输 1)构造xml参数:通过JAXB将java对象转换为xml 2)调用上一篇的http工具类的方法,发送请求到目的接口地址 3)返回的xml字符串结果,用JAXB进行解析成jav ...

  8. python拷贝目录下的文件

    #!/usr/bin/env python # Version = 3.5.2 import shutil base_dir = '/data/media/' file = '/backup/temp ...

  9. bootstrap 自定义

    在ror工程内 /app/assets/stylesheets/bootstrap_and_overrides.css.less 内覆盖内容 具体参数如下 https://github.com/twb ...

  10. Delphi 三层框架开发 服务端开发

    采用Delphi7+SQL2008 一.创建数据库和表 CREATE TABLE [dbo].[tb_Department]( [FKey] [uniqueidentifier] NOT NULL, ...