【Java SE 】继承 与 多态 详解
🔥博客主页🔥:【 坊钰_CSDN博客 】
欢迎各位点赞👍评论✍收藏⭐
目录
1. 继承
1.1 继承的原因
1.2 继承的概念
1.3 继承的语法
2. 子类访问父类
2.1 子类访问父类成员变量
2.1.1 子类与父类不存在同名成员变量
2.1.2 子类与父类存在同名成员变量
2.2 子类访问父类成员方法
2.2.1 子类和父类成员方法同名
3. super 关键字
3.1 子类的构造方法
3.2 super 和 this 的异同
3.3 代码的执行顺序
4. 继承方式
4.1 final 关键字
4.1.1 final 修饰成员
4.1.2 final 修饰方法
4.1.3 final 修饰类
5. 多态
5.1 多态的概念
5.2 实现多态条件
5.3 向上转型和向下转型
5.3.1 向上转型
5.3.1.1 直接赋值
5.3.1.1 方法传参
5.3.1.1 方法返回
5.3.2 向下转型
5.4. 方法的重写
5.5 实现多态性
5.6 多态的优缺点
6. 小结
1. 继承
1.1 继承的原因
Java 是一种纯面向对象的编程语言,当我们用类来描述多个实体时,那么可能有几个类之间会存在一些关系,那么在设计时就需要考虑一下
比如:学生 和 工人
我们用 Java 语言来描述
//学生类public class Student {String name; //姓名int age; //年龄float weight; //体重public void sleep() {System.out.println("睡觉......");}//学生的工作public void study() { System.out.println("在教室学习......");}}//工人类public class Worker {String name; //姓名int age; //年龄float weight; //体重public void sleep() {System.out.println("睡觉......");}//工人的工作public void work() {System.out.println("在工地工作......");}}
虽然,学生和工人的类定义出来了,但是他们类中有很多重复代码

我们想一想,如果把这些相同的共性提取出来,就可以实现代码的复用
1.2 继承的概念
一句话:继承是使代码具有复用性的手段,允许了在原有类的基础上进行扩展,添加新内容
继承好处:提取了共性,实现代码复用,那么我们可以在建一个类用来存放这些共性,就不必重复的写代码,只是需要时调用即可

1.3 继承的语法
Java 中用关键字 extends 来表示继承关系
修饰符 class 子类 extends 父类 {......
}
上述代码进行优化
//父类public class People {String name; //姓名int age; //年龄float weight; //体重public void sleep() {System.out.println("睡觉......");}}//子类---学生public class Student extends People { //继承public void study() {System.out.println("在教室学习......");}}//子类---工人public class Worker extends People { //继承public void work() {System.out.println("在工地工作......");}}
- 子类会将父类中成员变量和方法都继承到子类中
- 继承后,子类必须有新的变量或方法,否则就没有继承的必要了
2. 子类访问父类
在继承好了之后,子类就可以访问父类各种成员了
2.1 子类访问父类成员变量
2.1.1 子类与父类不存在同名成员变量
//父类public class TestClassFather {int a; //父类变量int b;}//子类public class Son extends TestClassFather {int c; //子类变量public void Fun() { //直接使用即可a = 100;b = 200;c = 300;}}
2.1.2 子类与父类存在同名成员变量
//父类public class TestClassFather {//父类变量 int a; int b;}//子类public class Son extends TestClassFather {//子类变量int b; //与子类相同int c; public void Fun() { //直接使用即可a = 100;b = 200; //优先访问自己的变量c = 300;}}
注意事项
- 子类与父类存在同名成员变量时,优先访问自己的
- 访问的成员,子类没有,那就访问父类的,如果都没有,则报错
2.2 子类访问父类成员方法
//父类public class TestClassFather {int a;int b;public void Fun() {System.out.println("哈哈");}}//子类public class Son extends TestClassFather {int c;public void method() {Fun(); //直接访问即可}}
2.2.1 子类和父类成员方法同名
//父类public class TestClassFather {int a;int b;public void Fun() {System.out.println("哈哈");}public void Fun(int a) {System.out.println("哈哈");}}//子类class Son extends TestClassFather {int c;public void Fun() {System.out.println("呵呵");}public void method() {Fun(); //访问子类Fun(10); //访问父类}}
- 同名时,优先在子类中寻找,子类没有,在去父类中寻找
- 也可根据方法的参数进行寻找,如果都没有,则报错
3. super 关键字
在编程中,可能会遇到,当子类和父类的成员变量或方法同名时,又想访问父类成员,该怎么做呢?这时,Java 提供了 super 关键字,用来在子类中访问父类的成员
//父类public class TestClassFather {int a = 10;public void Fun() {System.out.println("父类:Fun()");}}//子类class Son extends TestClassFather {int a = 20;public void Fun() {System.out.println("子类:Fun()");}public void pirnt() {System.out.println(a); //子类System.out.println(super.a); //父类Fun(); //子类super.Fun(); //父类}}
运行结果:

