当前位置: 首页 > news >正文

【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)和左右小括号((、)&#xff0…...

概念解读|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 四足机器人 &#x1f…...

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项目的文章,当…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统

医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

docker 部署发现spring.profiles.active 问题

报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

技术栈RabbitMq的介绍和使用

目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

QT3D学习笔记——圆台、圆锥

类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...

快刀集(1): 一刀斩断视频片头广告

一刀流:用一个简单脚本,秒杀视频片头广告,还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农,平时写代码之余看看电影、补补片,是再正常不过的事。 电影嘛,要沉浸,…...

Web中间件--tomcat学习

Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...