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

java基础(5)继承与多态

4480802ac4a84437adcb9e39c4427f32.jpeg


目录

​编辑

1.前言

2.正文

2.1继承

2.1.1继承概念

2.1.2继承语法

2.1.3子类访问父类

2.1.4super关键字

2.2多态

2.2.1多态概念

2.2.2多态条件

2.2.3重写

2.2.4向上转型与向下转型

2.2.5为什么要使用多态

3.小结


1.前言

哈喽大家好啊,今天继续来为大家分享java基础语法的学习,今天分享的是java中的继承与多态,也是Java基础学习当中非常重要的一部分,话不多说让我们开始吧。

2.正文

2.1继承

2.1.1继承概念

先让我们来引入一下继承,当我们在java编写程序的时候,会创建许多个类,如果每个类都单独创建的话,会使代码看起来非常的冗长,于是对于有相同特点的类,我们对其进行共性的抽取,便有了继承的概念。

b6ab0b961d164eedbc14ba240f0fe0eb.png

继承是一种面向对象编程(OOP)的核心概念,它允许一个类(称为子类或派生类)继承另一个类(称为父类或基类)的属性和方法。使用继承可以创建一个层次结构,其中子类继承父类的属性和方法,并且可以添加或覆盖它们。 

2.1.2继承语法

那么继承的语法是如何实现的呢。这里我们就需要运用extends关键字,具体例子参照上面那个图,让我们附上代码。

person父类:

public class person {String name;int age;public person(String name,int age) {this.name = name;this.age = age;}public void func(){System.out.println("目前在学校");}
}

student子类:

public class student extends person {int id;public student(String name, int age, int id) {super(name, age);this.id = id;}public void havaClass() {System.out.println("在听课");}
}

teacher子类:

public class teacher extends person{String subject;public teacher(String name, int age, String subject) {super(name, age);this.subject = subject;}public void makeClass() {System.out.println("在上课");}
}

测试类: 

public class test {public static void main(String[] args) {student s1 = new student("张三",16,001);teacher t1 = new teacher("李四",42,"语文");s1.havaClass();s1.func();t1.func();t1.makeClass();}
}

 运行结果如图:

12ac4fcd05ca4f5ea63b7bb349fc0089.png

2.1.3子类访问父类

让我们先来观察下面这段代码:

public class test {static public class A{int a = 1;}static public class B extends A{int a = 2;int b = 3;}public static void main(String[] args) {B b = new B();System.out.println(b.a);System.out.println(b.b);}
}

我们可以看到,在类A与类B中均对a整型进行了定义,那么打印的结果会是怎样呢?

353b88cd56704936a64c47f0a531d678.png

我们可以看到,打印的是子类定义的a与b而非父类中的定义。那如果我们将类B中的int a删除呢?

7f165ca5675a41c09c6743d3a860b8c2.png

这里打印出来的就是父类中定义的a和子类中定义的b,如果我们再将父类A中的int a删除呢,很显然编译器直接报错,由此我们可以得出:

  • 如果访问的成员变量子类中有,优先访问自己的成员变量。
  • 如果访问的成员变量子类中无,则访问父类继承下来的,如果父类也没有定义,则编译报错。

同理,访问成员方法也是这个道理:

  • 如果一个方法子类中定义就优先子类,子类中没有就去父类里面,父类也没有编译器就报错。
  • 如果父类和子类同名方法的参数列表不同(重载),根据调用方法适传递的参数选择合适的方法访问,如果没有则报错

2.1.4super关键字

学到这里,我们已经基本明白了如何通过子类访问父类,但如果我们遇到,子类与父类存在变量名相同的情况,此时想访问父类里的同名变量时如何更好的去访问呢?这里我们就引入了super关键字。

super关键字可以访问父类的成员变量,构造方法以及成员方法,下面这段代码将都展示出来:

成员变量:

public class A{int a = 1;}
public class B extends A{public void func() {System.out.println(super.a);}
}

构造方法:

public class A{int num;public A(int num) {this.num = num;}}
public class B extends A{String str ;public B(int num, String str) {super(num);this.str = str;}
}

成员方法:

public class test {public static class A {public void func() {System.out.println(1);}}public static class B extends A {public void func() {super.func();}}public static void main(String[] args) {B b = new B();b.func();  }
}

 e741410d343f42269791c3583b037076.png

