Java 继承与多态
一、继承
在Java中,继承是一种重要的面向对象编程概念,它允许一个类(称为子类或派生类)继承另一个类(称为父类或基类)的属性和方法。这意味着子类可以使用父类的成员变量和方法,并且可以添加自己的新功能或覆盖父类的方法。
以下是关于Java中继承的一些重要概念:
- extends关键字: 在Java中,通过使用关键字extends来实现继承。例如:
class SubClass extends SuperClass {// 子类的代码 } - 构造方法
-
父类构造方法:
- 父类构造方法用于初始化父类的实例变量。
- 如果子类没有显式地调用父类构造方法,Java会自动调用父类的无参构造方法(如果存在),以确保父类的初始化。
- 如果父类没有无参构造方法,而子类又没有显式地调用父类其他构造方法,则编译器会报错。
- 子类可以使用super关键字显式地调用父类的构造方法,以初始化父类的实例变量。
-
子类构造方法:
- 子类构造方法用于初始化子类的实例变量。
- 子类构造方法可以选择调用父类的构造方法,或者不调用。如果不调用父类构造方法,则会默认调用父类的无参构造方法。
- 子类构造方法可以重载父类的构造方法,但是在子类构造方法中调用父类构造方法的语句必须放在子类构造方法的第一行。
-
使用super关键字调用父类构造方法:
- 子类可以使用super关键字显式地调用父类的构造方法。
- 使用super()调用父类的无参构造方法。
- 使用super(...)调用父类的特定构造方法,传递参数给父类构造方法。
class Parent {private int parentValue;public Parent() {this.parentValue = 0;System.out.println("Parent's default constructor");}public Parent(int value) {this.parentValue = value;System.out.println("Parent's constructor with parameter");} }class Child extends Parent {private int childValue;public Child() {super(); // 调用父类的无参构造方法this.childValue = 0;System.out.println("Child's default constructor");}public Child(int parentValue, int childValue) {super(parentValue); // 调用父类的有参构造方法this.childValue = childValue;System.out.println("Child's constructor with parameter");} }public class Main {public static void main(String[] args) {Child child1 = new Child(); // 默认调用父类的无参构造方法,然后调用子类的无参构造方法Child child2 = new Child(10, 20); // 调用父类的有参构造方法,然后调用子类的有参构造方法} }在上面的示例中,父类Parent有两个构造方法:一个是无参构造方法,另一个是带参数的构造方法。子类Child重写了这两个构造方法,并且在子类构造方法中使用super关键字来调用父类的构造方法。通过这样的方式,我们可以灵活地初始化父类和子类的实例变量
-
-
子类调用父类方法与属性
在Java中,子类可以调用父类的方法和属性,以便在子类中重用父类的功能或访问父类的状态。这种调用通常通过super关键字来实现。- 调用父类方法:
- 子类可以使用super关键字调用父类的方法。
- 通过super.methodName()来调用父类的方法。
- 如果子类重写了父类的方法,使用super关键字可以在子类中调用父类的原始方法。
class Parent {public void parentMethod() {System.out.println("Parent method");} }class Child extends Parent {public void childMethod() {super.parentMethod(); // 调用父类方法System.out.println("Child method");} }public class Main {public static void main(String[] args) {Child child = new Child();child.childMethod(); // 输出: Parent method\nChild method} }访问父类属性:
- 子类可以通过super关键字访问父类的属性。
- 使用super.fieldName来访问父类的属性。
class Parent {public int parentValue = 10; }class Child extends Parent {public void printParentValue() {System.out.println("Parent value: " + super.parentValue); // 访问父类属性} }public class Main {public static void main(String[] args) {Child child = new Child();child.printParentValue(); // 输出: Parent value: 10} }在Java中,成员属性的空间是在对象被创建时开辟的,而对象的创建通常在构造方法被调用时完成。因此,在构造方法被调用之前,成员属性的空间已经被分配了。
具体地说,当使用new关键字创建一个对象时,Java会为该对象分配内存空间,并在内存中创建对象的实例。在这个过程中,对象的成员属性的内存空间也会被分配,并根据其类型进行初始化(对于基本数据类型,会使用默认值;对于引用类型,会被初始化为null)。
然后,构造方法会被调用,构造方法的主要任务是对对象进行初始化,这包括对成员属性的初始化、执行必要的设置操作等。
所以,成员属性的空间开辟是在对象创建的过程中完成的,而构造方法通常是在这个过程中被调用的,因此在构造方法调用之前,成员属性的空间已经被分配了。
- 调用父类方法:
-
重写
方法重写(Method Overriding)是面向对象编程中的一个重要概念,它允许子类重新定义父类中已经定义的方法。通过方法重写,子类可以根据自身的需求修改或扩展父类的方法,从而实现多态性。-
方法重写的条件如下:
- 子类方法的名称、参数列表和返回类型必须与父类中被重写的方法完全相同。
- 子类方法不能缩小父类方法的访问权限。也就是说,如果父类方法是public,则子类方法也必须是public或者更宽松的访问权限。
- 子类方法不能抛出比父类方法更多的异常。
-
当子类重写父类的方法后,如果在子类的实例上调用该方法,则会执行子类中的方法,而不是父类中的方法。这种调用称为动态绑定或者后期绑定。这是Java中实现多态性的一种方式。
下面是一个简单的例子来说明方法重写的概念:
class Animal {public void makeSound() {System.out.println("Animal makes a sound");} }class Dog extends Animal {@Overridepublic void makeSound() { // 重写父类方法System.out.println("Dog barks");} }public class Main {public static void main(String[] args) {Animal animal = new Animal();animal.makeSound(); // 输出: Animal makes a soundDog dog = new Dog();dog.makeSound(); // 输出: Dog barks} }在上面的例子中,Animal类有一个makeSound方法,而Dog类继承了Animal类并重写了makeSound方法。当创建一个Animal对象并调用makeSound方法时,执行的是Animal类中的makeSound方法;而当创建一个Dog对象并调用makeSound方法时,执行的是Dog类中重写的makeSound方法。这显示了方法重写在Java中的实际应用,实现了多态性的概念。
-
二、多态
多态(Polymorphism)是面向对象编程中的一个重要概念,它使得代码更加灵活、可扩展和易于维护。多态性允许使用基类的引用变量来引用子类的对象,从而在运行时选择正确的方法执行。
多态的意义:
-
灵活性: 多态性允许使用统一的接口来操作不同的对象,从而使得代码更加灵活,可以适应不同类型的对象。
-
可扩展性: 当新增加一个子类时,不需要修改已有的代码,只需要保证新子类实现了相应的接口或继承了父类,就可以使用多态性来操作该子类对象。
-
易于维护: 多态性提高了代码的可读性和可维护性,因为不同的对象可以使用相同的接口来进行操作,降低了代码的复杂度。
实现条件:
-
继承: 多态性的实现依赖于继承关系,子类必须继承自父类或者实现相同的接口。
-
方法重写: 子类必须重写(Override)父类的方法,使得父类引用可以在运行时调用到子类的方法。
-
父类引用指向子类对象: 多态性的关键在于父类引用可以指向子类对象,即父类类型的引用变量可以引用子类类型的对象。
// 父类 class Animal {public void makeSound() {System.out.println("Animal makes a sound");} }// 子类 class Dog extends Animal {@Overridepublic void makeSound() {System.out.println("Dog barks");} }public class Main {public static void main(String[] args) {Animal animal = new Dog(); // 父类引用指向子类对象animal.makeSound(); // 输出: Dog barks} }在上面的例子中,Animal是父类,Dog是子类,Dog类重写了Animal类的makeSound方法。在Main类中,创建了一个Animal类型的引用animal,并将其指向一个Dog类型的对象。然后调用animal.makeSound(),由于多态性的作用,实际上调用的是Dog类中重写的makeSound方法。这就是多态性的实现。
相关文章:
Java 继承与多态
一、继承 在Java中,继承是一种重要的面向对象编程概念,它允许一个类(称为子类或派生类)继承另一个类(称为父类或基类)的属性和方法。这意味着子类可以使用父类的成员变量和方法,并且可以添加自…...
C语言——递归题
对于递归问题,我们一定要想清楚递归的结束条件,每个递归的结束条件,就是思考这个问题的起始点。 题目1: 思路:当k1时,任何数的1次方都是原数,此时返回n,这就是递归的结束条件&#…...
构建空间场景轻应用,Mapmost Alpha来啦【文末赠书(10本)--第一期】
文章目录: 一、Mapmost Alpha 介绍二、Mapmost Alpha应对数字孪生业务痛点解决之道2.1 Mapmost Alpha 提供海量城市底板2.2 Mapmost Alpha 提供便捷的配置管理工具2.3 Mapmost Alpha 提供一键式部署发布和分享 三、沉浸式体验Mapmost Alpha3.1 创建应用3.2 新手指导…...
基于冠豪猪优化算法(Crested Porcupine Optimizer,CPO)的无人机三维路径规划(MATLAB)
一、无人机路径规划模型介绍 无人机三维路径规划是指在三维空间中为无人机规划一条合理的飞行路径,使其能够安全、高效地完成任务。路径规划是无人机自主飞行的关键技术之一,它可以通过算法和模型来确定无人机的航迹,以避开障碍物、优化飞行…...
html2canvas+jsPDF实现前端导出pdf
html2canvasjsPDF实现前端导出pdf 安装插件包 npm install jspdf npm install html2canvas引入插件 import html2canvas from html2canvas; import jsPDF from jspdf;生成pdf const perCanvas document.createElement(canvas);perCanvas.style.backgroundColor #fffconst …...
Paimon新版本核心特性和生产实践解读
最近Apche Paimon发布了最新版本0.7.0,在这个版本中,Paimon对一些新特性进行了增强。 Paimon在数据湖领域发展迅速,未来会在整个数据开发领域占有很重要的地位,今天我们来盘点一下当前能力的特点以及在生产环境中的使用情况。 Loo…...
Java设计模式-策略模式
策略模式1 概述2 结构3 案例实现4 优缺点5 使用场景6 JDK源码解析 策略模式 1 概述 先看下面的图片,我们去旅游选择出行模式有很多种,可以骑自行车、可以坐汽车、可以坐火车、可以坐飞机。 作为一个程序猿,开发需要选择一款开发工具&#x…...
vxe-table配合Export2Excel导出object类型数据{type,count}。表格数据呈现是利用插槽,导出只要count该怎么做
先贴一张数据来: 一、然后是vxe-grid的columns配置: 然后就正常用封装好的Export2Excel就行。 碰到一次在控制台报错: 没复现出来,大概就说是count咋样咋样。 以后碰到的话再说,各位要用的话也注意看看 二、或者 用js…...
Java面试题(主要分清区别!!!)
RequestBody和ResponseBody的区别? RequestBody:接收json或xml数据 ResponseBody的:返回json或xml数据 RestController和Controller的区别? Controller:默认返回的是jsp页面 RestController:返回的是一个js…...
OD_2024_C卷_200分_2、石头剪刀布【JAVA】【逻辑分析】
题目描述 石头剪刀布游戏有 3 种出拳形状:石头、剪刀、布。分别用字母A、B、C表示。 游戏规则: 出拳形状之间的胜负规则如下: A > B; B > C; C > A; “>” 左边一个字母,表示相对…...
矩阵求导笔记
文章目录 1. ML中为什么需要矩阵求导2. 向量函数与矩阵求导初印象3. YX 拉伸术3.1 f(x)为标量,X为列向量3.2 f(x)为列向量,X 为标量3.3 f(x)为列向量,X 为列向量 4. 常见矩阵求导公式4.1 Y A T X YA^TX YATX4.2 Y X T A X YX^TAX YXTAX 1…...
全量知识系统问题及SmartChat给出的答复 之19 关于演示模板
Q.60 可参考的演示模版 (word-def occupiedinterest 5type EBsubclass SEBtemplate (script $Demonstrateactor nilobject nildemands nilmethod (scene $Occupyactor nillocation nil))fill (((actor) (top-of *actor-stack*))((method actor) (t…...
Linux学习——线程的控制
目录 编辑 一,线程的创建 二,线程的退出 1,在子线程内return 2,使用pthread_exit(void*) 三,线程等待 四,线程获取自己的id值 五,线程取消 六,线程分离 一,线程的创建 在对…...
Rust常用特型之Drop特型
Rust常用特型之Drop特型.md在Rust标准库中,存在很多常用的工具类特型,它们能帮助我们写出更具有Rust风格的代码。 今天,我们主要学习Drop特型。 (注:本文更多的是对《Programing Rust 2nd Edition》的自己翻译和理解&…...
嵌入式 Linux 学习
在学习嵌入式 Linux 之前,我们先来了解一下嵌入式 Linux 有哪些东西。 1. 嵌入式 Linux 的组成 嵌入式 Linux 系统,就相当于一套完整的 PC 软件系统。 无论你是 Linux 电脑还是 windows 电脑,它们在软件方面的组成都是类似的。 我们一开电…...
Makedown语法
这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…...
SQLite语句
1.重写SQLiteOpenHelper // 例. public class MySQLiteOpenHelper extends SQLiteOpenHelper {public MySQLiteOpenHelper(Nullable Context context, Nullable String name, Nullable SQLiteDatabase.CursorFactory factory, int version) {super(context, name, factory, ve…...
Spring揭秘:Aware接口应用场景及实现原理!
内容概要 Aware接口赋予了Bean更多自感知的能力,通过实现不同的Aware接口,Bean可以轻松地获取到Spring容器中的其他资源引用,像ApplicationContext、BeanFactory等。 这样不仅增强了Bean的功能,还提高了代码的可维护性和扩展性&…...
校园小情书微信小程序,社区小程序前后端开源,校园表白墙交友小程序
功能 表白墙卖舍友步数旅行步数排行榜情侣脸漫画脸个人主页私信站内消息今日话题评论点赞收藏 效果图...
从Pandas到Polars :数据的ETL和查询
对于我们日常的数据清理、预处理和分析方面的大多数任务,Pandas已经绰绰有余。但是当数据量变得非常大时,它的性能开始下降。 本文将介绍如何将日常的数据ETL和查询过滤的Pandas转换成polars。 图片 Polars的优势 Polars是一个用于Rust和Python的Data…...
Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
【网络安全】开源系统getshell漏洞挖掘
审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...
yaml读取写入常见错误 (‘cannot represent an object‘, 117)
错误一:yaml.representer.RepresenterError: (‘cannot represent an object’, 117) 出现这个问题一直没找到原因,后面把yaml.safe_dump直接替换成yaml.dump,确实能保存,但出现乱码: 放弃yaml.dump,又切…...
TCP/IP 网络编程 | 服务端 客户端的封装
设计模式 文章目录 设计模式一、socket.h 接口(interface)二、socket.cpp 实现(implementation)三、server.cpp 使用封装(main 函数)四、client.cpp 使用封装(main 函数)五、退出方法…...
CVE-2023-25194源码分析与漏洞复现(Kafka JNDI注入)
漏洞概述 漏洞名称:Apache Kafka Connect JNDI注入导致的远程代码执行漏洞 CVE编号:CVE-2023-25194 CVSS评分:8.8 影响版本:Apache Kafka 2.3.0 - 3.3.2 修复版本:≥ 3.4.0 漏洞类型:反序列化导致的远程代…...
