当前位置: 首页 > 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项目的文章,当…...

软考教材重点内容 信息安全工程师 第 4 章 网络安全体系与网络安全模型

4,1 网络安全体系的主要特征: (1)整体性。网络安全体系从全局、长远的角度实现安全保障,网络安全单元按照一定的规则,相互依赖、相互约束、相互作用而形成人机物一体化的网络安全保护方式。 (2)协同性。网络安全体系依赖于多种安全机制,通过各…...

机器学习——期末复习 重点题归纳

第一题 问题描述 现有如下数据样本: 编号色泽敲声甜度好瓜1乌黑浊响高是2浅白沉闷低否3青绿清脆中是4浅白浊响低否 (1)根据上表,给出属于对应假设空间的3个不同假设。若某种算法的归纳偏好为“适应情形尽可能少”,…...

MYSQL——数据更新

一、插入数据 1.插入完整的数据记录 在MYSQL中,使用SQL语句INSERT插入一条完整的记录,语法如下: INSERT INTO 表名 [(字段名1[,...字段名n])] VALUES (值1[...,值n]); 表名——用于指定要插入的数据的表名 字段名——用于指定需要插入数据…...

Vite 基础理解及应用

文章目录 概要Vite基础知识点1. 快速启动和热更新热更新原理 2. 基于ES模块的构建3. 对不同前端框架的支持 vite.config.js配置实例1. 基本结构2. 服务器相关配置3. 输入输出路径配置4. 打包优化配置 项目构建一、项目初始化二、项目结构理解三、CSS处理四、静态资源处理五、构…...

[JAVA]用MyBatis框架实现一个简单的数据查询操作

基于在前面几章我们已经学习了对MyBatis进行环境配置,并利用SqlSessionFactory核心接口生成了sqlSession对象对数据库进行交互,执行增删改查操作。这里我们就先来学习如何对数据进行查询的操作,具体查询操作有以下几个步骤 创建实体类创建Ma…...

CSS 样式的优先级?

在CSS中,样式的优先级决定了当多个样式规则应用于同一个元素时,哪个样式会被最终使用。以下是一些决定CSS样式优先级的规则: 就近原则: 最后应用在元素上的样式具有最高优先级。这意味着如果两个选择器都应用了相同的样式&#xf…...

Linux驱动开发快速入门——字符设备驱动(直接操作寄存器设备树版)

Linux驱动开发快速入门——字符设备驱动 前言 笔者使用开发板型号:正点原子的IMX6ULL-alpha开发板。ubuntu版本为:20.04。写此文也是以备忘为目的。 字符设备驱动 本小结将以直接操作寄存器的方式控制一个LED灯,可以通过read系统调用可以…...

数据结构《栈和队列》

文章目录 一、什么是栈?1.1 栈的模拟实现1.2 关于栈的例题 二、什么是队列?2.2 队列的模拟实现2.2 关于队列的例题 总结 提示:关于栈和队列的实现其实很简单,基本上是对之前的顺序表和链表的一种应用,代码部分也不难。…...

C# 超链接控件LinkLabel无法触发Alt快捷键

在C#中,为控件添加快捷键的方式有两种,其中一种就是Windows中较为常见的Alt快捷键,比如运行对话框,记事本菜单等。只需要按下 Alt 框号中带下划线的字母即可触发该控件的点击操作。如图所示 在C#开发中,实现类似的操作…...

JVM类加载过程-Loading

一、Class对象的生命周期 .class文件是如何加载到内存中:.class文件是ClassLoader通过IO将文件读到内存,再通过双亲委派的模式进行Loading,再Linking、以及Initializing,代码调用等一系列操作后,进行GC,组成完整的生命周期; 二、双亲委派模式(Loading的过程): 1、类…...

大型b2c网站/湖北百度推广公司

你可以使用 python 的 xlrd 库打开一个 excel 文件,然后使用 xlrd 库提供的函数获取行和列的值,修改它们,然后使用 python 的 xlwt 库将修改后的值写入新的 excel 文件中。 这是一个简单的例子,展示了如何使用 xlrd 库打开 excel …...

wordpress定时发布插件/网络推广有哪些渠道

博文内容中字符过多,拒绝显示 转载于:https://www.cnblogs.com/zhangrj9/p/9872564.html...

旅游网站建设目的/查淘宝关键词排名软件有哪些

》》》推荐阅读《《《1、性能测试学习笔记-场景设计2、性能测试的重要意义3、性能分析流程及方法4、应用系统性能调优之性能分析循序渐进学习oracle1. 需要了解数据库原理基本知识,明白行、列概念,有关系型数据库知识。2. 有环境学习数据库,如…...

怎么做微信公众号免费电影网站/百度在线识图

点击蓝色“架构文摘”关注我哟加个“星标”,每天上午 09:25,干货推送!关于RabbitMQ出身:诞生于金融行业的消息队列语言:Erlang协议:AMQP(Advanced Message Queuing Protocol 高级消息队列协议)关键词&#…...

规划馆网站建设/百度关键词工具入口

[global]netbios name HARDY #设置服务器的netbios名字server string my server #对samba服务器的描述workgroup DEBIAN_FANS #samba服务器属于哪个工作组名或域名encrypt passwords yes #密码需要加密message command /bin/sh -c xedit %s ; rm %s & #当winpo…...

工信部备案查询网址/seo网站内部优化方案

如果没配置URL重写规则的情况下,每次访问都要加上index.php,看起来是没这么美观和方便的。例如:http://test.ll00.cn/index.php/index/test/hello本文主要记录Apache、Nginx和IIS配置。Apache配置站点配置:# 将PHP可以访问的文件限…...