另外有一些需要注意的点:

  • 用户没有写构造方法时,编译器会自动添加,而且super()必须是子类构造方法中第一条语句。
  • 当子类继承父类需要先初始化继承过来的父类的成员,此时需要通过super来完成。如果没有通过super调用父类的构造方法,编译器会报错。
  • 只能在类的非静态方法中使用,用来访问非静态成员方法和字段。
  • 在java中不支持多继承,若在写代码过程中想要限制多层继承,可以使用final关键字。

 2.1.5final关键字

final关键字可以用于类,变量,方法上,接下来附上代码方便理解

当修饰类时,该类则不能被继承:

public class test {public static final class A {public void func() {System.out.println(1);}}public static class B extends A {@Overridepublic void func() {super.func();  // 调用父类的func方法System.out.println(2);}}public static void main(String[] args) {B b = new B();b.func();  // 调用b的func方法}
}

5674e63236fb4411845fee4c2db9bfd7.png

当修饰方法时,该方法仅能被调用与继承,而并不能被重写:

public class test {public static class A {public final void func() {System.out.println(1);}}public static class B extends A {@Overridepublic void func() {super.func();  // 调用父类的func方法System.out.println(2);}}public static void main(String[] args) {B b = new B();b.func();  // 调用b的func方法}
}

aa5187a42d28418e8f616ee55a36c23f.png

当修饰变量时,该变量则不能被修改:

public static void main(String[] args) {final int a = 10;a = 20;
}

 c52166ed136c4166b2cd296ea619bf20.png

2.2多态

2.2.1多态概念

让我们先引入多态这个概念,当我们在书写代码时创建多个类时,如学生类和老师类,创建俩个类的方法时,有的方法可能存在类似,但处理后的结果却不同,如老师拿到试题是改作业,学生拿到试题是写试题。鉴于这种情况,我们便引入了多态。

多态(Polymorphism)是面向对象编程(OOP)的一个核心概念。它允许同一个类型的对象在不同的情况下表现出不同的行为。这种特性使得Java程序具有更好的可扩展性、可维护性和可重用性。

2.2.2多态条件

达成多态的条件有以下几个:

  • 必须在继承体系下
  • 子类必须对父类中方法进行重写(何为重写下文讲解)
  • 必须通过父类来引用重写的方法

附上代码:

public class test {public static class A {public void func() {System.out.println(1);}}public static class B extends A {@Override//标记重写public void func(){System.out.println(2);}}public static class C extends A {@Override//标记重写public void func(){System.out.println(3);}}public static void main(String[] args) {B b = new B();C c = new C();b.func();c.func();}
}

 我们可以看到实例化b与实例化c都调用了func函数,那么究竟是父类还是子类的func呢?

20ef3bd365b94604b819a8dccd8b3eca.png

根据上文的讲解我们也应该很容易得出,分别调用的是子类重写后的方法。

2.2.3重写

我们上文用了这么多重写,那么到底何为重写呢,下文我们详细盘一盘:

重写(Override)是面向对象编程中的一个重要概念,子类可以重新定义父类中已经定义过的方法,这样当通过子类的实例来调用该方法时,就会执行子类中的实现版本,而不是父类中的版本。


重写的具体规则如下:

  1. 方法签名必须相同:重写的方法必须与父类中被重写的方法具有相同的名称、返回类型和参数列表。

  2. 访问修饰符:子类重写的方法的访问修饰符不能比父类中被重写的方法的访问修饰符更严格。例如,如果父类中的方法是public,那么子类中的重写方法也必须是public。但是,子类可以使用更宽松的访问修饰符,如protected

  3. 不能重写final方法:如果父类中的方法是final的,那么子类不能重写该方法。

