Java 基础进阶篇(六)—— 面向对象三大特征之三:多态

news2024/10/7 7:31:18

文章目录

  • 一、多态的概述
  • 二、多态中成员访问特点
  • 三、多态的优势与劣势
  • 四、多态下的类型转换
    • 4.2 自动类型转换(从子到父)
    • 4.2 强制类型转换(从父到子)
    • 4.3 instanceof 关键字


一、多态的概述

多态:是指执行同一个行为,会表现出不同的特征。

常见格式:

在这里插入图片描述

多态的前提: 有继承 / 实现关系;有父类引用指向子类对象;有方法重写(多态侧重行为多态)


二、多态中成员访问特点

  • 方法调用:编译看左,运行看右

    如下面例子:编译的时候是观察 Animal 对象是否有 run 方法,而运行时调用子类的方法。

  • 变量调用:编译看左,运行也看左

    如下面例子:编译的时候是观察 Animal 对象是否有 name 变量,并且运行时调用的也是父类的变量。

    public abstract class Animal {
        public String name = "动物";
        public abstract void run();
    }
    public class Dog extends Animal{
        public String name = "狗狗";
        @Override
        public void run() {
            System.out.println("狗在跑~~");
        }
    }
    public class Tortoise extends Animal {
        public String name = "乌龟";
        @Override
        public void run() {
            System.out.println("乌龟在跑~~");
        }
    }
    
    public class Test {
        public static void main(String[] args) {
            Animal dog = new Dog();
            dog.run(); // 狗在跑~~
            System.out.println(dog.name); // 动物
    
            Animal tortoise = new Tortoise();
            tortoise.run(); // 乌龟在跑~~
            System.out.println(tortoise.name); // 动物
        }
    }
    

    注:多态注重行为多态。


三、多态的优势与劣势

在多态形式下,右边对象可以实现解耦合,便于扩展和维护。

Animal a = new Dog();
a.run(); // 后续业务行为随对象而变,后续代码无需修改

定义方法的时候,使用父类型作为参数,该方法就可以接收这父类的一切子类对象,体现出多态的扩展性与便利。

public class Test {
    public static void main(String[] args) {
        Animal dog = new Dog();
        Animal tortoise = new Tortoise();
        run(dog); // 狗在跑~~
        run(tortoise); // 乌龟在跑~~
    }

    public static void run(Animal animal){
        animal.run();
    }
}

多态下会产生一个问题:多态下不能使用子类的独有功能,因此可利用强制类型转换解决此问题。


四、多态下的类型转换

4.2 自动类型转换(从子到父)

子类对象赋值给父类类型的变量指向。

在这里插入图片描述


4.2 强制类型转换(从父到子)

格式:子类 对象变量 = (子类)父类类型的变量

作用:可以解决多态下的劣势,可以实现调用子类独有的功能

注意:如果转型后的类型和对象真实类型不是同一种类型,那么在转换的时候就会出现类型转换异常 ClassCastException。

在这里插入图片描述


4.3 instanceof 关键字

Java 建议强转前使用 instanceof 判断当前对象的真实类型,再进行强制转换。

在这里插入图片描述

判断关键字左边的变量指向的对象的真实类型,是否是右边的类型或者是其子类类型,是则返回 true,反之返回 false。

例1:调用子类独有功能。

public class Animal {
    public String name = "动物";
    public void run(){
        System.out.println("动物可以跑~~");
    }
}
public class Dog extends Animal {
    public String name = "狗狗";
    @Override
    public void run() {
        System.out.println("狗在跑~~");
    }

    /**
      独有功能
     */
    public void lookDoor(){
        System.out.println("狗在看门!");
    }
}

public class Tortoise extends Animal {
    public String name = "乌龟";

    @Override
    public void run() {
        System.out.println("乌龟在跑~~");
    }

