第七章:继承和多态

1、 覆盖(override)

覆盖的意思是由子类重新定义继承下来的方法,以改变或延伸此方法的行为。

2、 继承(extends)

类的成员:实例变量+方法

实例变量无法覆盖是因为不需要,它们没有定义特殊的行为。

继承的关系意味着子类可以继承了父类的成员,包含实例变量和方法。

用继承可以防止子类中出现重复的程序代码。

继承调用哪个方法: 对于继承的“层次树”,java虚拟机从层次树的最下方开始找,找不到就会往上寻找直到找到为止。

IS-A:测试继承

如果类Y是继承类X,且类Y是类Z的父类,那么: Y IS-A X ;Z IS-A Y ;Z IS-A X。

3、 super:

在子类中还打算引用父类的方法然后加上额外行为。 可以做在父类中设计出所有子类都使用的功能实现,让子类可以不用完全覆盖掉父类的功能,只是再加上额外的行为,可以通过 super这个关键字取用父类。

举例:

public void roma(){

super.roma(); // 会先执行super版的roma(),然后再回来执行自定义的功能或行为

// my own roma stuff

}

4、 存取权限(access level)

继承中的存取权限: 父类可以通过存取权限决定子类是否能够继承某些特定的成员。

四种权限(限制从大到小):private、default、protected、public

存取权限控制了谁可以接触什么。

* public 类型的成员会被继承

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

当子类把成员继承下来时,会把它们当作自己定义的一样。

任一类的成员包含有:自己定义出的变量和方法+从父类继承下来的任何东西

5、 继承的意义

1) 避免了重复的程序代码

2) 定义出共同的协议 类的方法就是”共同协议“

总结:

* 子类是extends父类出来的

* 子类会继承父类所有public类型的实例变量和方法,但不会继承父类所有private类型的变量和方法

* 继承下来的方法可以被覆盖掉,但是实例变量不能被覆盖掉

* 使用 IS-A 测试来验证继承结构的合理性

* IS-A 关系是单方向的

* 当某个方法在子类下中被覆盖过,调用这个方法时,会调用覆盖过的版本。

6、 多态是如何运行的?

第一步:看一般声明引用和创建对象的方法

Dog myDog = new Dog();

1) 声明一个引用变量:

2) 创建对象

3) 连接对象和引用

重点在于引用类型和对象的类型必须相符。

第二步:在多态下,引用和对象可以是不同类型

Animal myDog = new Dog();

其中Animal 是 Dog的父类。

运用多态时,引用类型可以是实际对象类型的父类;参数和返回类型也可以多态。

什么是多态:

概念就是同一操作作用于不同对象,可以有不同解释,产生不同的执行结果。多态是一种运行期状态。

多态的必要条件:

为了实现运行期的多态,需要满足三个条件:

1)有类继承,或者接口实现

2)子类要重写父类的方法

3)父类的引用指向子类的对象

举例:

public class Parent{
public void call(){
sout("in Parent");
}
} public class Son extends Parent{ // 1.有类继承或接口实现
public void call(){ //2.子类重写父类方法
sout("in Son");
}
} public class Test{
public static void main(String[] args){
Parent p = new Son();// 3.父类的引用指向子类
}
}

关于重写:

重写是指在java的子类和父类中有两个名称、参数列表都相同的方法的情况。由于她们具有相同的方法签名,所以子类中的新方法将覆盖父类中原有的方法。

7、 你能够继承任何一个类吗?如果类的成员一样,如果类时私有的,你就不能继承?

答案:内部类还没正式介绍。除了内部类,并没有私有类这样的概念,有三种方法可以防止某个类被作出子类。

第一种:存取控制,不标记为公有。非公有类只能被同一个包的类作出子类。

第二种:final标记符号,表示它是继承树的末端,不能被继承。

第三种:让类只拥有private的构造程序(constructor)

8、 为什么会作出标识:final的类,有什么好处?

一般来说,不会标识出final,除非你需要安全。

9、 可不可以只用final去标识方法,而不使用整个类?

如果你想防止特定的方法被覆盖,可以将该方法标识上 final 这个修饰符。将整个类标识上 final 修饰符表示没有任何方法可以被继承。

10、 遵守合约:覆盖的规则

当你要覆盖父类的方法时,你就得同意履约。 方法就是合约的标识。

* 参数必须一样,且返回类型必须要兼容

子类使用的参数 = 父类使用的参数。

子类声明的返回类型或该类型的子类 = 父类声明的返回类型

* 不能降低方法的存取权限

代表存取权限必须相同,或者更开放。比如,你覆盖掉一个公有的方法并将它标记为私有,这会让它以为在编译期通过的是个公有,然后突然在执行期才被java虚拟机阻止存取。

11、 方法的重载(overload)

重载的意义:两个方法名称相同,但是参数不同。 所以重载和继承、多态毫无关系。

* 返回的类型可以不同

* 不能只改变返回类型

如果只有返回类型不同,但参数一样,这是不允许的,编译器不会让这样的事情过关。就算是重载,也要让返回类型是 父类版返回类型的子类。

* 可以更改存取权限

