《Java面向对象程序设计》学习笔记——第 5 章 继承与接口

​专栏:《Java面向对象程序设计》学习笔记

第 5 章 类与对象

5.1 子类与父类

有新类继承一般类视频讲解的状态和行为,并根据需要增加新的状态和行为。

由继承得到的类称为子类,被继承的类称为父类(超类)。

Java 不支持多重继承(子类只能有一个父类)。

使用关键字 extends 来声明一个类的子类。

5.2 子类的继承性

详细可见 4.10 访问权限

5.3 子类对象的构造过程

当用子类的构造方法创建一个子类的对象时,子类的构造方法总是先调用父类的某个构造方法。

也就是说,如果子类的构造方法没有明显地指明使用父类的哪个构造方法,子类就调用父类不带参数的构造方法。

5.4 成员变量的隐藏和方法重写

只要子类中声明的成员变量和父类中的成员变量同名,子类就隐藏了继承的成员变量(就是重新声明)。

子类对象可以调用从父类继承的方法操作隐藏的成员变量。

5.4.2 方法重写

子类通过重写( override )可以隐藏已继承的实例方法(方法重写也称为方法覆盖)。

方法重写是指在子类中定义一个方法,这个方法的类型和父类的方法的类型一致,或者是父类的方法的类型的子类型(所谓子类型,是指如果父类的方法的类型是“类”,那么允许子类的重写方法的类型是“子类”),并且这个方法的名字、参数个数、参数的类型和父类的方法完全相同。

子类通过方法的重写可以隐藏继承的方法,可以把父类的状态和行为改变为自身的状态和行为。

重写方法既可以操作继承的成员变量,也可以操作子类新声明的成员变量。

如果子类想使用被隐藏的方法,必须使用关键字 super。

重写的注意事项:重写父类的方法时,不可以降低方法的访问权限。

5.5 super 关键字

在子类中想使用被子类隐藏的成员变量或方法,可以使用关键字 super。

5.5.1 使用 super 调用父类的构造方法

super 必须是子类构造方法中的头一条语句。

需要注意的是,如果在子类的构造方法中,没有明显地写出 super 关键字来调用父类的某个构造方法,那么默认有:super(); 语句,即调用父类的不带参数的构造方法。

当在父类中定义多个构造方法时,应当包括一个不带参数的构造方法,以防子类省略 super 时出现错误。

5.5.2 使用 super 操作被隐藏的成员变量和方法

当 super 调用隐藏的方法时,该方法中出现的成员变量是指被隐藏的成员变量。

5.6 final 关键字

final 关键字可以修饰类、成员变量和方法中的局部变量。

5.6.1 final 类

Final 类不能被继承,即不能有子类

5.6.2 final 方法

如果用 final 修饰父类中的一个方法,那么这个方法不允许子类重写。

不允许子类隐藏可以继承的 final 方法(不许做任何篡改)。

5.6.3 常量

如果成员变量或局部变量被修饰为 final ,就是常量。

常量在声明时没有默认值,所以在声明常量时必须指定该常量的值,而且不能发生变化。

5.7 对象的上转型对象

假设 A 类是 B 类的父类,当用子类创建一个对象,并把这个对象的引用放到父类的对象中,例如:

A = a ;
a = new B() ;
或
A = a ;
B b = new B() ;
a = b ;

这时,称对象是对象 b 的上转型对象(例如说“老虎是哺乳动物”)。

对象的上转型对象的实体是子类负责创建的,但上转型对象会失去原对象的一些属性和功能。

  • 上转型对象不能操作子类新增的成员变量(失掉了这部分属性),不能调用子类新增的方法(失掉了一些功能)。
  • 上转型对象可以访问子类继承或隐藏的成员变量,也可以调用子类继承的方法或子类的重写方法。

注:

  1. 不要将父类创建的对象和子类对象的上转型对象混淆。
  2. 可以将对象的上转型对象强制转换到一个子类对象,这时,该子类对象又具备了子类的所有属性和功能。
  3. 不可以将父类创建的对象的引用赋给子类声明的对象(不能说“哺乳动物是老虎”)。
  4. 如果子类重写了父类的静态方法(方法),那么子类对象的上转型对象不能调用子类重写的静态方法,只能调用父类的静态方法。

(个人理解是,优先使用子类的成员变量和方法(除了子类新增的成员变量和新增的方法、子类重写了父类的静态方法外),之后才使用父类的成员变量和方法)

5.8 继承与多态

当一个类有很多子类,并且这些子类都重写了父类中的某个方法时,把子类创建的对象的引用放到一个父类的对象中,就得到了该对象的一个上转型对象。

这个上转型对象在调用这个方法时可能具有多种形态,因为不同的子类在重写父类的方法时可能产生不同的行为。

多态性是指父类的某个方法被其子类重写时,可以各自产生自己的功能行为。

5.9 abstract 类和方法