这就是 super 的用法
3.1 子类的构造方法
俗话说,父子父子,先有父,在有子
在执行子类构造方法时,需要先执行父类的构造方法,然后在执行子类的构造方法
public class A {public A() {System.out.println("父类构造方法......");}
}class B extends A {public B() {System.out.println("子类构造方法......");}public static void main(String[] args) {B b = new B(); }
}
运行结果:

- 若父类中无构造方法,编译器会自动添加一个无参构造方法,若果有,则不加
- 若父类定义无参或默认的构造方法,在子类构造方法中第一行,编译器会默认调用 super()
- 若父类定义有参数的构造方法,则要为子类也要显示定义构造方法,否则失败
- super 调用父类时,必须在第一行,否则报错
- super 只能在子类中出现一次,不能和 this 同时出现
3.2 super 和 this 的异同
学了 super 和 this 关键字,那他们有什么区别呢?
相同点
- 都是 Java 的关键字
- 都不能在静态方法中使用
- 在构造方法中使用时,都只能在第一行,且不能同时存在
不同点
- this 用于本类中的方法和属性的引用,而 super 用于访问父类继承下来的方法和属性、
- 调用构造方法时,this 用于调用本类的构造方法,super 用于调用父类的构造方法
- 构造方法中一定会存在 super 的调用,不写编译器自动调用,this 不写就没有
3.3 代码的执行顺序
先看下面代码,思考一下运行结果是什么?为什么?
public class A {static {System.out.println("父类静态代码块......");}{System.out.println("父类实例代码块......");}public A() {System.out.println("父类构造方法......");}
}class B extends A {static {System.out.println("子类静态代码块......");}{System.out.println("子类实例代码块......");}public B() {System.out.println("子类构造方法......");}public static void main(String[] args) {B b = new B();System.out.println("===========");B b1 = new B();}
}
运行结果

通过结果分析,总结顺序规律:
- 父类的静态代码块优先于子类的静态代码块
- 父类的实例代码块和构造代码块接着执行
- 子类的实例代码块和构造代码块接着执行
- 第二次在实例化时,父类和子类的静态代码块不在运行,他们只执行一次
4. 继承方式
Java 中的类只能单继承,不支持多继承,如果想从语法上限制继承,我们可以用 final 关键字来修饰
4.1 final 关键字
final 可以修饰 成员、类、方法
4.1.1 final 修饰成员
被 final 修饰的成员,成员的值不可以被修改
final int a = 10; //不可以被修改
4.1.2 final 修饰方法
被 final 修饰的方法,方法不可以被重写
public final void study() { //不可以被重写System.out.println("在教室学习......");
}
4.1.3 final 修饰类
被 final 修饰的类,类不可以继承
public final class A {......
}
5. 多态
5.1 多态的概念
多态就是多种形态,对于某个行为,不同对象去完成会产生不同的状态
一句话:同一种方法,不同对象对应的结果不同
5.2 实现多态条件
- 必须在继承条件下进行
- 存在子类向父类的向上转型
- 子类必须要对父类的方法进行重写
- 通过父类调用重写的方法
5.3 向上转型和向下转型
5.3.1 向上转型
子类对象当作父类对象使用
语法格式
父类类型 对象名 = new 子类类型( );
People people = new Student(); //子类对象当作父类对象
向上转型时通常有三种情况
5.3.1.1 直接赋值
People people = new Student(); //直接赋值
5.3.1.1 方法传参
public class Test {public static void Fun(People people) { //发生了向上转型people.work();}public static void main(String[] args) {Student student = new Student();Fun(student ); //方法传参时出现了向上转型}
}
5.3.1.1 方法返回
//方法返回时发生了向上转型public static People Fun(Student student) { return student;
}
5.3.2 向下转型
向下转型和向上转型相反,父类对象强转为子类对象使用
语法格式
子类类型 对象名 =(子类类型) new 父类类型( );
//强制类型转换Student student = (Student) new people();
该转型用的较少,且不安全
5.4. 方法的重写
重写:也称为覆盖,是子类对于父类的方法进行重写编写,返回值、形参都不能改变
//父类public class People {String name;int age;float weight;public People(String name, int age) {this.name = name;this.age = age;}public void work() {System.out.println(name+" 在工作......");}}//子类public class Worker extends People {public Worker(String name, int age) {super(name, age);}//对父类中的方法进行了重写public void work() { System.out.println(name+" 在工地工作......");}}
重写的规则
- 子类重写父类方法时,返回值和形参必须都一致
- 重写的方法的返回值可以不同,但前提必须有父子关系
- 子类方法的访问限制符的范围必须大于等于父类的访问限制符
- 父类方法被 static 或 private 修饰,则不能重写
前面学习了重载,那他们俩区别是?
5.5 实现多态性
//父类public class People {String name;int age;float weight;public People(String name, int age) {this.name = name;this.age = age;}public void work() {System.out.println(name+" 在工作......");}}//子类---学生public class Student extends People {public Student(String name, int age) {super(name, age);}//对父类重写public void work() {System.out.println(name+" 在教室学习......");}}//子类---工人public class Worker extends People {public Worker(String name, int age) {super(name, age);}//对父类重写public void work() {System.out.println(name+" 在工地工作......");}}//多态性的实现public class Test {public static void Fun(People people) { //传参进行向上转型people.work();}public static void main(String[] args) {People people1 = new Student("张三",20);People people2 = new Worker("工人",30);Fun(people1);Fun(people2);}
}