    /**
     独有功能
     */
    public void layEggs(){
        System.out.println("乌龟在下蛋!");
    }
}
public class Test1 {
    public static void main(String[] args) {
        // 自动类型转换
        Animal a = new Dog();
        a.run();
        // a.lookDoor(); // 多态下无法调用子类独有功能

        // 强制类型转换:可以实现调用子类独有功能的
        // 规定:有继承或者实现关系的 2 个类型就可以强制类型转换,运行时可能出现问题。
        // Tortoise t = (Tortoise) a; // 报错。编译阶段可以强制执行不会出错,运行时可能会出错
        Dog d = (Dog) a; // 因为 a 可能不是 Dog,可能是 Tortoise,因此需要强转
        d.lookDoor();

        // 建议强制转换前,先判断变量指向对象的真实类型,再强制类型转换。
        if(a instanceof Tortoise){
            Tortoise t = (Tortoise) a;
            t.layEggs(); // 调用子类独有的功能
        }else if(a instanceof Dog){
            Dog d1 = (Dog) a;
            d1.lookDoor();
        }
    }
}

例2:多态作为参数的实例。

public class Test2 {
    public static void main(String[] args) {
        Animal a1 = new Dog();
        go(a1);
    }

    public static void go(Animal a){
        System.out.println("预备~~~");
        a.run();
        // 独有功能
        if(a instanceof Tortoise){
            Tortoise t = (Tortoise) a;
            t.layEggs();
        }else if(a instanceof Dog){
            Dog d1 = (Dog) a;
            d1.lookDoor();
        }
        System.out.println("结束~~~~");
    }
}

文章参考:Java入门基础视频教程,java零基础自学就选黑马程序员Java入门教程(含Java项目和Java真题)

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

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

相关文章

自动驾驶——最优控制算法里卡提方程推导【连续系统】

1. Why use the Riccati equation? Q、R就是需要设计的半正定矩阵和正定矩阵。考虑根据实车的情况去标定此参数,从理论和工程层面去理解,如果增大Q、减小R,则此时控制系统响应速度比较快速(比较剧烈)&…

[SpringBoot]什么是服务器前后端的一个流程图bmi练习案例

前点: 服务器: 服务器就是一台高性能的电脑, 在电脑上安装了提供XXX服务的软件, 这台电脑就可以称为XXX服务器 - 举例: - 数据库服务器: 在电脑上安装了提供数据增删改查服务的软件(DBMS) - 邮件服务器: 在电脑上安装了提供邮件收发服务的软件 - FTP服务器: …

普通的2D Average pooling是怎么进行backward的呢?

二维平均池层计算损失相对于其输入张量的梯度,方法是将损失相对于输出张量的梯度均分在输入子区域,这些子区域在前向传播中被用来计算平均值。 由于平均集合计算的是每个输入子区域的平均值,所以子区域中的每个元素对平均值的贡献是相同的。…

Java Servlet_HTTP

今日内容 零、 复习昨日 一、Servlet 二、HTTP 三、HttpServlet 零、 复习昨日 见晨考 一、Servlet 1.1 介绍 javaweb开发,就是需要服务器接收前端发送的请求,以及请求中的数据,经过处理(jdbc操作),然后向浏览器做出响应. 我们要想在服务器中写java代码来接收请求,做出响应,我…

SignOff Criteria——AOCV(Advanced OCV) introduction

文章目录 1. O v e r v i e w Overview Overview2. A O C V P r i n c i p l e I n t r o d u c t i o n AOCV\ Principle\ Introduction AOCV Principle Introduction2.1 G B A − A O C V GBA-AOCV GBA−AOCV2.1.1 A b o u t L o g i c a l D e p t h About\ Logical\ De…

第六章 Iptables与Firewalld防火墙

第六章 Iptables与Firewalld防火墙 一、Iptables 1、策略与规则链 (1)、防火墙策略规则的设置 一种是“通”即放行,另一种是“堵”即阻止。 当防火墙的默认策略为拒绝时(堵),就要设置允许规则通&#x…

NECCS|全国大学生英语竞赛C类|听力|短对话|14:20~15:30

目录 一、短对话 1. 定位词 2. 场景词汇 (1)餐馆用餐 (2)商场用语 (3)校园用语 (4)图书馆用语 二、题目类型 1. 人物类 考点聚焦 2. 地点类 主要涉及 3. 数字类 4. 主题…

【数据库】JDBC编程

前言 小亭子正在努力的学习编程,接下来将开启javaEE的学习~~ 分享的文章都是学习的笔记和感悟,如有不妥之处希望大佬们批评指正~~ 同时如果本文对你有帮助的话,烦请点赞关注支持一波, 感激不尽~~ 目录 前言 什么是JDBC? JDBC工…

sql注入(三)绕过方法及防御手段