用关键字 abstract 修饰的类称为 abstract 类(抽象类)。

用关键字 abstract 修饰的方法称为 abstract 方法(抽象方法),对于 abstract方法,只允许声明,不允许实现,而且不允许使用 final 和 abstract 同时修饰一个方法。

5.9.1 abstract 类的特点与理解

和普通类(非 abstract 类)相比, abstract 类中可以有 abstract 方法(非 abstract 类中不可以有 abstract 方法),也可以有非 abstract 方法。

abstract 类中也可以没有 abstract 方法。

abstract 类不能用 new 运算符创建对象。

abstract 类的子类

如果一个非 abstract 类是 abstract 类的子类,它必须重写父类的 abstract 方法,即去掉abstract 方法的 abstract 修饰,并给出方法体。如果一个 abstract 类是 abstract 类的子类,它可以重写父类的 abstract 方法,也可以继承父类的 abstract 方法。

abstract 类的对象作上转型对象

可以使用 abstract 类声明对象,尽管不能使用 new 运算符创建该对象,但该对象可以成为其子类对象的上转型对象,那么该对象就可以调用子类重写的方法。

( 1) 抽象类可以抽象出重要的行为标准,该行为标准用抽象方法来表示。即抽象类封装了子类必须有的行为标准。

( 2 )抽象类声明的对象可以成为其子类的对象的上转型对象,调用子类重写的方法,即体现子类根据抽象类里的行为标准给出的具体行为。

抽象类的重要特点是,特别关心方法名字、类型以及参数,但不关心这些操作具体实现的细节,即不关心方法体。

5.9.2 abstract 类与多态

abstract 类只关心操作,不关心这些操作具体实现的细节。

使用多态进行程序设计的核心技术之一是使用上转型对象,即将 Abstract 类声明对象作为其子类的上转型对象,那么这个上转型对象就可以调用子类重写的方法。

5.10 接口

概念很多,且容易与其他的搞混淆,暂时先留着。

5.11 小结

  1. 继承是一种由己有的类创建新类的机制。利用继承可以先创建一个共有属性的一般类,再根据该一般类创建具有特殊属性的新类。
  2. 所谓子类继承父类的成员变量作为自己的一个成员变量,就像它们是在子类中直接声明一样,可以被子类中自己声明的任何实例方法操作。
  3. 所谓子类继承父类的方法作为子类中的一个方法,就像它们是在子类中直接声明一样,可以被子类中自己声明的任何实例方法调用。
  4. 多态是面向对象编程的又一重要特性。子类可以体现多态,即子类可以根据各自的需要重写父类的某个方法,子类通过方法的重写可以把父类的状态和行为改变为自身的状态和行为。接口也可以体现多态,即不同的类在实现同一接口时,可以给出不同的实现手段。
  5. 在使用多态设计程序时,要熟练地使用上转型对象或接口回调,以便体现程序设计所提倡的“开-闭”原则。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/23672.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【maven】构建项目前clean和不clean的区别

其实很简单,但是百度搜了一下,还是没人能简单说明白。 搬用之前做C项目时总结结论: 所以自己在IDE里一遍遍测试程序能否跑通的时候,不需要clean,因为反正还要改嘛。 但是这个项目测试好了,你要打成jar包给…

element-tree-line el-tree 添加结构线 添加虚线

概览:给element组件添加上虚线,通过使用插件element-tree-line 参考连接: 参考别人的博客 安装插件: # npm npm install element-tree-line -S # yarn yarn add element-tree-line -S main.js全局注册引入插件: imp…

Python批量查字典和爬取双语例句

最近,有网友反映,我的批量查字典工具换到其它的网站就不好用了。对此,我想说的是,互联网包罗万象,网站的各种设置也有所不同,并不是所有的在线字典都可以用Python爬取的。事实上,很多网站为了防…

Linux文本三剑客---grep、sed、awk

目录标题 1、grep1.1 命令格式1.2命令功能1.3命令参数1.4grep实战演练 2、sed2.1 认识sed2.2命令格式2.3常用选项options2.4地址定界2.5 编辑命令command2.6用法演示2.6.1常用选项options演示2.6.2地址界定演示2.6.3编辑命令command演示 3、awk3.1认识awk3.2常用命令选项3.3awk…

向表中随机插入字符串数据

已知表 向该表中插入指定次数的随机字符串: 代码如下: DROP PROCEDURE sc //CREATE PROCEDURE sc(num INT) BEGIN DECLARE str VARCHAR(26) DEFAULT "abcdefghijklmnopqrstuvwxyz"; DECLARE cnt INT DEFAULT 0; DECLARE startIndex INT DEFAULT 1; DE…

线程、进程的区别

线程、进程的区别 在开发中,我们经常听到线程和进程两个概念,它们都是操作系统的基本概念,操作系统以进程为基本单位分配存储器,以线程为基本单位分配CPU。虽然它们有很多相似之处,但是它们也有很大的区别。本文将详细…

