一文讲解——Java多态

news2024/9/22 15:39:10

目录

  • 一、什么是多态?
  • 二、转型
    • 向上转型
    • 向下转型
  • 三、方法覆盖与方法重载
  • 四、绑定
    • 动态绑定
    • 静态绑定
  • 五、理解多态

在这里插入图片描述

一、什么是多态?

多态的词组字面意思是: 某种事物多种形态。
但是对于我们学习Java 的程序原来说,就不不能简单这样来理解了。
多态是 完成某个行为,不同的对象去实现会有不同的效果。现在还看不懂其实没关系,也就简单提一嘴。

举个栗子:
在这里插入图片描述

有一天,学校二食堂做了一大盘深海大闸蟹,你和小帅同时在排队。此时一位长得very beautiful 的女生——小美来了,到窗口看了一下菜,感觉不错,也想吃。但是排队的人太多了,就想插下队。你一看,我丢想插队,门都没有,表现出不肯的样子。而你后面的小帅眼睛一亮,就说,小美同学你好,我看你插队的话影响不好,不如我多打一份给你,倒时候加个微信发我就行了。此时这就是多态,不同的人对一件事表现出不同的状态。到头来‘你’还在为什么,自己还单身着。小帅到后面,小美微信也加了,说:就一顿饭钱也没多少,算了算了。此时小美就非常感动,说:小帅同学下次我会请你吃一顿。这样一来而去。。。

磨刀不误砍柴功,要想学真正学会多态就要理解一下,向上转型是怎么转的?静态绑定是怎么绑定的,方法的覆盖是?最后,学完才可以说学会了Java 的多态,太哇塞了!!!

二、转型

向上转型

向上转型: 父类 引用 子类型对象
也好理解 儿子孝顺父亲,给父亲买点礼物,父亲乐意地接受了。

例子:创建一个父类 Animal 其子类有Dog, Cat
测试类 Test

public class Animal {
    public String name;
    //无参构造方法
    public Animal() {

    }
 	//有参构造方法
    public Animal(String name) {
        this.name = name;
    }

	//动物会说方法
    public void speak() {
        System.out.println("会说话-----------");
    }

}

public class Cat extends Animal{
	//无参构造方法
    public Cat() {
    }

	//有参构造方法
    public Cat(String name) {
        super(name);//子类继承父类,就要先对父类进行初始化
    }
    public void speak() {
        System.out.println(this.name+"会喵喵叫-----");
    }

}

public class Dog extends Animal{
	//无参构造方法
    public Dog() {
    }
	//有参构造方法
    public Dog(String name) {
        super(name); //子类继承父类,就要先对父类进行初始化
    }
    
    public void speak() {
        System.out.println(this.name+"会汪汪叫------");
    }
    
    //dog 特有的方法
    public void lookHouse() {
        System.out.println(this.name+"会看家-----------");
    }
    
}

public class Test {
    public static void main(String[] args) {
        Animal dog = new Dog("小黑");
        dog.speak();
        
       Animal cat = new Cat("小咪");
       cat.speak();


    }
}

有三种表示方式
1.直接赋值
在这里插入图片描述

2.方法传参
在这里插入图片描述

3.返回值
在这里插入图片描述

总结
优点 父类可以接受任何的子类

又创建了一个Cat 类 ,也是可以接受的
在这里插入图片描述
缺点 不能调用子类特有方法,因为你还是Animal 类!在这里插入图片描述

向下转型

父类强转子类

Animal 转为 Dog子类
a instanceof b : 判断 a 是否为b类型 。是返回 true ,否返回false


public class Test {
    public static void main(String[] args) {
        Animal animal = new Dog("小黑");

        if(animal instanceof Dog) { 
            Dog dog = (Dog)animal;
            
            //可以 调用子类特有的方法
            dog.lookHouse();
        }


    }
}

注意了 强转是要注意 子类一致
一开始是狗,怎么强转成猫呢?
就像养一只小狗,再怎么养,也不会变成小猫。因为一生下来就决定了的。


public class Test {
    public static void main(String[] args) {
        Animal animal = new Dog("小黑");
        
        
        Cat cat = (Cat) animal; //error
        cat.speak(); //error
    }
}

在这里插入图片描述

总结:在这里插入图片描述

三、方法覆盖与方法重载

方法重载: 我想大家都应该知道:就是在同一个类中,方法名相同,参数列表不同。就只要记住一个方法名,就可以调用不同的参数列表,提高了效率。

以add() 加法为例子:

public class Test {
    public static void main(String[] args) {

        System.out.println("方法重载");
        //相同 add方法名,不同参数列表。构成方法重载
        System.out.println(add(1,5));
        System.out.println(add(1,2,3));
        
    }

	
    public static int add(int a,int b) {
        return a+b;
    }
    
