Java 继承与实现

news2025/1/31 2:53:19

一、继承(extends)

1.1 继承概念

继承是面向对象的基本特征,它允许子类继承父类的特征和行为,以提高代码的复用率和维护性等。下面一张图生动地展示了继承和类之间的关系:

继承图

上图中,“动物”、“食草动物”、“食肉动物”以及各种具体的动物类型,都相当于 Java 中的类,而它们之间的“父子”关系就是继承,每一种具体动物类型的实际个体就是对象,或者说是类的实例。

Java 中继承通过 extends 关键字来声明:

class Father {}

class Son extends Father {}

1.2 继承模式

一般来说,面向对象编程语言应该有四种继承模式,但 Java 中只有三种继承模式:单继承、多重继承和多态。某些面向对象语言还具有多继承的继承模式,如 Python。下面一张图生动地展示了四种继承模式的区别。

继承模式(图片来源于菜鸟教程 www.runoob.com)

上图中“不同类继承同一个类”指的就是多态。

1.3 this 关键字

this 关键字从字面意思上面看,是这个的意思,在类中就代表这个类的实例对象本身(并非类本身),这是为了方便调用对象的一些属性和方法而设定。关于 this 这个名称的由来,实际 this 是从 C++ 借鉴而来的,C++ 面向对象中的 this 关键字和 Java 中的 this 关键字有近乎相同的含义。其他的面向对象编程语言也有类似的,但并不是都作为关键字,如 Python 中,拥有类似功能的是一个约定名称为 self 的特殊参数。

我们可以通过 this 关键字来访问该类本身:

class Son {
    Integer age = 6;
    
    void printAge (){
        System.out.println(this.age); // Output: 6
    }
}

1.4 super 关键字

既然有 this 代表本身,就有代表其父类的关键字,那便是 super 了。super 关键字和 this 在范围定义上略有不同,this 代表实例,而 super 代表的是类,且是该类的父类,但并不是指它的某一个具体父类,而是其所有父类的一种合体。

比如说,GrandSon -> Son -> Father,那么对于 GrandSon 而言,this 就表示 GrandSon 的实例对象,而 super 代表 Son 和 Father 的一种合体。你可以认为 super 是一个同时包含 Son 和 Father 的属性及方法的特殊类。

关于 super 关键字名称的由来,实际上,父类更加标准的说法是超类,但是“父子”关系更容易说明继承的关系,所以我们一般会将超类称为父类,但实际上,super 正是超级的含义,意为一种超级的类,即子类的所有父类集合体。其他的编程语言中,也几乎都是用 super 来表示的。

我们可以通过 super 关键字来访问父类:

class Father {
    Integer age = 66;
}

class Son extends Father {
    Integer age = 6;

    void printAge (){
        System.out.println(this.age); // Output: 6
        System.out.println(super.age); // Output: 66
    }
}

1.5 final 关键字

final 关键字已在其他文章详述,此处不再赘述,详情请见:Java 中的关键字 final 和 static-CSDN博客

1.6 多态

多态是同一个行为具有多个不同表现形式或形态的能力,说简单点,就是“多种形态”。当一个方法有多种不同的实现方式时,或者一个抽象类/接口,有多种不同的实现类时,即为多态。举个贴近日常生活的例子,一支笔(抽象类型),我们不指定它的具体类型,可以用来书写(抽象方法),我们不指定它的具体书写效果,则有很多东西都是属于这支笔的分类,比如不同颜色的黑笔、红笔、蓝笔等实现了不同颜色的效果,是多种形态,那么这就属于多态。前面说的属于从方法角度来讨论的,也可以从类型的角度来考虑,比如毛笔、铅笔、钢笔等,都是笔,但它们并不完全相同。

使用多态有很多好处:

  • 消除类型之间的耦合关系;
  • 可替换性;
  • 可扩充性;
  • 灵活性;

一个面向对象程序要拥有良好的结构,那么多态几乎是必不可少的。那么,Java 中的多态是怎么实现的呢?

