Java的三大特性之一——继承
前言
http://t.csdnimg.cn/uibg3
在上一篇中我们已经讲解过封装,这里就主要讲解继承与多态
继承
1.为什么需要继承
Java中使用类对现实世界中实体来进行描述,类经过实例化之后的产物对象,则可以用来表示现实中的实体,但是现实世界错综复杂,事物之间可能会存在一些关联,那在设计程序是就需要考虑
面向对象思想中提出了继承的概念,专门用来进行共性抽取,实现代码复用
2.什么是继承
继承:是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性
的基础上进行扩展,增加新功能,这样产生新的类,称派生类。
继承呈现了面向对象程序设计的层次结构, 体现了由简单到复杂的认知过程。
继承主要解决的问题是:共性的抽取,实现代码复用
比如猫和狗都是动物,那么我们就可以进行共性的抽取实现继承

在这,Dog和Cat都继承了Animal类,其中:Animal类称为父类/基类或超类,Dog和Cat可以称为Animal的子类/派生类,继承之后,子类可以复用父类中成员,子类在实现时只需关心自己新增加的成员即可,在这之后还可以实现多态
3.如何使用继承
1.基本应用
我们先对父类进行设计
class Animals {public String name;public int age;public String color;public Animals(String name, int age, String color) {this.name = name;this.age = age;this.color = color;}public void eat() {System.out.println(this.name + "正在吃饭!");}
}
之后对子类使用extends关键字进行继承
class Dog extends Animals {public Dog() {super("xiaohei", 10, "黄色");}public void bark() {System.out.println(this.name + "正在汪汪汪!");}
}class Cat extends Animals {public Cat(){super("xiaohuang",20,"黑白");}public void mew() {System.out.println(this.name + "正在喵喵喵!");}
}
在这里我们的子类应当与父类有所不同,不然就没必要使用继承
2.子类对父类成员变量的访问
class Base {public int a = 1;public int b = 2;
}class Derived extends Base {public int a = 100;public int c = 3;public void test() {System.out.println(super.a);//调用父类的System.out.println(this.a);//调用子类的System.out.println(super.b);//调用父类System.out.println(this.b);//子类没有则调用父类的System.out.println(this.c);//子类的}
}public class Test2 {public static void main(String[] args) {Derived derived = new Derived();derived.test();}
}
如果访问的成员变量子类中有,优先访问自己的成员变量。
如果访问的成员变量子类中无,则访问父类继承下来的,如果父类也没有定义,则编译报错。
如果访问的成员变量与父类中成员变量 同名,则 优先访问自己的。
3.子类对父类成员方法的访问
class Base2 {public void testA() {System.out.println("testA()");}
}class Derived2 extends Base2 {public void testA() {System.out.println("Derived2::testA()");}public void testB() {System.out.println("testB()");}public void testC() {this.testA();//子类super.testA();//父类this.testB();//子类}
}
public class Test2 {public static void main(String[] args) {Derived2 derived2 = new Derived2();derived2.testC();}
}
通过子类对象访问父类与子类中不同名方法时,优先在子类中找,找到则访问,否则在父类中找,找到则访问,否则编译报错。
通过派生类对象访问父类与子类同名方法时,如果父类和子类同名方法的参数列表不同(重载),根据调用方法适w传递的参数选择合适的方法访问,如果没有则报错
4.super与this关键字
对于上述2.3子类对父类的访问,归根结底是super与this之间的区别
需要注意的是
1.只能在类的非静态方法中使用,用来访问非静态方法和字段
2.在构造方法中调用时,必须是构造方法的第一条语句,并且不能同时使用
this是对当前对象的访问,而super是子类对象中从父类继承下来部分成员的引用
5.子类构造方法
class Base {public Base() {System.out.println("Base()");}
}
class Derived extends Base {public Derived() {// super(); // 注意子类构造方法中默认会调用基类的无参构造方法:super(),// 用户没有写时,编译器会自动添加,而且super()必须是子类构造方法中第一条语句,System.out.println("Derived()");}
}
public class Test2 {public static void main(String[] args) {Derived d = new Derived();}
}
4.结尾
Java中不支持多继承
一般我们不希望出现超过三层的继承关系. 如果继承层 次太多, 就需要考虑对代码进行重构了
若该类被final关键字修饰则不能被继承
值得一提的是区别于组合
继承表示对象之间是is-a的关系,比如:狗是动物,猫是动物
组合表示对象之间是has-a的关系,比如:汽车
这里贴一个详解继承与组合的文章 https://www.hollischuang.com/archives/1319
如果上述内容对您有帮助,希望给个三连谢谢

相关文章:
Java的三大特性之一——继承
前言 http://t.csdnimg.cn/uibg3 在上一篇中我们已经讲解过封装,这里就主要讲解继承与多态 继承 1.为什么需要继承 Java中使用类对现实世界中实体来进行描述,类经过实例化之后的产物对象,则可以用来表示现实中的实体,但是现实…...
Java复习05 Spring 概念
Java复习05 Spring 概念 初学 Spring 的时候 我的问题是 什么是Spring? Spring的底层实现是什么?为什么现在Java都在用sping框架? 1.把Spring类比成乐高说明书 想象一下你有一个超级大的乐高积木盒子,里面有各种各样的积木。你…...
初级爬虫实战——哥伦比亚大学新闻
文章目录 发现宝藏一、 目标二、简单分析网页1. 寻找所有新闻2. 分析模块、版面和文章 三、爬取新闻1. 爬取模块2. 爬取版面3. 爬取文章 四、完整代码五、效果展示 发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不…...
【JS】深度学习JavaScript
💓 博客主页:从零开始的-CodeNinja之路 ⏩ 收录文章:【JS】深度学习JavaScript 🎉欢迎大家点赞👍评论📝收藏⭐文章 目录 一:JavaScript1.1 JavaScript是什么1.2 JS的引入方式1.3 JS变量1.4 数据类型1.5 …...
云原生相关知识
一、kubernetes 1 概述 Kubernetes(也称 k8s 或 “kube”)是一 个开源的容器编排平台,可以自动完成在部署、管理和扩展容器化应用过程中涉及的许多手动操作。 我们常说的编排的英文单词为 “Orchestration”,它常被解释…...
【多线程】有了解过 CAS 和原子操作吗?
SueWakeup 个人主页:SueWakeup 系列专栏:学习Java 个性签名:人生乏味啊,我欲令之光怪陆离 本文封面由 凯楠📷 友情赞助! 目录 前言 悲观锁和乐观锁 什么是 CAS ? 什么是原子操作? CAS 执行流…...
Linux 服务升级:Nginx 热升级 与 平滑回退
目录 一、实验 1.环境 2.Kali Linux 使用nmap扫描CentOS 3.Kali Linux 远程CentOS 4.Kali Linux 使用openvas 扫描 CentOS 5.Nginx 热升级 6.Nginx 平滑回退 二、问题 1.kill命令的信号有哪些 2.平滑升级与回退的信号 一、实验 1.环境 (1)主机…...
能降低嵌入式系统功耗的三个技术
为电池寿命设计嵌入式系统已经成为许多团队重要的设计考虑因素。优化电池寿命的能力有助于降低现场维护成本,并确保客户不需要不断更换或充电电池,从而获得良好的产品体验。 团队通常使用一些标准技术来提高电池寿命,例如将处理器置于低功耗…...
暴力快速入门强化学习
强化学习算法的基本思想(直觉) 众所周知,强化学习是能让智能体实现某个具体任务的强大算法。 强化学习的基本思想是让智能体跟环境交互,通过环境的反馈让智能体调整自己的策略,从反馈中学习,不断学习来得到…...
vue中v-if和v-show的区别
手段:v-if是动态的向DOM树内添加或者删除DOM元素;v-show是通过设置DOM元素的display样式属性控制显隐;编译过程:v-if切换有一个局部编译/卸载的过程,切换过程中合适地销毁和重建内部的事件监听和子组件;v-s…...
MATLAB绘图
现学现用,用时再学。 plot函数:有两个向量被指定为参数,plot(x,y) 会生成 y 对 x 的图形 添加轴标签和标题: 通过调用一次 plot,多个 x-y 对组参数会创建多幅图形: 在每十个数据点处放置标记: 一个窗口绘制多个图形; 可在弹窗的插入选项上添加…...
嵌入式学习-ARM-Day4
嵌入式学习-ARM-Day4 实现三个LED灯亮灭 .text .global _start _start: 使能GPIOE的外设时钟 RCC_MP_AHB4ENSETR的第[4]设置为1即可使能GPIOE时钟 LED1 LDR R0,0X50000A28 指定寄存器地址 LDR R1,[R0] 将寄存器原来的数值读取出来,保存到R1中 ORR R1,R1,#(0x…...
MySQL 中的事务和存储引擎
目录 事务的 ACID 特性 MySQL 的四种隔离机制和问题 MySQL 的四种隔离机制: MySQL 的存储引擎 InnoDB 存储引擎 MyISAM 存储引擎 Memory 存储引擎 通过 ALTER TABLE 语句更改存储引擎 在创建表时指定存储引擎 通过修改配置文件设置默认存储引擎 在数据库系…...
echarts多个折线图共用一个x轴和tooltip组件
实现效果 根据接口传来的数据,使用echarts绘制出,共用一个x轴的图表 功能:后端将所有数据传送过来,前端通过监听选中值来展示对应的图表数据 数据格式: 代码: <template><div><div clas…...
wireshark数据捕获实验简述
Wireshark是一款开源的网络协议分析工具,它可以用于捕获和分析网络数据包。是一款很受欢迎的“网络显微镜”。 实验拓扑图: 实验基础配置: 服务器: ip:172.16.1.88 mask:255.255.255.0 r1: sys sysname r1 undo info enable in…...
如何利用RunnerGo简化性能测试流程
在软件开发过程中,测试是一个重要的环节,需要投入大量时间和精力来确保应用程序或网站的质量和稳定性。但是,随着应用程序变得更加复杂和庞大,传统的测试工具在面对比较繁琐的项目时非常费时费力。这时,一些自动化测试…...
继承和深拷贝封装
继承和深拷贝封装 今日目标: 1.es5寄生组合式继承 2.es6类的继承 3.深拷贝函数封装 00-回顾 # 不同数据类型赋值时的区别: 基本数据类型,赋的就是值,相互之间不再有任何影响 引用数据类型,赋的是地址,…...
《定时执行专家》:Nircmd 的超级搭档,解锁自动化新境界
目录 Nircmd 简介 《定时执行专家》与 Nircmd 的结合 示例: 自动清理电脑垃圾: 定时发送邮件: 定时关闭电脑: 《定时执行专家》的优势: 总结: 以下是一些其他使用示例: 立即下载《定时执行专家》: Nircmd 官方网站: 更…...
Android 封装的工具类
文章目录 日志封装类-MyLog线程封装类-LocalThreadPools自定义进度条-LoadProgressbar解压缩类-ZipUtils本地数据库类-MySQLiteHelper访问webservice封装-HttpUtilsToolbar封装类-MaterialToolbar网络请求框架-OkGo网络请求框架-OkHttp 日志封装类-MyLog 是对android log的封装…...
linux下线程分离属性
linux下线程分离属性 一、线程的属性---分离属性二、线程属性设置2.1 线程创建前设置分离属性2.2 线程创建后设置分离属性 一、线程的属性—分离属性 什么是分离属性? 首先分离属性是线程的一个属性,有了分离属性的线程,不需要别的线程去接合…...
Nano-Banana快速上手指南:5分钟完成首个产品平铺图生成
Nano-Banana快速上手指南:5分钟完成首个产品平铺图生成 1. 项目简介 Nano-Banana是一款专门为产品拆解和平铺展示设计的智能图像生成工具。它能帮你快速创建专业级的产品爆炸图、部件拆解图和平铺展示图,无需任何设计基础,5分钟就能生成你的…...
BetterGI:重新定义《原神》游戏体验的开源智能辅助系统
BetterGI:重新定义《原神》游戏体验的开源智能辅助系统 【免费下载链接】better-genshin-impact 📦BetterGI 更好的原神 - 自动拾取 | 自动剧情 | 全自动钓鱼(AI) | 全自动七圣召唤 | 自动伐木 | 自动刷本 | 自动采集/挖矿/锄地 | 一条龙 | 全连音游 - …...
算法工具箱之双指针
双指针是算法中一种常用的技巧,特别适用于数组和链表类问题。它的核心思想是使用两个指针以不同的策略遍历数据结构,从而高效地解决问题。双指针常见的三种类型:(1)快慢指针:两个指针从同一…...
Intv_AI_MK11与Claude协同实战:构建多模型AI应用开发平台
Intv_AI_MK11与Claude协同实战:构建多模型AI应用开发平台 1. 混合AI模型的应用价值 在AI应用开发领域,单一模型往往难以满足复杂业务需求。就像一支足球队需要不同位置的球员配合一样,将Intv_AI_MK11与Claude等模型协同部署,能够…...
LFM2.5-1.2B-Thinking-GGUF效果展示:32K上下文下跨段落信息关联与归纳能力实测
LFM2.5-1.2B-Thinking-GGUF效果展示:32K上下文下跨段落信息关联与归纳能力实测 1. 模型核心能力展示 1.1 32K上下文处理实测 LFM2.5-1.2B-Thinking-GGUF最突出的能力是其32K超长上下文处理能力。在实际测试中,我们输入了一篇约2万字的技术文档&#x…...
OpenClaw新手避坑指南:Qwen3-14B镜像部署的5个常见失误
OpenClaw新手避坑指南:Qwen3-14B镜像部署的5个常见失误 1. 为什么需要这份避坑指南 第一次在本地部署OpenClaw对接Qwen3-14B镜像时,我踩遍了所有能想到的坑。从CUDA版本冲突到显存溢出,从端口占用到凭证失效,整个过程就像在玩&q…...
Java JDK1.9快速下载与安装指南
1. Java JDK1.9简介与下载准备 Java Development Kit(JDK)是Java开发的核心工具包,而JDK1.9作为早期版本,虽然现在已经不是主流选择,但在某些特定场景下仍然有开发者需要使用。如果你正在寻找JDK1.9的下载和安装方法&a…...
SmartX 榫卯企业云平台 + 亚信安全 DeepSecurity 企业云安全防护联合解决方案
近日,北京志凌海纳科技股份有限公司(以下简称“SmartX”)与亚信安全科技股份有限公司(以下简称“亚信安全”)携手推出企业云安全防护联合解决方案。该方案将 SmartX 榫卯企业云平台与亚信安全的专业云主机安全产品 Dee…...
好写作AI:毕业论文的“智能魔法棒”,解锁学术新境界
在学术的征途中,毕业论文如同一座巍峨的山峰,让无数攀登者既期待又畏惧。它不仅是对多年学习成果的检验,更是个人智慧与创造力的集中展现。但面对复杂的结构、严谨的逻辑、浩瀚的文献,以及那令人头疼的格式要求,你是否…...
别再纠结选哪个了!手把手教你根据项目需求选对Go框架:Gin、Kratos还是Zero?
实战指南:如何为你的Go项目精准匹配框架——Gin、Kratos与Zero深度解析 当启动一个新项目时,选择正确的框架往往决定了后续开发的顺畅程度。面对Gin、Kratos和Zero这三个主流Go框架,很多开发者会陷入选择困难。本文将带你从实际项目需求出发&…...