一、sql注入的绕过方法 1.注释符过滤绕过 常用的注释符有: 1)-- 注释内容 2)# 注释内容 3)/* 注释内容 */ 绕过方法 构造闭合: ?id1 and sql语句 and 11 这样接收源码前面的引号被 id1 中的后引号所闭合&…

关于MPU的笔记

MPU(memory protection unit)内存保护单元。这些系统必须提供一种机制来保证正在运行的任务不破坏其他任务的操作。即要防止系统资源和其他一些任务不受非法访问。嵌入式系统有专门的硬件来检测和限制系统资源的访问。它能保证资源的所有权,任…

unity 性能优化之画质分级

如果你的游戏兼容多平台,或者当前平台的设备也有硬件差距,比如低端设备就是带不动你的画质,无论如何你如何优化就是带不动。这种情况下,我们可以考虑对画质进行分级,减少一些特性,来提高运行质量。接下来我…

JavaWeb《HTML基础标签》

本笔记学习于Acwing平台 MDN官方文档https://developer.mozilla.org/zh-CN/ 目录 1. html文件结构 2. 文本标签 3. 图片 4. 音频和视频 5. 超链接 6. 表单 7. 列表 8. 表格 9. 语义标签 10. 特殊符号 1. html文件结构 文档结构 html的所有标签为树形结构&#xff…

AI模型推理(3)——ModelMesh使用

参考: ModelMesh installation - KServe Documentation Website ModelMesh Overview - KServe Documentation Website 前言 Kserve提供了“Serverless”和“ModelMesh”两种安装模式。其中Serverless是通过Knative组件实现动态扩缩容等功能。而ModelMesh则是另一…

华南X99F8D开不了机——主板出现错误码67的解决方案

华南X99F8D开不了机——主板出现错误码67的解决方案 前言 笔者的双路e5:大数据双路e5主机搭建:2696v3256g内存 配置: 主板:x99f8d CPU:e5 2696v3 *2 【36核72线程】 内存条:DDR4 ECC 32G *8 【256G】 显…

Nginx + LVS + KeepAlived实现高可用集群

文章目录 一、名词解释1、高可用集群2、LVS3、Keepalived 二、搭建流程1、安装Docker2、安装Nginx3、安装Keepalived4、编写nginx_check.sh脚本 一、名词解释 1、高可用集群 对于中小型互联网公司,产品所承受的请求量还是比较低的,所以一般使用单节点N…

碳中和专题:智慧城市建设能否提高碳生产率?—基于中国智慧城市试点的准自然实验

一.研究内容 目前,中国面临着如何在保证经济增长的前提下实现减排目标的困境。智能城市建设作为一种新型的城市发展模式,有可能成为解决这一问题的关键。本文使用多周期双重差分DID模型进行实证分析,旨在评估智能城市试点政策对碳生产率的影响…

论文笔记:Model-Contrastive Federated Learning

0 简介 论文:Model-Contrastive Federated Learning 代码:https://github.com/QinbinLi/MOON 相关链接:本文主要是将SimCLR对比学习的思想迁移到联邦学习中,关于SimCLR的介绍见https://blog.csdn.net/search_129_hr/article/deta…

最好的物联网教程:软硬结合——从零打造物联网

在大学里不同专业有着不同的追求:机械类与强电类专业学生追求的是 “机电合一” ,既懂机械又懂电气,整个电气机械自动化便能打通。弱电类专业学生追求的是 “软硬结合” ,既懂硬件又懂软件,整个电子产品便能打通。我作…

唱作音乐人朱卫明新歌全网首发,当初恋遇到《龙仙街》

今年唱作音乐人朱卫明正式出道25周年了!为纪念这个生涯里程碑,朱卫明近日在酷狗音乐首发全新单曲《龙仙街》,上酷狗搜索“朱卫明”,即可抢先收听。 这首歌是继《酒吧情歌》《不爱她》《只要陪着你》《有缘无分》《断了吧》《疯狂爱…

Linux——基础IO

目录 C语言文件操作 fprintf​编辑 Linux下的文件操作(文件的系统调用接口) open open的第三个参数 open的第二个参数 write read 文件描述符fd 进程与被打开文件的关系(理解的关键) 见见猪跑 fd文件描述符的分配规则 结论 重定向 输入重定向原理 输出重…