Head First Java学习:第七章-继承和多态的更多相关文章

  1. Java学习笔记——封装、继承和多态

    先说说封装: 用new 一条狗来举个例子: public class Dog { //私有化字段 private String name; private int age; //无参构造 Dog(){ ...

  2. “全栈2019”Java多线程第七章:等待线程死亡join()方法详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  3. “全栈2019”Java异常第七章:try-catch-finally组合方式

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...

  4. 201671010140. 2016-2017-2 《Java程序设计》java学习第六章

    java学习第六章    本周对与java中的接口,lambda表达式与内部类进行了学习,以下是我在学习中的一些体会:    1.接口: <1>.接口中的所有常量必须是public sta ...

  5. Java 学习笔记 ------第六章 继承与多态

    本章学习目标: 了解继承的目的 了解继承与多态的关系 知道如何重新定义方法 认识java.lang.object 简介垃圾回收机制 一.继承 继承是java面向对象编程技术的一块基石,因为它允许创建分 ...

  6. Java基础知识二次学习--第七章 容器

    第七章 容器   时间:2017年4月27日15:08:30 章节:07章01节~07章04节 视频长度:20:21 +12:38 +3:55 +2:57 内容:容器API 心得: Java API ...

  7. Java 学习笔记 ------第一章 Java平台概论

    本章学习目标: Java版本迁移简介 认识Java SE.Java EE.Java ME 认识JDK规范与操作 了解JVM.JRE与JDK 下载与安装JDK 一.Java版本迁移简介 书上已经表达得非 ...

  8. Thinking in Java学习杂记(5-6章)

    Java中可以通过访问控制符来控制访问权限.其中包含的类别有:public, "有好的"(无关键字), protected 以及 private.在C++中,访问指示符控制着它后面 ...

  9. 《java JDK7 学习笔记》之继承与多态

    1.面向对象中,子类继承父类,避免重复的行为定义,不过并非为了避免重复定义行为就使用继承.应该正确判断使用继承的时机及继承之后灵活的运用多态,才是学习继承时的重点. 2.程序代码重复在程序设计上,就是 ...

  10. java学习第七天

    目标 1.  复合 2.  继承 3.  重写 4.  Super 5.  final 一.类与类的关系 参考: http://www.cnblogs.com/liuling/archive/2013 ...

随机推荐

  1. 三维模型OSGB格式轻量化纹理压缩关键技术分析

    三维模型OSGB格式轻量化纹理压缩关键技术分析 在三维模型应用中,纹理是一个十分重要的因素,可以使得模型更加真实.精细.随着移动设备和网络传输速度的限制,纹理数据也需要进行轻量化处理,而OSGB格式纹 ...

  2. 苹果MacOS系统傻瓜式本地部署AI绘画Stable Diffusion教程

    Stable Diffusion的部署对小白来说非常麻烦,特别是又不懂技术的人.今天分享两个一键傻瓜式安装包,对小白来说非常有用.下面两个任选一个安装就可以. 一.DiffusionBee 简单介绍 ...

  3. 我愿称之为"温水煮青蛙"

    前言:作为开发在工作中如何将自己一点一点放弃. 事情是这样的,来新公司已经差不多三个多月了,公司的主要技术栈大部分还是jquer 这让我非常的头疼,不是说做不了这个技术,其实用过jquer 都知道这玩 ...

  4. C++算法之旅、04 基础篇 | 第一章

    常用代码模板1--基础算法 - AcWing ios::sync_with_stdio(false) 提高 cin 读取速度,副作用是不能使用 scanf 数据输入规模大于一百万建议用scanf 快速 ...

  5. nmcli 命令设置网络

    nmcli 命令设置网络 设置静态 IP 地址 sudo nmcli connection modify "连接名称" ipv4.addresses IP地址/子网掩码 设置网关 ...

  6. PC首页资源加载速度由8s降到2s的优化实践

    随着需求的不断开发,前端项目不断膨胀,业务提出:你们的首页加载也太慢啦,我都需要7.8秒才能看到内容,于是乎主管就让我联合后端开启优化专项,目标是3s内展示完全首页的内容. 性能指标 开启优化时,我们 ...

  7. 解密Linux中的通用块层:加速存储系统,提升系统性能

    通用块层 通用块层是Linux中的一个重要组件,用于管理不同块设备的统一接口,减少不同块设备的差异带来的影响.它位于文件系统和磁盘驱动之间,类似于Java中的适配器模式,让我们无需关注底层实现,只需提 ...

  8. OCI云主机环境如何上传下载文件

    OCI云主机的连接是使用密钥而非用户密码连接. 之前使用的非主流的一个SSH工具,正常连接主机都没问题,但需要手工输入用户. 可是在选择SFTP时,始终找不到用户名的设置,导致密钥连接的SFTP始终失 ...

  9. Docker Swarm + Harbor + Portainer 打造高可用,高伸缩,集群自动化部署,更新。

    Docker Swarm是Docker官方自带的容器编排工具,Swarm,Compose,Machine合称Docker三剑客.Docker Swarm对于中小型应用来说,还是比较方便,灵活,当然K8 ...

  10. 入门篇-其之四-字符串String的简单使用

    什么是字符串? 在Java编程语言中,字符串用于表示文本数据. 字符串(String)属于引用数据类型,根据String的源码,其头部使用class进行修饰,属于类,即引用数据类型. 字符串的表示 字 ...