    public static int add(int a,int b,int c) {
        return a+b+c;
    }
}

方法覆盖: 也叫方法重写。发生在父子类之间的关系,方法名相同,参数列表相同,返回值也要相同。
也好理解,重写是重新再写一遍呗,不改变原来的
父类的方法完成不了子类的需求,就要重写
在这里插入图片描述
方法覆盖也存在一些细节
1.static ,final ,private 修饰的方法,构造方法 不能被重写。
2.子类重写的方法,访问权限要 >= 父类 原来的方法。
3.重写方法的返回值类型也可不同,但是要构成父子类关系
在这里插入图片描述

四、绑定

动态绑定

动态绑定是理解多态的基础。
那什么是动态绑定呢?
程序在编译的时候,确实是调用了父类的方法。但在运行的时候,通过父类的引用,调用的却是子类重写父类的那个方法。这就叫动态绑定。

还是以之前的Animal ,Dog 为例子:
不是输出: 会说话-------在这里插入图片描述

静态绑定

“静态绑定"也称为"早期绑定”。
简单 就相当于平时调用方法 。就是调用这个方法时,编译器确定调用这个方法。

public class Test {
    public static void main(String[] args) {
        Test test = new Test();
        
        test.func(); //确定调用func()

    }

    public  void func() {
        System.out.println("我就是一个普通的方法------");
    }
}

五、理解多态

现在,我们学习了
向上转型 就是父类型 引用 子类型对象 ,方法的重写是 父类的方法完成不了子类的需求,就要重写。 静态绑定:运行是调用子类重写父类的方法。

请看

public class Test {
    public static void main(String[] args) {

        Animal dog = new Dog("小黑");
        Animal cat = new Cat("小花");
        autoSpeak(dog);
        autoSpeak(cat);
    }
    public static void autoSpeak(Animal animal) {
        animal.speak();
    }
}

在这里插入图片描述
在这里插入图片描述

autoSpeak() 方法就会自动的调用 子类的speak()方法。
不要判断 是否为 Dog 类 还是 Cat 类。
1.能够降低代码的 “圈复杂度”, 避免使用大量的 if - else
2.可扩展能力强

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

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

相关文章

Jupyter Notebook:FileNotFoundError: [WinError 2] 系统找不到指定的文件怎么解决

打开Jupyter notebook时New 文件没有搭建的tensorflow环境,同时新建python3时,提示kernels 错误,提示信息:FileNotFoundError: [WinError 2] 系统找不到指定的文件。 由于Anaconda安装多个版本的python,或者由于多次卸…

55. UE5 RPG 处理当前功能在多人模式中的问题

在UE里面,我们运行项目可以设置多种网络模式,主要是分为三种: 运行Standalone 就是单人模式,没有网络交互以监听服务器运行,在界面里运行的游戏会作为服务器使用以客户端运行,UE会单独运行一个线程作为服务…

操作系统课程实验1-进程调度模拟实验

操作系统课程实验1-进程调度模拟实验 一、实验介绍 1.1 实验目的 本实验模拟在单处理机环境下的处理机调度,帮助理解进程调度的概念,深入了解进程控制块的功能,以及进程的创建、撤销和进程各个状态间的转换过程。 1.2 实验内容 进程调度算…

当HR问你是否单身时,该怎么回答?

知识星球(星球名:芯片制造与封测技术社区,星球号:63559049)里的学员问:我是晶圆厂厂务工程师,最近在面试新工作,但是几乎每家HR都会问我同一个问题:你结婚没有&#xff1…

专业的力量:在自己的领域成为专家

专业的力量:在自己的领域成为专家 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 现在稀缺的已不再是信息资源,而是运用信息的能力。过去的海…

【全开源】场馆预定系统源码(ThinkPHP+FastAdmin+UniApp)

一款基于ThinkPHPFastAdminUniApp开发的多场馆场地预定小程序,提供运动场馆运营解决方案,适用于体育馆、羽毛球馆、兵乒球馆、篮球馆、网球馆等场馆。 场馆预定系统源码:打造高效便捷的预定体验 一、引言:数字化预定时代的来临 …

计算机毕业设计Python+Spark+PyTroch游戏推荐系统 游戏可视化 游戏爬虫 神经网络混合CF推荐算法 协同过滤推荐算法 steam 大数据

毕业设计(论文) 基于SpringBoot的游戏防沉迷系统的设计与实现 摘 要 随着网络游戏市场的持续火爆,其最明显的负面影响----“网络游戏沉迷问题”已成为当前社会普遍关心的热点问题。根据2010年8月1日实施的《网络游戏管理暂行办法》,网络游…

记忆力和人才测评,如何提升记忆力?