Java 中实现多态的方式一般有三种:

  • 重写:通过重写子类中的方法来实现同一方法名,不同功能的效果,实现多态;
  • 接口:一个接口,多种不同的实现,即为多态;
  • 抽象类和抽象方法:和接口类似,一个抽象类或者抽象方法,多个不同的子类继承后就有多种不同的实现,也能实现多态;

二、实现(implements)

实现不同于继承,继承是相对于类而言的,实现却是相对于接口而言的,实现的方式比继承多一种,即实现可以“多实现”。所有的面向对象语言都有继承的概念,但并非所有的面向对象语言都有实现的概念,因为只有部分语言拥有真正意义上的接口,如 Java 和 C#。

实现通过 inplements 关键字来声明:

interface Father1 {}

interface Father2 {}

class Son implements Father1, Father2 {}

接口可以被类实现,但接口本身却不可以被接口实现。也就是说,类既可以继承类,也可以实现接口,但接口只能继承接口,具体情形如下图:

类和接口、继承和实现

上图中,多条线的地方表示可以”多继承“,但并非真正的多继承。具体可见下面的示例:

interface interface1 {}
interface interface2 {}
interface interface3 extends interface1, interface2 {} // 多“继承”

class class1 {}
class class2 extends class1 {} // 继承

class class3 implements interface1, interface2 {} // 多实现

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

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

相关文章

【Vue面试题二十一】、Vue中的过滤器了解吗?过滤器的应用场景有哪些?

文章底部有个人公众号:热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享? 踩过的坑没必要让别人在再踩,自己复盘也能加深记忆。利己利人、所谓双赢。 面试官:Vue中的过滤器了解吗&am…

成为数据分析师要具备什么能力——功法篇(上)

这篇文章适合做了一段时间数据分析工作,开始思考怎么继续提升自己的分析师、运营或者是实习了一段时间的同学,这时的你也许会想几个问题: 为什么我做出来的分析总觉得没有别人的那么高级? 老板为什么总说我的分析“太浅了”&#…

spyder切换conda环境(成功测试)

今天第一次把这个anaconda中配套的spyder的切换环境尝试成功了,特地记录一下 首先明确一点我使用的最新的anaconda的版本是 spyder已经是版本5了,之前的4版本总是出现各种错误 Step1 切换python interpreter 环境是可以直接识别的,不需要…

2023-2024-1 for循环-1(15-38)

7-15 输出闰年 输出21世纪中截止某个年份以来的所有闰年年份。注意:闰年的判别条件是该年年份能被4整除但不能被100整除、或者能被400整除。 输入格式: 输入在一行中给出21世纪的某个截止年份。 输出格式: 逐行输出满足条件的所有闰年年份,即每个年…

华为端到端战略管理体系(DSTE开发战略到执行)的运作日历图/逻辑图及DSTE三大子流程介绍

华为端到端战略管理体系(DSTE开发战略到执行)的运作日历图/逻辑图及DSTE三大子流程介绍 本文作者 | 谢宁,《华为战略管理法:DSTE实战体系》、《智慧研发管理》作者 添加图片注释,不超过 140 字(可选&#…

【VASP】KPOINTS文件介绍

【VASP】KPOINTS文件介绍 一、KPOINTS 的两种结构第一种结构:(非对称)第二种结构:(高对称) 二、关于KPOINTS设置的一些经验三、KPOINTS的选取 前言 一、4个常用的输入文件INCAR、POSCAR、POTCAR、KPOINTS I…

MySQL [基础]] 学习笔记

MySQL 学习 文章目录 MySQL 学习1. 数据库三层结构2. 数据在数据库中的存储方式3. SQL 语句分类3.1 备份恢复数据库的表 4. Mysql 常用数据类型(列类型)4.1 数值型(整数)的基本使用4.2 数值型(bit)的使用4.3 数值型(小数)的基本使用4.4 字符串的基本使用(面试题)4.5 字符串使用…

基于springboot实现心灵治愈心理健康平台系统项目【项目源码+论文说明】