  4. 不能重写static方法:静态方法属于类本身,而不是类的实例。因此,子类不能重写父类中的静态方法。

2.2.4向上转型与向下转型

向上转型与向下转型有点类似于数据类型中int与long之间的强转,接下来就让我们来分别介绍何为向上转型,何为向下转型。

向上转型,指的是将一个子类对象的引用赋值给一个父类类型的变量,而向下转型(Downcasting)是指将父类引用类型转换为子类引用类型的过程。

代码如下:

public class test {public static class A {int a = 1;}public static class B extends A {int b = 2;}public static void main(String[] args) {A a = new B();//向上转型if (a instanceof B) {B b = (B) a; // 强制类型转换//向下转型}}
}

其中在进行向下转型之前,通常需要使用instanceof关键字来判断父类引用是否指向了一个子类对象,这是为了确保类型转换的安全性。

2.2.5为什么要使用多态

到此为止我们已经大概讲解完了堕胎的概念以及重写的使用,那我们这样编写代码有什么优缺点呢?

优点有以下主要几点:


提高代码的灵活性和可扩展性

  • 多态允许在运行时动态地决定调用哪个方法,这使得代码更加灵活,易于扩展。
  • 当需要添加新的子类时,只需确保新子类实现了父类或接口中的方法,而无需修改现有代码。

简化代码

  • 通过多态,可以使用父类引用来操作子类对象,从而简化代码结构,减少重复代码。
  • 多态使得代码更加通用,因为父类引用可以指向任何子类对象。

而缺点也显而易见:


性能开销

  • 多态的实现通常依赖于动态绑定,即在运行时决定调用哪个方法。
  • 这可能会使代码的运行效率降低。

复杂性增加

  • 多态使得代码结构更加复杂,因为需要理解父类、子类以及它们之间的关系。

调试难度增加