这就是多态性,对于同一个方法 Fun ( ) ,当我们传入不同对象时,它处理的结果不同,多态性级体现出来了
5.6 多态的优缺点
优点
- 降低了代码的圈复杂度,避免了大量的 if-else
- 使代码的可扩展性增强
缺点
- 代码运行效率降低
6. 小结
以上就是对继承和多态的了解,具体还需宝子们去实践,如果觉得该博客对你有用的话,希望一键三连,点个关注不迷路,谢谢支持 !
相关文章:
【Java SE 】继承 与 多态 详解
🔥博客主页🔥:【 坊钰_CSDN博客 】 欢迎各位点赞👍评论✍收藏⭐ 目录 1. 继承 1.1 继承的原因 1.2 继承的概念 1.3 继承的语法 2. 子类访问父类 2.1 子类访问父类成员变量 2.1.1 子类与父类不存在同名成员变量 2.1.2 子类…...
【大语言模型】ACL2024论文-16 基于地图制图的罗马尼亚自然语言推理语料库的新型课程学习方法
【大语言模型】ACL2024论文-16 基于地图制图的罗马尼亚自然语言推理语料库的新型课程学习方法 目录 文章目录 【大语言模型】ACL2024论文-16 基于地图制图的罗马尼亚自然语言推理语料库的新型课程学习方法目录摘要:研究背景:问题与挑战:如何解…...
秋招大概到此结束了
1、背景 学院本,软工,秋招只有同程,快手和网易面试,后两家kpi(因为面试就很水),秋招情况:哈啰(实习转正ing),同程测开offer。 2、走测开的原因 很…...
华为OD机试真题---字符串化繁为简
华为OD机试真题中的“字符串化繁为简”题目是一个涉及字符串处理和等效关系传递的问题。以下是对该题目的详细解析: 一、题目描述 给定一个输入字符串,字符串只可能由英文字母(a~z、A~Z)和左右小括号((、)࿰…...
概念解读|K8s/容器云/裸金属/云原生...这些都有什么区别?
随着容器技术的日渐成熟,不少企业用户都对应用系统开展了容器化改造。而在容器基础架构层面,很多运维人员都更熟悉虚拟化环境,对“容器圈”的各种概念容易混淆:容器就是 Kubernetes 吗?容器云又是什么?容器…...
初识Arkts
创建对象: 类: 类声明引入一个新类型,并定义其字段、方法和构造函数。 定义类后,可以使用关键字new创建实例 可以使用对象字面量创建实例 在以下示例中,定义了Person类,该类具有字段name和surname、构造函…...
基本的SELECT语句
1.SQL概述 SQL(Structured Query Language)是一种用于管理和操作关系数据库的编程语言。它是一种标准化的语言,用于执行各种数据库操作,包括创建、查询、插入、更新和删除数据等。 SQL语言具有简单、易学、高效的特点,…...
51c自动驾驶~合集30
我自己的原文哦~ https://blog.51cto.com/whaosoft/12086789 #跨越微小陷阱,行动更加稳健 目前四足机器人的全球市场上,市场份额最大的是哪个国家的企业?A.美国 B.中国 C.其他 波士顿动力四足机器人 云深处 绝影X30 四足机器人 …...
Python Tutor网站调试利器
概述 本文主要是推荐一个网站:Python Tutor. 网站首页写道: Online Compiler, Visual Debugger, and AI Tutor for Python, Java, C, C++, and JavaScript Python Tutor helps you do programming homework assignments in Python, Java, C, C++, and JavaScript. It contai…...
h5小游戏实现获取本机图片
h5小游戏实现获取本机图片 本文使用cocos引擎 1.1 需求 用户通过文件选择框选择图片。将图片内容转换为Cocos Creator的纹理 (cc.Texture2D),将纹理设置到 cc.SpriteFrame 并显示到节点中。 1.2 实现步骤 创建文件输入框用于获取文件 let input document.createElement(&quo…...
前端 javascript a++和++a的区别
前端 javascript a和a的区别 a 是先执行表达式后再自增,执行表达式时使用的是a的原值。a是先自增再执行表达示,执行表达式时使用的是自增后的a。 var a0 console.log(a); // 输出0 console.log(a); // 输出1var a0 console.log(a); // 输出1 console.l…...
OceanBase V4.x应用实践:如何排查表被锁问题
DBA在日常工作中常常会面临以下两种常见情况: 业务人员会提出问题:“表被锁了,导致业务受阻,请帮忙解决。” 业务人员还会反馈:“某个程序通常几秒内就能执行完毕,但现在却运行了好几分钟,不清楚…...
ctfshow-web入门-SSRF(web351-web360)
目录 1、web351 2、web352 3、web353 4、web354 5、web355 6、web356 7、web357 8、web358 9、web359 10、web360 1、web351 看到 curl_exec 函数,很典型的 SSRF 尝试使用 file 协议读文件: urlfile:///etc/passwd 成功读取到 /etc/passwd 同…...
【日常记录-Git】如何为post-checkout脚本传递参数
1. 简介 在Git中,post-checkout 钩子是一个在git checkout 或git switch命令成功执行后自动调用的脚本。该脚本不接受任何来自Git命令的直接参数,因为Git设计该钩子是为了在特定的版本控制操作后执行一些预定义的任务,而不是作为一个通用的脚…...
《机器人控制器设计与编程》考试试卷**********大学2024~2025学年第(1)学期
消除误解,课程资料逐步公开。 复习资料: Arduino-ESP32机器人控制器设计练习题汇总_arduino编程语言 题-CSDN博客 试卷样卷: 开卷考试,时间: 2024年11月16日 001 002 003 004 005 ……………………装………………………...
后台管理系统(开箱即用)
很久没有更新博客了,给大家带上一波福利吧,大佬勿扰 现在市面上流行的后台管理模板很多,若依,芋道等,可是这些框架对我们来说可能会有点重,所以我自己从0到1写了一个后台管理模板,你们使用时候可扩展性也会更高 项目主要功能: 成员管理,部门管理&#…...
5G CPE与4G CPE的主要区别有哪些
什么是CPE? CPE是Customer Premise Equipment(客户前置设备)的缩写,也可称为Customer-side Equipment、End-user Equipment或On-premises Equipment。CPE通常指的是位于用户或客户处的网络设备或终端设备,用于连接用户…...
量化交易系统开发-实时行情自动化交易-4.1.3.A股平均趋向指数(ADX)实现
19年创业做过一年的量化交易但没有成功,作为交易系统的开发人员积累了一些经验,最近想重新研究交易系统,一边整理一边写出来一些思考供大家参考,也希望跟做量化的朋友有更多的交流和合作。 接下来继续说说A股平均趋向指数实现。 …...
tcp的网络惊群问题
1. SO_REUSEPORT 可以解决epoll的惊群问题 但是,现在的 TCP Server,一般都是 多进程多路IO复用(epoll) 的并发模型,比如我们常用的 nginx 。如果使用 epoll 去监听 accept socket fd 的读事件,当有新连接建立时,所有进…...
云原生之运维监控实践-使用Prometheus与Grafana实现对Nginx和Nacos服务的监测
背景 如果你要为应用程序构建规范或用户故事,那么务必先把应用程序每个组件的监控指标考虑进来,千万不要等到项目结束或部署之前再做这件事情。——《Prometheus监控实战》 去年写了一篇在Docker环境下部署若依微服务ruoyi-cloud项目的文章,当…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...
uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
佰力博科技与您探讨热释电测量的几种方法
热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...
深入浅出Diffusion模型:从原理到实践的全方位教程
I. 引言:生成式AI的黎明 – Diffusion模型是什么? 近年来,生成式人工智能(Generative AI)领域取得了爆炸性的进展,模型能够根据简单的文本提示创作出逼真的图像、连贯的文本,乃至更多令人惊叹的…...
MFE(微前端) Module Federation:Webpack.config.js文件中每个属性的含义解释
以Module Federation 插件详为例,Webpack.config.js它可能的配置和含义如下: 前言 Module Federation 的Webpack.config.js核心配置包括: name filename(定义应用标识) remotes(引用远程模块࿰…...


