Java面向对象三剑客之——多态

news/2024/11/29 1:34:51/

在这里插入图片描述

文章目录

    • 前言
    • 📕多态的概述
    • 📕多态中的成员访问特点
    • 📕多态的好处和弊端
    • 📕多态中的转型
    • 📕多态中转型存在的风险和解决方案
    • 最后说一句

前言

今天我们来学习Java多态的知识。在Java中,多态是一种强大的特性,它允许我们在运行时根据不同的对象类型来执行不同的操作,从而使代码更加灵活和可扩展。让我们来探索Java多态的奥秘!

在这里插入图片描述

📕多态的概述

  • 什么是多态

    ​ 同一个对象,在不同时刻表现出来的不同形态

  • 多态的前提

    • 要有继承或实现关系
    • 要有方法的重写
    • 要有父类引用指向子类对象
  • 代码演示

    class Animal {public void eat(){System.out.println("动物吃饭");}
    }class Cat extends Animal {@Overridepublic void eat() {System.out.println("猫吃鱼");}
    }public class Test1Polymorphic {/*多态的前提:1. 要有(继承 \ 实现)关系2. 要有方法重写3. 要有父类引用, 指向子类对象*/public static void main(String[] args) {// 当前事物, 是一只猫Cat c = new Cat();// 当前事物, 是一只动物Animal a = new Cat();a.eat();}
    }
    

📕多态中的成员访问特点

  • 成员访问特点

    • 成员变量

      ​ 编译看父类,运行看父类

    • 成员方法

      ​ 编译看父类,运行看子类

  • 代码演示

    class Fu {int num = 10;public void method(){System.out.println("Fu.. method");}
    }class Zi extends Fu {int num = 20;public void method(){System.out.println("Zi.. method");}
    }public class Test2Polymorpic {/*多态的成员访问特点:成员变量: 编译看左边 (父类), 运行看左边 (父类)成员方法: 编译看左边 (父类), 运行看右边 (子类)*/public static void main(String[] args) {Fu f = new Zi();System.out.println(f.num);f.method();}
    }
    

在这里插入图片描述

📕多态的好处和弊端

  • 好处

    ​ 提高程序的扩展性。定义方法时候,使用父类型作为参数,在使用的时候,使用具体的子类型参与操作

  • 弊端

    ​ 不能使用子类的特有成员
    在这里插入图片描述

📕多态中的转型

  • 向上转型

    ​ 父类引用指向子类对象就是向上转型

  • 向下转型

    ​ 格式:子类型 对象名 = (子类型)父类引用;

  • 代码演示

    class Fu {public void show(){System.out.println("Fu..show...");}
    }class Zi extends Fu {@Overridepublic void show() {System.out.println("Zi..show...");}public void method(){System.out.println("我是子类特有的方法, method");}
    }public class Test3Polymorpic {public static void main(String[] args) {// 1. 向上转型 : 父类引用指向子类对象Fu f = new Zi();f.show();// 多态的弊端: 不能调用子类特有的成员// f.method();// A: 直接创建子类对象// B: 向下转型// 2. 向下转型 : 从父类类型, 转换回子类类型Zi z = (Zi) f;z.method();}
    }
    

📕多态中转型存在的风险和解决方案

在这里插入图片描述

  • 风险

    如果被转的引用类型变量,对应的实际类型和目标类型不是同一种类型,那么在转换的时候就会出现ClassCastException

  • 解决方案

    • 关键字

      instanceof

    • 使用格式

      变量名 instanceof 类型

      通俗的理解:判断关键字左边的变量,是否是右边的类型,返回boolean类型结果

  • 代码演示

    abstract class Animal {public abstract void eat();
    }class Dog extends Animal {public void eat() {System.out.println("狗吃肉");}public void watchHome(){System.out.println("看家");}
    }class Cat extends Animal {public void eat() {System.out.println("猫吃鱼");}
    }public class Test4Polymorpic {public static void main(String[] args) {useAnimal(new Dog());useAnimal(new Cat());}public static void useAnimal(Animal a){  // Animal a = new Dog();// Animal a = new Cat();a.eat();//a.watchHome();//        Dog dog = (Dog) a;
    //        dog.watchHome();  // ClassCastException  类型转换异常// 判断a变量记录的类型, 是否是Dogif(a instanceof Dog){Dog dog = (Dog) a;dog.watchHome();}}
    }
    

在这里插入图片描述

最后说一句

感谢大家的阅读,文章通过网络资源与自己的学习过程整理出来,希望能帮助到大家。

才疏学浅,难免会有纰漏,如果你发现了错误的地方,可以提出来,我会对其加以修改。

在这里插入图片描述


http://www.ppmy.cn/news/40171.html

相关文章

python代码打包

没有别的技巧,你打包完成了之后就要看它的默认地址是在哪里的,这个没有办法进行修改,你只能顺着它的思路来 第一步:先切换到那个文件夹 cd C:\Users\26897\dist 第二步:再直接文件夹名字 .\xxx.exe打包文件的方法---这…

ChatGPT基础知识系列之一文说透ChatGPT

ChatGPT基础知识系列之一文说透ChatGPT OpenAI近期发布聊天机器人模型ChatGPT,迅速出圈全网。它以对话方式进行交互。以更贴近人的对话方式与使用者互动,可以回答问题、承认错误、挑战不正确的前提、拒绝不适当的请求。高质量的回答、上瘾式的交互体验,圈内外都纷纷惊呼。 …

对类和对象的理解

对象:对象是人们要进行研究的任何事物,它不仅能表示具体的事物,还能表示抽象的规则、计划或事件。对象具有状态,一个对象用数据值来描述它的状态。对象还有操作,用于改变对象的状态,对象及其操作就是对象的…

IT建设如何降本增效?选择快速开发工具应该重点考虑这7个方面

在IT行业高速发展的当下,界面化与智能化是程序开发重要特征。其中以JVS快速开发工具为例,介绍下企业选择低代码开发工具的核心关注的内容。 1、数据模型的定义:这个可能对不了解行业的人来讲有些复杂,也就是数据库表的构建模式。行…

MFC - 控件的消息和控件的事件(命令)有什么区别?

MFC的控件都能添加事件处理程序(类向导称事件为命令) 控件的消息和控件的**事件(命令)**有什么区别? 事件可能由多个消息组成,事件是消息的封装。控件的事件也是通过消息机制来处理的,所以这两…

【技术分享】华为防火墙多出口接入到Internet

组网需求 如图1所示,FW作为安全网关部署在网络出口,企业分别从ISP1和ISP2租用一条链路。 企业希望访问Server 1的报文从ISP1链路转发,访问Server 2的报文从ISP2链路转发。 当其中一条链路故障时,后续流量可以通过另一条链路转发…

maven 打包实践

Maven的打包操作 对于企业级项目,无论是进行本地测试,还是测试环境测试以及最 终的项目上线,都会涉及项目的打包操作。对于每个环境下的项目 打包,对应的项目所需要的配置资源都会有所区别,实现打包的方 式有很多种&am…

数据结构与算法01 稀疏数组

稀疏数组问题 当一个二维数组中大部分数据都是0,对这个数组直接进行存储会很浪费空间,因此利用稀疏数组进行压缩,稀疏数组第一行的第一个元素是原二维数组行数。,第一行的第二个元素是原二维数组的列数,如图为11行11列…