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

Java 继承与多态

一、继承

在Java中,继承是一种重要的面向对象编程概念,它允许一个类(称为子类或派生类)继承另一个类(称为父类或基类)的属性和方法。这意味着子类可以使用父类的成员变量和方法,并且可以添加自己的新功能或覆盖父类的方法。

以下是关于Java中继承的一些重要概念:

  1. extends关键字: 在Java中,通过使用关键字extends来实现继承。例如:
    class SubClass extends SuperClass {// 子类的代码
    }
    
  2. 构造方法
    1. 父类构造方法:

      1. 父类构造方法用于初始化父类的实例变量。
      2. 如果子类没有显式地调用父类构造方法,Java会自动调用父类的无参构造方法(如果存在),以确保父类的初始化。
      3. 如果父类没有无参构造方法,而子类又没有显式地调用父类其他构造方法,则编译器会报错。
      4. 子类可以使用super关键字显式地调用父类的构造方法,以初始化父类的实例变量。
    2. 子类构造方法:

      1. 子类构造方法用于初始化子类的实例变量。
      2. 子类构造方法可以选择调用父类的构造方法,或者不调用。如果不调用父类构造方法,则会默认调用父类的无参构造方法。
      3. 子类构造方法可以重载父类的构造方法,但是在子类构造方法中调用父类构造方法的语句必须放在子类构造方法的第一行。
    3. 使用super关键字调用父类构造方法:

      • 子类可以使用super关键字显式地调用父类的构造方法。
      • 使用super()调用父类的无参构造方法。
    4. 使用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关键字来调用父类的构造方法。通过这样的方式,我们可以灵活地初始化父类和子类的实例变量

  3. 子类调用父类方法与属性

    在Java中,子类可以调用父类的方法和属性,以便在子类中重用父类的功能或访问父类的状态。这种调用通常通过super关键字来实现。
    1. 调用父类方法:
      • 子类可以使用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)。

        然后,构造方法会被调用,构造方法的主要任务是对对象进行初始化,这包括对成员属性的初始化、执行必要的设置操作等。

        所以,成员属性的空间开辟是在对象创建的过程中完成的,而构造方法通常是在这个过程中被调用的,因此在构造方法调用之前,成员属性的空间已经被分配了。

  4. 重写

    方法重写(Method Overriding)是面向对象编程中的一个重要概念,它允许子类重新定义父类中已经定义的方法。通过方法重写,子类可以根据自身的需求修改或扩展父类的方法,从而实现多态性。
    1. 方法重写的条件如下:

    2. 子类方法的名称、参数列表和返回类型必须与父类中被重写的方法完全相同。
    3. 子类方法不能缩小父类方法的访问权限。也就是说,如果父类方法是public,则子类方法也必须是public或者更宽松的访问权限。
    4. 子类方法不能抛出比父类方法更多的异常。
    5. 当子类重写父类的方法后,如果在子类的实例上调用该方法,则会执行子类中的方法,而不是父类中的方法。这种调用称为动态绑定或者后期绑定。这是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)是面向对象编程中的一个重要概念,它使得代码更加灵活、可扩展和易于维护。多态性允许使用基类的引用变量来引用子类的对象,从而在运行时选择正确的方法执行。

多态的意义:

  1. 灵活性: 多态性允许使用统一的接口来操作不同的对象,从而使得代码更加灵活,可以适应不同类型的对象。

  2. 可扩展性: 当新增加一个子类时,不需要修改已有的代码,只需要保证新子类实现了相应的接口或继承了父类,就可以使用多态性来操作该子类对象。

  3. 易于维护: 多态性提高了代码的可读性和可维护性,因为不同的对象可以使用相同的接口来进行操作,降低了代码的复杂度。

实现条件:

  1. 继承: 多态性的实现依赖于继承关系,子类必须继承自父类或者实现相同的接口。

  2. 方法重写: 子类必须重写(Override)父类的方法,使得父类引用可以在运行时调用到子类的方法。

  3. 父类引用指向子类对象: 多态性的关键在于父类引用可以指向子类对象,即父类类型的引用变量可以引用子类类型的对象。

    // 父类
    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…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;加密货币作为一种新兴的金融现象&#xff0c;正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而&#xff0c;加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下&#xff0c;稳定…...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板&#xff0c;就像一个模具&#xff0c;里面可以将不同类型的材料做成一个形状&#xff0c;其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式&#xff1a;templa…...

LLMs 系列实操科普(1)

写在前面&#xff1a; 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容&#xff0c;原视频时长 ~130 分钟&#xff0c;以实操演示主流的一些 LLMs 的使用&#xff0c;由于涉及到实操&#xff0c;实际上并不适合以文字整理&#xff0c;但还是决定尽量整理一份笔…...

逻辑回归暴力训练预测金融欺诈

简述 「使用逻辑回归暴力预测金融欺诈&#xff0c;并不断增加特征维度持续测试」的做法&#xff0c;体现了一种逐步建模与迭代验证的实验思路&#xff0c;在金融欺诈检测中非常有价值&#xff0c;本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...

pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)

目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 &#xff08;1&#xff09;输入单引号 &#xff08;2&#xff09;万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...

规则与人性的天平——由高考迟到事件引发的思考

当那位身着校服的考生在考场关闭1分钟后狂奔而至&#xff0c;他涨红的脸上写满绝望。铁门内秒针划过的弧度&#xff0c;成为改变人生的残酷抛物线。家长声嘶力竭的哀求与考务人员机械的"这是规定"&#xff0c;构成当代中国教育最尖锐的隐喻。 一、刚性规则的必要性 …...

JDK 17 序列化是怎么回事

如何序列化&#xff1f;其实很简单&#xff0c;就是根据每个类型&#xff0c;用工厂类调用。逐个完成。 没什么漂亮的代码&#xff0c;只有有效、稳定的代码。 代码中调用toJson toJson 代码 mapper.writeValueAsString ObjectMapper DefaultSerializerProvider 一堆实…...

C++--string的模拟实现

一,引言 string的模拟实现是只对string对象中给的主要功能经行模拟实现&#xff0c;其目的是加强对string的底层了解&#xff0c;以便于在以后的学习或者工作中更加熟练的使用string。本文中的代码仅供参考并不唯一。 二,默认成员函数 string主要有三个成员变量&#xff0c;…...

13.10 LangGraph多轮对话系统实战:Ollama私有部署+情感识别优化全解析

LangGraph多轮对话系统实战:Ollama私有部署+情感识别优化全解析 LanguageMentor 对话式训练系统架构与实现 关键词:多轮对话系统设计、场景化提示工程、情感识别优化、LangGraph 状态管理、Ollama 私有化部署 1. 对话训练系统技术架构 采用四层架构实现高扩展性的对话训练…...