什么是记忆力? 如何通俗意义上的记忆力?我们可以把人的经历、经验理解成为一部纪录片,那么已经过去发生的事情,就是影片之前的情节,对于这些信息,在脑海里,人们会将其进行处理和组合&#xff…

如何关闭或者减少屏蔽 CloudFlare 的真人检测

经常浏览境外网站的应该常碰到一个真人检测的提示(如下图所示)。最近,明月就收到了一个知乎上的付费咨询:问我如何去掉这个提示,由此明月也特别的研究了一下这个“真人检测”,这算是 CloudFlare 的一个特色了,基本上大家看到站点访问有这个提示的几乎都是用了 CloudFlar…

vue3 ts问题 找不到模块“@/views/home/index.vue”或其相应的类型声明。

1. 找不到模块“/views/HomeView.vue”或其相应的类型声明 今天帮同事看了一个问题,他尝试用vitevue3tspinia创建项目,结果刚上来就遇到这么一个问题 2. 解决办法 出现这个问题的原因就是:ts只支持导出导入模块,但是vue不是模块…

CRMEB开源商城标准版系统前端技术架构与实践探索

摘要: 随着电子商务的蓬勃发展,开源商城系统因其灵活性、可扩展性和成本效益受到了广泛关注。本文以CRMEB开源商城系统为例,探讨了其前端技术架构、开发实践及未来展望。通过对CRMEB系统前端技术的深入分析,旨在为开发者提供有价值…

最大子矩阵+01矩阵

最大子矩阵 题目 思路 确定一个矩阵中的子矩阵,只需要确定矩阵对角线上两点的坐标即可, 在确定了子矩阵之后,还需要计算子矩阵中各元素之和,如果按照常规的循环方法来解决,时间复杂度是O(N^6),对于本题20…

Java——图书管理系统万字详解(附代码)

框架搭建 book包 将书相关的放到book包中,创建一个Book类用来设置书的属性,包括书名、作者、价格、类型、是否被借出等。 以上属性均被private所修饰 利用编译器生成构造方法(不需要构造isBorrowed,因为其初始值为false&#…

2024年5月大语言模型论文推荐:模型优化、缩放到推理、基准测试和增强性能

前一篇文章总结了关于计算机视觉方面的论文,这篇文章将要总结了2024年5月发表的一些最重要的大语言模型的论文。这些论文涵盖了塑造下一代语言模型的各种主题,从模型优化和缩放到推理、基准测试和增强性能。 大型语言模型(llm)发展迅速,跟上…

8个图神经网络的典型用例

虽然 ChatGPT 或 Diffusion 模型等 AI 系统最近备受关注,但图神经网络 (GNN) 却发展迅速。在过去的几年中,GNN 悄然成为众多激动人心的新成就背后的黑马,这些成就从纯学术研究突破一路发展到大规模积极部署的实际解决方案。 Uber、谷歌、阿里…

idea configuration 配置 方便本地启动环境切换

idea 再项目启动的时候避免切换环境导致上线的时候出现环境配置问题 可以再idea 的 configuration 中配置项目的 vm options 虚拟机的内容占用 -Xmx256m -Xms256m -Xmn100m -Xss256k program arguments properties 文件中需要修改的配置参数 active profiles 指定启动的本…

快速幂求逆元与逆元

我上一篇博客链接写的是多个数求乘法逆元而快速幂求逆元用于单个数求乘法逆元 逆元是对分数取模用的 对于除法取模不成立,即(a/b)%p≠(a%p/b%p)%p。求逆元的思路:(一般ACM的题目都是对1e97这种素数取模,所以gcd(a,p)1)a*b1(mod p) > b1/a…

毕设 大数据校园卡数据分析

文章目录 0 前言1 课题介绍2 数据预处理2.1 数据清洗2.2 数据规约 3 模型建立和分析3.1 不同专业、性别的学生与消费能力的关系3.2 消费时间的特征分析 4 Web系统效果展示5 最后 0 前言 🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设…

STM32F1之OV7725摄像头·像素数据输出时序、FIFO 读写时序以及摄像头的驱动原理详解

STM32F1之OV7725摄像头-CSDN博客 STM32F1之I2C通信-CSDN博客 目录 1. 像素数据输出时序 2. FIFO 读写时序 2.1 写时序 2.2 读时序 3. 摄像头的驱动原理 1. 像素数据输出时序 主控器控制 OV7725 时采用 SCCB 协议读写其寄存器,而它输出图像时则使用 VGA 或…

【Linux signal】

Linux signal 一、信号分类二、什么是信号集?三、信号的3个处理过程3.1 发送信号3.1.1 向自身发送信号(raise)3.1.2 向别的进程发送信号(kill)3.1.3 发送闹钟信号(alarm) 3.2 接收(注册)信号3.3 处理信号 在Linux操作系统中,SIGUSR1和SIGUSR2是用户定义的…