msvcp120.dll丢失的解决方法(亲测可修复方的法)

在运行某些软件的时候,计算机提示msvcp120.dll丢失,无法打开运行软件。在第一次遇到这个问题的时候,相信很多人都不知道是怎么回事。下面小编把msvcp120.dll是什么以及如何解决这个问题的详细方法给大家科普一下。 问题描述: 在使…

00-Hadoop入门

Hadoop入门 Hadoop四高 1)高可靠性 Hadoop底层维护多个数据副本,所有即使hadoop某个计算元素或存储故障,也不会造成数据丢失 2)高扩展性 在集群间分配任务数据,可方便的扩展数以千计的节点 3)高效性 …

Ubuntu安装MySQL 8.0与Navicat

目录 Ubuntu安装MySQL 8.0 1、更新软件包列表 2、安装 MySQL 8.0 3、启动 MySQL 服务 5、确保MySQL服务器正在运行 5、root 用户的密码 6、登录MySQL,输入mysql密码 7、MySQL默认位置 Ubuntu安装Navicat 1、下载 Navicat 2、额外的软件包 3、执行命令 U…

周末在家值班,解决几个月前遗忘的Bug

问题: 周末被迫在家值班,无聊之际打开尘封已久的Bug清单,发现有Bug拖了几个月还没解决… 场景是这样子的,有个功能是拿Redis缓存热点数据进行展示,暂且称它为功能A,有个另外的功能B,它会去更新缓…

lifecycleScope Unresolved reference

描述 导入了lifecycle.lifecycleScope,但是在activity中使用lifecycleScope报错出现Unresolved reference找不到引用。 导包 import androidx.lifecycle.lifecycleScope使用 lifecycleScope.launch(Dispatchers.IO) {...}错误 方案 代码中的activity继承Activ…

【基于HBase和ElasticSearch构建大数据实时检索项目】

基于HBase和ElasticSearch构建大数据实时检索项目 一、项目说明二、环境搭建三、编写程序四、测试流程 一、项目说明 利用HBase存储海量数据,解决海量数据存储和实时更新查询的问题;利用ElasticSearch作为HBase索引,加快大数据集中实时查询数…

Prometheus-各种exporter

文章目录 一、 nginx-prometheus-exporter1 nginx 配置1.1 Nginx 模块支持1.2 Nginx 配置文件配置2 部署 nginx-prometheus-exporter2.1 二进制方式部署2.1.1 解压部署2.1.2 配置 systemd2.1.3 添加 prometheus 的配置2.1.4 Dashborad2.2 docker-compose 方式部署3 可配置的指标…

年薪930万,谷歌薪资大揭秘

硅谷大厂中,谷歌员工称得上是科技行业中收入最高的一些人。 据统计,谷歌工程师在2022年总薪酬中位数为279,802美元(约200万人民币),但这仅是基本工资。 如果计入股权和奖金,他们的收入甚至更高。 近来&am…

elasticSearch常见的面试题

常见的面试问题 描述使用场景 es集群架构3个节点,根据不同的服务创建不同的索引,根据日期和环境,平均每天递增60*2,大约60Gb的数据。 调优技巧 原文参考:干货 | BAT等一线大厂 Elasticsearch面试题解读 - 掘金 设计阶…

Spring源码分析

一、基本注解 1.注解总览 2.重点注解描述 ① Bean、Import 初学时,一般使用xml配置文件将Bean注册到Spring容器当中,在实际开发中,使用注解将Bean注册到Spring容器当中也是很常见的。 使用xml方式将bean注册到spring容器当中 获取bean信息…

【C语言进阶】数据的存储----浮点型篇

🍁 博客主页:江池俊的博客 💫收录专栏:C语言—探索高效编程的基石 💻 其他专栏:数据结构探索 ​💡代码仓库:江池俊的代码仓库 🎪 社区:GeekHub 🍁 如果觉得博…

在线课堂,视频点播,springboo+vue

springbootvue三端(管理后台,教师端,用户端)端可提供源码,可远程安装,需要的加微信: 体验地址:http://edu.dgrxs.com/ 用户端: 管理端: 教师端:

酷开系统 | 酷开科技,让数据变得更有价值!

身处信息时代,我们每个人时刻都在生成、传递和应用数据,数据已经成为了现代社会中宝贵的资源之一,而在人工智能领域,数据更是被称为人工智能的“燃料”。 而在AI的发展中,只有拥有高质量、多样性且充分代表性的数据集…

亚信科技AntDB数据库专家参加向量数据库首次技术标准研讨会

2023年7月19日下午,中国通信标准化协会大数据技术标准推进委员会数据库与存储工作组(CCSA TC601 WG4)联合中国信通院数据库应用创新实验室(CAICT DBL)在线上召开《向量数据库技术要求》标准首次研讨会。本次会议由中国…