【JAVA SE】多态

news2024/10/6 1:52:02

✨✨欢迎大家来到Celia的博客✨✨

🎉🎉创作不易,请点赞关注,多多支持哦🎉🎉

所属专栏:JAVA

个人主页:Celia's blog~

目录

引言

一、多态

1.1 多态的概念

1.2 多态的实现条件

1.3 关于向上转型、向下转型

1.4 关于重写

1.5 实现多态

1.6 多态的好处


引言

 上一个篇章中,我们已经初步了解了继承的概念以及使用,在本篇文章中,将会介绍在Java中依赖于继承的一种新的现象:多态。

一、多态

1.1 多态的概念

  多态,是指不同的对象,面对同一个事物时,会展现出不同的反应。

1.2 多态的实现条件

  1. 必须在继承体系下
  2. 子类必须重写父类的方法
  3. 通过父类的引用来调用重写的方法

1.3 关于向上转型、向下转型

  在继承体系中,如果创建了一个子类对象,是可以用父类类型来接收的。假设有如下代码:

class Animal{
    public String name;
    public int age;

    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void eat(){
        System.out.println("正在吃饭...");
    }
}

class Dog extends Animal{
    public String flag;
    public Dog(String name, int age) {
        super(name, age);
    }
    public void eat(){
        System.out.println("正在吃狗粮...");
    }
}

我们创建一个dog对象,是可以用Animal类型来接收的:

Animal animal = new Dog("小黑", 10);

那么为什么要这样做呢? 

父类的类型可以接收所有继承于这个父类的子类的对象,这有助于统一标准。此时这种情况就叫做向上转型。

向上转型的三种方式:

  1. 在创建新对象时用父类类型接收
  2. 利用传参,传入子类,用父类接收
  3. 利用方法返回值,返回子类,用父类接收

注意事项:

在继承过程中,如果实现了向上转型,该对象只能使用父类的成员变量或成员方法,这是由类型所局限的。

 

如果想要访问子类的成员变量和成员方法,则需要向下转型:

((Dog) animal).flag//向下转型访问子类成员

1.4 关于重写

  重写,也称为覆盖。是子类对父类的非静态、非private、非final、非构造方法进行的重新编写。返回值和形参列表(种类、顺序)必须一样。只有内容可以改变。我们来看下面的代码:

class Animal{
    public String name;
    public int age;

    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void eat(){
        System.out.println("正在吃饭...");
    }
}

class Dog extends Animal{
    public String flag;
    public Dog(String name, int age) {
        super(name, age);
    }
    public void eat(){
        System.out.println("正在吃狗粮...");
    }
}


public class Text {
    public static void main(String[] args) {
        Animal animal = new Dog("小黑", 10);/向上转型
        animal.eat();//会输出什么呢???
    }
}


我们仔细观察,发现子类Dog和父类Animal都有一个相同的方法:eat,它们的返回值相同,参数列表相同,此时,子类中的eat方法就对父类中的eat方法进行了重写当我们调用父类的eat方法时,实际上调用的是子类的eat方法。


实际上,调用的确实是父类的eat方法,但是在程序运行的过程中,实际上调用的是子类的eat方法,这种在继承体系下,运行时才确定具体调用哪个方法的现象叫做动态绑定。

1.5 实现多态

class Animal{
    public String name;
    public int age;

    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void eat(){
        System.out.println("正在吃饭...");
    }
}

class Dog extends Animal{
    public String flag;
    public Dog(String name, int age) {
        super(name, age);
    }
    public void eat(){
        System.out.println("正在吃狗粮...");
    }
}

class Cat extends Animal{
    public Cat(String name, int age) {
        super(name, age);
    }
    public void eat() {
        System.out.println("正在吃猫粮...");
    }
}

public class Text {
    public static void main(String[] args) {
        Animal animal = new Dog("小黑", 10);
        Animal animal1 = new Cat("小白",5);
        animal.eat();
        animal1.eat();
    }
}