基于springboot实现心灵心理健康平台系统演示 摘要 本论文主要论述了如何使用JAVA语言开发一个心灵治愈交流平台 ,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发。在引言中,作者将论…

Linux友人帐之编译器gcc/g++的使用

一、程序的翻译过程 在C语言中,我们已经学过程序的编译和链接,在这里将复习一下我们之前所学的内容并引出后续gcc/g的内容。 1.1程序的翻译过程 预处理(头文件展开,去注释,宏替换,条件编译)编…

解决:由于找不到 VCRUNTIME140_.dll,无法继续执行代码。重新安装程序可能会解决此问题

最近我在安装一个软件时,遇到过这样的问题“由于找不到 VCRUNTIME140 1.dll,无法继续执行代码。重新安装程序可能会解决此问题”。 要解决这个问题,你可以按照以下步骤进行操作: 1. 重新安装程序: 尝试重新安装使用…

Java NIO模型(提供代码示例)

目录 一、NIO特点介绍二、NIO代码实现2.1、客户端代码2.2、服务端代码 一、NIO特点介绍 NIO全称 java non-blocking IO。从JDK 1.4开始,java提供了一些列改进的输入/输出(I/O)的新特性,被称为NIO,是同步非阻塞的&…

蓝桥杯 常用STL (C++) 未完待续

动态数组 有些时候想开一个数组,但是却不知道应该开多大长度的数组合适,因为我们需要用到的数组可能会根据情况变动。 这时候我们就需要用到动态数组。所谓动态数组,也就是不定长数组,数组的长度是可以根据我们的需要动态改变的。…

Python数据类型转换

举例:使用Python实现超市的收银系统 name input(‘请输入您要购买商品名称:’) id input(‘请输入您要购买商品编号:’) price input(‘请输入您要购买的商品价格:’) print(f’您购买了{name},商品编号为{id}&am…

《Deep Residual Learning for Image Recognition》阅读笔记

论文标题 《Deep Residual Learning for Image Recognition》 撑起CV界半边天的论文Residual :主要思想,残差。 作者 何恺明,超级大佬。微软亚研院属实是人才辈出的地方。 初读 摘要 提问题: 更深层次的神经网络更难训练。 …

关于unaipp生成的vue3项目开启微信云函数所遇到的问题

使用uniapp创建的vue3项目,需要用到H5静态页面跳转小程序的时候(具体操作看微信开发文档:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/guide/staticstorage/jump-miniprogram.html),会用到微信开发者工…

Linux基本配置与用户创建

文章目录 一.Linux的配置二.Linux用户的创建 一.Linux的配置 Linux是一款类UNIX的操作系统,一般指的是Linux内核加GUN套件。Linux系统稳定,而且是开源软件,应用范围很广,很受欢迎。为了能学习Linux我们需要配置一个Linux系统&…

LeetCode讲解篇之198. 打家劫舍

LeetCode讲解篇之198. 打家劫舍 文章目录 LeetCode讲解篇之198. 打家劫舍题目描述题解思路题解代码 题目描述 题解思路 该问题可以通过递推来完成 递推公式: 前n间房的最大金额 max(前n-1间房的最大金额, 前n-2间房的最大金额第n-1间房的最…

蓝桥杯双周赛算法心得——三带一(暴力枚举)

大家好,我是晴天学长,枚举思想,需要的小伙伴可以关注支持一下哦!后续会继续更新的。 1) .三带一 2) .算法思路 1.通过Scanner读取输入的整数n,表示接下来有n个字符串需要处理。 2.使用循环遍历每个字符串:…

2023版 STM32实战10 内部Flash读写

简介和注意事项 -1-STM32内部提供了闪存区域,用来存储用户代码和自定义数据 -2-F1系列的写入最少两字节(半字) -3-每个地址存8位数据 -4-写入之前需要解锁,写完需要上锁 -5-读取不需要解锁 存储器分布 以下三张图可清楚的…

SLAM从入门到精通(bresenham绘制算法)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 前面我们说过,学术界和工业界对于slam的要求是不一样的。前者要求robot在运动的过程中,同步实现定位和制图的操作。但是工业…