  • 由于多态允许在运行时动态地决定调用哪个方法,因此调试时可能难以确定哪个方法被实际调用。
  • 会增加调试的难度和时间成本。

3.小结

今天关于继承与多态的讲解到这里就结束了,喜欢的小伙伴不要忘了点点关注点点收藏支持一下哦,你的支持就是对我最大的鼓励。

 

 

相关文章:

java基础(5)继承与多态

目录 ​编辑 1.前言 2.正文 2.1继承 2.1.1继承概念 2.1.2继承语法 2.1.3子类访问父类 2.1.4super关键字 2.2多态 2.2.1多态概念 2.2.2多态条件 2.2.3重写 2.2.4向上转型与向下转型 2.2.5为什么要使用多态 3.小结 1.前言 哈喽大家好啊,今天继续来为大…...

Flink消费Kafka实时写入Doris

本文模拟实际生产环境,通过FileBeat采集日志信息到Kafka,再通过Flink消费Kafka实时写入Doris。 文章目录 Filebeat采集日志到KafkaFlink消费Kafka实时写入Doris总结 Filebeat采集日志到Kafka 常见的日志采集工具有以下几种:Flume、Logstash和…...

实现Web QQ音乐打开现有新标签页切换音乐

若没有打开播放音乐标签页&#xff0c;则打开新标签页播放所选音乐如果已打开新标签页&#xff0c;则直接切换所选音乐 pageA.vue <script setup lang"ts"> const tab2 ref<any>(null); const router useRouter();interface Track {id: number;name: …...

从底层结构开始学习FPGA(15)----时钟结构(通俗版)

目录 0、前言 1、IO Bank和Clock Region(时钟区域)是一个东西吗? 2、时钟输入管脚 3、时钟架构 3.1、全局时钟BUFG 3.2、水平时钟BUFH 3.3、IO时钟BUFIO 3.4、区域时钟BUFR/BUFMR 4、总结 《从底层结构开始学习FPGA》目录与传送门 0、前言 我思来想去,总觉…...

MacOS Sublime Text 解决中乱码

1. 安装Package Control 官方安装指南 手动安装 通过以此点击菜单 Sublime Text > Preferences > Browse Packages 打开Packages目录找到Packages的同级目录Installed Packages下载PackageControl.sublime-package并保存到Installed Packages中在菜单 Sublime Text &g…...

Python画笔案例-084 绘制 3D立方体

1、绘制 3D立方体 通过 python 的turtle 库绘制 3D立方体,如下图: 2、实现代码 绘制 3D立方体,以下为实现代码: import turtle import timeviewfactor = 150 xshift = 0 yshift = 0 zshift = 50...

“八股文”面试:助力、阻力还是空谈?

在当今的IT行业&#xff0c;面试程序员时提及“八股文”已成为一种普遍现象。所谓“八股文”&#xff0c;通常指的是一系列固定的、标准化的面试问题及其解答&#xff0c;这些问题往往涵盖了计算机科学和软件工程的基础知识&#xff0c;以及一些流行的技术框架和算法。然而&…...

如何实现弹出式窗口

文章目录 1 概念介绍2 使用方法3 示例代码我们在上一章回中介绍了Sliver综合示例相关的内容,本章回中将介绍PopupMenuButton组件.闲话休提,让我们一起Talk Flutter吧。 1 概念介绍 我们在本章回中介绍的PopupMenuButton组件位于AppBar右侧,通常显示三个圆点图标,点击该图标…...

Lua 函数

Lua 函数 Lua 是一种轻量级的编程语言&#xff0c;广泛用于游戏开发、脚本编写和其他应用程序中。在 Lua 中&#xff0c;函数是一等公民&#xff0c;这意味着它们可以被存储在变量中&#xff0c;作为参数传递给其他函数&#xff0c;以及作为其他函数的返回值。本文将详细介绍 …...

HTML_文本标签

概念&#xff1a; 1、用于包裹&#xff1a;词汇、短语等。 2、通常写在排版标签里面。 3、排版标签更宏观(大段的文字)&#xff0c;文本标签更微观(词汇、短语)。 4、文本标签通常都是行内元素。 常用的文本标签 标签名 全称 标签语义em Emphasized 加重(文本)。要着重阅…...

基于SpringBoot+Vue+uniapp的诗词学习系统的详细设计和实现(源码+lw+部署文档+讲解等)

详细视频演示 请联系我获取更详细的演示视频 项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不…...

健康睡眠的重要性

在快节奏的现代生活中&#xff0c;健康养生已成为人们日益关注的话题&#xff0c;而睡眠&#xff0c;这一看似平凡却至关重要的生理需求&#xff0c;往往被忽视在忙碌的缝隙中。今天&#xff0c;让我们深入探讨健康养生中的睡眠艺术&#xff0c;它不仅关乎身体的休息与恢复&…...

知道ip地址怎么看网络地址

在计算机网络的世界里&#xff0c;IP地址是设备之间通信的基础。然而&#xff0c;仅仅知道一个设备的IP地址并不足以完全理解它在网络中的位置和作用。网络地址&#xff0c;作为IP地址的一个重要组成部分&#xff0c;为我们提供了关于设备所属网络的更多信息。本文将深入探讨如…...

精心整理85道Java微服务面试题(含答案)

微服务 面试题 1、您对微服务有何了解&#xff1f; 2、微服务架构有哪些优势&#xff1f; 3。微服务有哪些特点&#xff1f; 4、设计微服务的最佳实践是什么&#xff1f; 5、微服务架构如何运作&#xff1f; 6、微服务架构的优缺点是什么&#xff1f; 7、单片&#xff0…...

MongoDB聚合管道(Aggregation Pipeline)

聚合管道&#xff08;Aggregation Pipeline&#xff09;是MongoDB中用于对数据进行处理和分析的一种强大机制。它由一系列的阶段&#xff08;Stage&#xff09;组成&#xff0c;每个阶段对输入的数据进行一种特定的操作&#xff0c;然后将结果传递给下一个阶段&#xff0c;就像…...

移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——6.vector(无习题)

C 中的 vector 容器详细总结 1. 什么是 vector&#xff1f; vector 是 C 标准模板库 (STL) 中的一种动态数组容器。它的底层实现是一个可以自动扩展的数组&#xff0c;支持随机访问和动态调整大小&#xff0c;是 C 中最常用的序列容器之一。vector 在插入、删除、遍历以及随机…...

SpringBoot技术支持的桂林景点导航

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…...

利用vmware在移动硬盘安装Ubuntu2go

安装 买个移动硬盘&#xff0c;usb插电脑&#xff0c;磁盘管理看磁盘序列号 vmware新建虚拟机 这一步选择磁盘管理里面看到的磁盘4 先不要开机&#xff0c;选择设置里面UEFI 和安装正常Ubuntu一致操作即可&#xff0c;这里可以不选高级&#xff0c;默认一个引导分区&…...

Spring Boot:中小型医院网站的敏捷开发

摘 要 本基于Spring Boot的中小型医院网站设计目标是实现用户网络预约挂号的功能&#xff0c;同时提高医院管理效率&#xff0c;更好的为广大用户服务。 本文重点阐述了中小型医院网站的开发过程&#xff0c;以实际运用为开发背景&#xff0c;基于Spring Boot框架&#xff0c;运…...

241011-在jupyter中实现文件夹压缩后下载

241011-在jupyter中实现文件夹压缩后下载 在使用jupyter notebook过程中&#xff0c;我们经常会遇到成堆的文件无法批量下载的问题&#xff0c;这里提供压缩文件夹代码&#xff0c;压缩后即可右键文件选择download实现批量下载 import zipfile import os# 设置你想要压缩的文…...

.NET 一款用于转储指定进程内存的工具

01阅读须知 此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等&#xff08;包括但不限于&#xff09;进行检测或维护参考&#xff0c;未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失&#xf…...

Splunk 修补关键漏洞,包括远程代码执行漏洞

领先的数据分析和安全监控平台 Splunk 发布了一系列安全更新&#xff0c;以解决 Splunk Enterprise 和 Splunk Cloud Platform 中的多个漏洞。这些漏洞的严重程度不一&#xff0c;有些可实现远程代码执行&#xff08;RCE&#xff09;&#xff0c;有些则允许低权限用户访问敏感信…...

搭建一个vue3+vite框架

可以使用以下两种搭建方式 通过create-vue搭建vue3 项目&#xff08;建议使用&#xff09; create-vue create-vue 是 Vue.js 官方推荐的用于快速启动 Vite 驱动的 Vue 项目的脚手架工具。它简化了创建新 Vue 项目的过程&#xff0c;提供了预配置的项目结构&#xff0c;并集…...

【含文档】基于Springboot+Vue的公交管理系统(含源码+数据库+lw)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统定…...

自闭症儿童能否适应学校生活:提供专业辅助,助力顺利融入

自闭症&#xff0c;这一复杂的神经发育障碍&#xff0c;往往让许多家庭在孩子的教育问题上倍感焦虑。面对即将步入学校生活的自闭症儿童&#xff0c;家长们不禁要问&#xff1a;他们能否适应学校生活&#xff1f;如何帮助他们顺利融入&#xff1f;幸运的是&#xff0c;随着医疗…...

MQTTnet.Server同时支持mqtt及websocket协议

Net6后写法 Net6前写法 Program.cs using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Hosting; using MQTTnet.AspNetCore; using System; using System.IO;namespace MQTTnet.Server {public class Program{publ…...

【数据结构】二叉树(一)遍历

导言 前面以及有了堆的基础&#xff0c;现在来学习二叉树。二叉树的学习和前面的数据结构很不一样&#xff0c;前面我们主要学习用数据结构储存数据&#xff0c;以及实际手搓数据结构的增删查改&#xff1b;而学习二叉树主要是为我们以后学搜索二叉树以及后面的AVL树等数据结构…...

【C++ 贪心】1616. 分割两个字符串得到回文串|1868

本文涉及知识点 C贪心 LeetCode1616. 分割两个字符串得到回文串 给你两个字符串 a 和 b &#xff0c;它们长度相同。请你选择一个下标&#xff0c;将两个字符串都在 相同的下标 分割开。由 a 可以得到两个字符串&#xff1a; aprefix 和 asuffix &#xff0c;满足 a aprefi…...

识别秒拨风险的具体方法及策略

秒拨技术是利用家用宽带拨号上网&#xff08;PPPoE&#xff09;的特性&#xff0c;通过频繁断线重连来获取新的IP地址&#xff0c;从而构建代理服务或进行其他网络活动。这种技术使得IP地址的切换频率极高&#xff0c;加大了识别和追踪的难度。因此&#xff0c;首先需要对秒拨技…...

[Python]如何在Ubuntu中建置python venv虛擬環境,並安裝TensorFlow和OpenCV函式庫?

為了在樹莓派上實現物件影像辨識功能&#xff0c;同時不影響樹莓派原來的python運行環境&#xff0c;選擇建置python虛擬環境[Note1]是一個好方式&#xff0c;其可避免版本衝突和不同運行環境的問題。另外&#xff0c;一併在該虛擬環境中安裝TensorFlow[Note2]和OpenCV[Note3]等…...