在以上代码中,定义了两个子类Cat和Dog,进行向上转型,并且调用父类的eat方法:

此时,调用的都是父类的eat方法,但是根据子类对象的不同,实际上展现出来的表现也不同,这种现象就叫做多态。

1.6 多态的好处

  1. 避免使用大量的if-else语句:只需要调用父类的方法,根据对象的不同,就能实现不同的表现形式。
  2. 可扩展能力强:如果想要扩展,只需要定义一个新的继承该父类的类,并且重写父类的方法就可以了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1717314.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【码银送书第二十期】《游戏运营与出海实战:策略、方法与技巧》

市面上的游戏品种繁杂,琳琅满目,它们是如何在历史的长河中逐步演变成今天的模式的呢?接下来,我们先回顾游戏的发展史,然后按照时间轴来叙述游戏运营的兴起。 作者:艾小米 本文经机械工业出版社授权转载&a…

Vue前端平台的搭建

文章目录 前端平台搭建(`Vue2.6`,App:`HBulderX`)创建`Vue2.6`项目下载相应插件方便开发路由配置对连接后端进行一些配置(`main.js`文件)导入ElementUI组件[组件 | Element](https://element.eleme.cn/#/zh-CN/component/icon)同步与异步`axios`异步请求框架前端平台搭建(Vue2.…

零基础入门学习Python第二阶04SQL详解01

SQL 和 MySQL 详解 SQL 详解 我们通常可以将 SQL 分为四类,分别是 DDL(数据定义语言)、DML(数据操作语言)、DQL(数据查询语言)和 DCL(数据控制语言)。DDL 主要用于创建…

正则匹配优化:匹配排除多个字符串的其他字符串

(^entity|^with|...)\w优化 (?!entity|with|has|index|associations|input)\w(?!): 匹配排除项 效果 继续优化 匹配会过滤掉带有关键字的字段,在过滤的时候是可以加上尾部结束匹配符的 效果:

pytorch+YOLOv8-1

1.工具开发 2.idea配置pytorch环境 默认安装新版本torch pip install torch 3.pytorch验证 4. print(torch.cuda.is_available()) 输出结果为 False 说明我只能用cpu

Docker搭建FRP内网穿透服务器

使用Docker搭建一个frp内网穿透 在现代网络环境中,由于防火墙和NAT等原因,内网设备无法直接被外网访问。FRP (Fast Reverse Proxy) 是一款非常流行的内网穿透工具,它能够帮助我们将内网服务暴露给外网。本文将介绍如何在Linux服务器上使用Do…

Java——面向对象初阶

前言: Java面向对象相关讲解 文章目录 一、面向对象二、类与对象三、封装四、构造方法及重载五、this关键字六、基本数据类型和引用数据类型七、JavaBean类 一、面向对象 面向对象(Object-Oriented Programming, OOP)是一种编程范式&#xff…

HarmonyOS 鸿蒙DevEco:导入无法运行提示Sync failed

场景:导入官网下载的案例后导入发现无法运行模拟机,Notifications提示Sync failed... 解决:查看Cause发现是版本问题,通过修改相关内容来解决该问题 1、打开案例地址找到hvigor文件夹 2、打开hvigor-config.json5,将&…

BUUCTF--[VN2020 公开赛]warmup

一开始直接告诉你libc基址。 有沙盒,分析了一下,write的count不等于0x10就可以,0x30什么的都可以。 嗯,还开了PIE。 很明显了,orw。 问题是开了PIE,bflag\x00不能写在BSS上了,同时也不能重复执…

5.30 学习总

刷题记录(Codeforces Round 947 (Div. 1 Div. 2)B,C题)和Codeforces Round 948 (Div. 2)B题 一.B. 378QAQ and Mochas Array B. 378QAQ and Mochas Array time limit per test 1 second memory limit per test 256 megabytes in…

Android 11 Audio strategy配置解析

在启动AudioPolicyService时,通过EngineBase的loadAudioPolicyEngineConfig函数去解析strategy配置。其调用流程如下 接下来就对loadAudioPolicyEngineConfig展开分析 1,解析volume标签 engineConfig::ParsingResult EngineBase::loadAudioPolicyEngine…

构建 VPC 并启动 Web 服务器

实验 2:构建 VPC 并启动 Web 服务器 目标 完成本实验后,您可以: 创建 VPC。创建子网。配置安全组。在 VPC 中启动 EC2 实例。任务 1:创建 VPC 在本任务中,您将使用 VPC 向导在单个可用区中创建一个 VPC、一个互联网网关…

【vueCms】vueCms后台管理系统安装问题集合

开源项目地址: https://www.vuecms.cn/ 开源代码地址: https://gitee.com/derekgo/vue-cms_xg 问题一 如果出现提示少了个index.html。如下图 解决办法: 重新安装前端(vue3_vite)项目依赖 问题二 npm版本高无法解析依赖树导致依赖下载失败 解决方案: npm install --legacy…

Web程序设计-实验05 DOM与BOM编程

题目 【实验主题】 影视网站后台影视记录管理页设计 【实验任务】 1、浏览并分析多个网站后台的列表页面、编辑页面(详见参考资源,建议自行搜索更多后台页面)的主要元素构成和版面设计,借鉴并构思预期效果。 2、新建 index.h…

ODBC访问达梦数据库Ubuntu18.04 x86-x64(亲测有效)

ODBC访问达梦数据库Ubuntu18.04 x86-x64 第1步:安装unixodbc驱动,使用下面命令。第2步:拷贝已经安装好的达梦数据库驱动程序第3步:配置ODBC必要的参数文件,如下图第4步:设置环境变量第5步:连接测试 说明&am…

Linux实验六:进程间通信(二)

目录 一、实验目的二、实验内容三、实验环境四、参考代码五、实验步骤步骤1. 编辑源代码test6.c步骤2. 编译源代码test6.c步骤3. 运行可执行程序test6步骤4. 进一步调试源代码test6.c 六、实验结果七、实验总结 一、实验目的 1、理解 POSIX 和 System V 提供的 IPC 相关概念&a…

Unity 自定义房间布局系统 设计与实现一个灵活的房间放置系统 ——自定义房间区域功能

自定义房间区域功能 效果: 功能: 能够自定义房间的大小一键生成放置区域可控的放置网格点当物体放置到区域内可自动吸附物体是否可放置,放置时如果与其他物体交叉则不可放置(纯算法计算)管理房间内的物体&#xff0c…

【实战JVM】-实战篇-05-内存泄漏及分析

【实战JVM】-实战篇-05-内存泄漏及分析 1 内存溢出和内存泄漏1.1 常见场景1.2 解决内存溢出的方法1.2.1 发现问题1.2.1.1 top1.2.1.2 ViusalVM1.2.1.3 arthas1.2.1.4 PrometheusGrafana 1.2.2 堆内存状况对比1.2.3 内存泄漏原因-代码中1.2.3.1 equals()-hashCode()1.2.3.2 内部…

相机等效焦距

1. 背景 物理焦距我们很熟悉,但是在接触实际的相机参数时,相机厂家会提到一个参数等效焦距,甚至有时候不提供物理焦距,这时候如果我们得到真实的物理焦距需要进行一定的转换.在介绍两者之间的转换关系前,先介绍一下等效焦距的由来. 如上图,假设在某一个镜头,其成像面会出现图…

Linux配置java,maven,marshalsec环境

文章目录 一. Linux配置java环境1.下载jdk文件2.解压tar.gz文件3.设置java环境变量4.验证是否成功 二. Linux配置maven环境1.下载压缩包2.解压tar.gz3. 配置环境变量 三. Linux配置marshalsec环境 一. Linux配置java环境 1.下载jdk文件 mkdir /opt/javawget https://repo.hua…