Java 多态

Java 多态

文章目录

在这里插入图片描述

多态

  1. 什么是多态?为什么要使用多态?
    简单来说是多种形态,具体来说是去完成某个事情,当不同对象去完成同一件事表现出来的不同结果/状态

打个比方就是同一个人对待不同人表现出来的形态是不同的

在这里插入图片描述


2. 多态实现的三个条件:

在这里插入图片描述

向上转型和向下转型

在这里插入图片描述

向上转型和重写

  1. 将子类对象给父类类型的引用
    父类类型 对象名 = new 子类类型()

直接赋值的

classAnimal{publicString name;publicint age;publicAnimal(String name,int age){this.name = name;this.age = age;}// 父类中的this是当前对象的引用publicvoideat(){System.out.println(this.name +" ");}}classDogextendsAnimal{publicDog(String name,int age){super(name,age);// 调用父类的构造方法进行从父类继承过来的成员的构造}publicvoidback(){System.out.println(this.name +"汪汪汪 ");}}publicclass test {publicstaticvoidmain(String[] args){// 向上转型Animal animal =newDog("小白",3); animal.eat();// 调用父类自己的eat}}
  1. 传返回值的向上转型

第二种向上转型,传参的

在这里插入图片描述
在这里插入图片描述
  1. 重写的三个条件:
    父类实现的方法不满足你需要的功能的时候可以进行重写

a. 方法的返回值一样
方法名一样
方法的参数列表一样

b. 被重写的方法的访问修饰限定符子类中的要大于等于父类的

权限大小:private < 默认的 < protected < public

c. 被private的方法是不能被重写的

d. 被static修饰的方法是不能被重写的

e. 被final修饰的方法是不可以被重写的,因为具有了常性

f. 构造方法也是不可以被重写的

publicfinalvoideat(){// ...}

被重写的方法返回值类型可以不同,但必须是父子关系

在这里插入图片描述

重写:在子类和父类中有同名的方法,
这时候子类对象给父类类型的引用(向上转型),使用该对象再调用,调用的是子类的方法,不再是父类的方法
上面的过程叫做动态绑定

下面是子类重写了父类的eat

在这里插入图片描述

@override可以提示你重写是否写错了,提示语法错误

在这里插入图片描述

重写和重载的区别

在这里插入图片描述
  1. object类是所有类的父类

Dog类重写了自己的toString,就使用自己的toString
没有重写就调用父类的toString

在这里插入图片描述

动态绑定和静态绑定

  1. 静态绑定:在编译的时候就确定了调用哪个方法,比如重载

动态绑定:在编译的时候不能确定,在运行时确定调用哪个方法,比如重写

在这里插入图片描述


在这里插入图片描述

用代码来解释什么是多态

在这里插入图片描述

不能调用子类特有的方法,只能调用父类的方法,重写啦才调用子类的方法(而且是同一个名字的方法,比如eat())

在这里插入图片描述

向下转型

  1. 父类对象给子类类型的引用

如果animal引用的对象是Cat对象的实例,如果是就成功,不是就走下面的打印

在这里插入图片描述

向下转型不安全

在这里插入图片描述

多态的优点

  1. 能够降低代码的圈复杂度,避免使用大量的if-else
  2. 一段代码中条件语句和循环语句出现的个数 , 这个个数就称为 " 圈复杂度 ".

不使用多态,打印下列图形?

classShape{publicvoiddraw(){System.out.println("画图");}}classRectextendsShape{@Overridepublicvoiddraw(){System.out.println("⬜");}}classCycleextendsShape{@Overridepublicvoiddraw(){System.out.println("⚪");}}classFlowerextendsShape{@Overridepublicvoiddraw(){System.out.println("❀");}}classTest2{publicstaticvoiddrawShapes(){Rect rect =newRect();Cycle cycle =newCycle();Flower flower =newFlower();String[] shapes ={"cycle","rect","cycle","rect","flower"};for(String shape : shapes){if(shape.equals("cycle")){ cycle.draw();}elseif(shape.equals("rect")){ rect.draw();}else{ flower.draw();}}}publicstaticvoidmain(String[] args){drawShapes();}}

使用多态

publicstaticvoidmain(String[] args){Shape shapes ={newCycle(),newRect(),newCycle(),newRext(),newFlower()};// 向上转型for(Shape shape : shapes){ shape.draw();}}
  1. 可扩展能力强
    如果要新增一种新的形状,使用多态该代码成本也比较低
classFlowerextendsShape{publicvoiddraw(){System.out.println("花!");}}
  1. 属性没有多态
    当父类的成员变量和子类的成员变量同名时,通过父类引用,只能访问父类的变量
  2. 构造方法是没有多态的,因为不能重写,重写会造成构造的混乱
在这里插入图片描述


在这里插入图片描述

总结

  1. 向上转型有什么用?
    是重写的前提,一个子类对象给父类类型的引用
  2. 动态绑定有什么用?
    是实现多态的基础,在编译的时候不确定调用哪个方法,在运行的时候确定调用哪个方法
    动态绑定在编译时显示地是调用父类的方法,但是在运行时显示的是调用子类重写父类的方法

多态主要就是下图中的三点

在这里插入图片描述

Read more

Flutter 三方库 rbush 的鸿蒙化适配指南 - 在鸿蒙系统上构建极致、极速、基于 R-Tree 算法的工业级 2D 空间索引与大规模点位碰撞检测引擎

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 rbush 的鸿蒙化适配指南 - 在鸿蒙系统上构建极致、极速、基于 R-Tree 算法的工业级 2D 空间索引与大规模点位碰撞检测引擎 在鸿蒙(OpenHarmony)系统的地理信息系统(GIS)、高性能 2D 游戏引擎、或者是需要对成千上万个矩形/点位进行毫秒级“范围查询(Range Search)”的应用中,如何摆脱由于线性扫描(O(n))导致的由于由于性能瓶颈?rbush 为开发者提供了一套工业级的、基于高级 R-Tree 算法。管理过程。由于由空间索引方案。本文将深入实战其在鸿蒙业务逻辑层空间数据处理中的应用。 前言 什么是 RBush?它是一个旨在解决“如何快速在一个平面找到一群物体”的高性能数据结构。它采用了 R-Tree

By Ne0inhk
coding ability 展开第四幕(滑动指针——巩固篇)超详细!!!!

coding ability 展开第四幕(滑动指针——巩固篇)超详细!!!!

文章目录 * 前言 * 水果成篮 * 思路 * 找到字符串中所有字母异位词 * 思路 * 串联所有单词的子串 * 思路 * 最小覆盖子串 * 思路 * 总结 前言 本专栏上一篇博客,带着大家从认识滑动窗口到慢慢熟悉 相信大家对滑动窗口已经有了大概的认识 其实主要就是抓住——一段连续的区间 今天来学习一些滑动窗口进阶的题目 fellow me 水果成篮 思路 一开始看到这个题目,一段连续的区间,想到了滑动窗口 然后就想着怎么维护窗口,每次更新到新的水果种类就要,开始对left++,然后处理数据 其实是有点麻烦的,但是经过半个多小时的调试,最后还是ac了 思路:每次更新两个种类的水果,x,y,如果下一个水果的种类不相符合,就更新新的x,y 这个时候 right - 1 和 right 所对应的水果就是新的两种,然后就是处理从 left 到 right

By Ne0inhk
Flutter 三方库 collection 的鸿蒙化适配指南 - 实现具备高级集合操作与相等性深度判定算法的算法底座、支持端侧多维数据结构的高性能治理实战

Flutter 三方库 collection 的鸿蒙化适配指南 - 实现具备高级集合操作与相等性深度判定算法的算法底座、支持端侧多维数据结构的高性能治理实战

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 collection 的鸿蒙化适配指南 - 实现具备高级集合操作与相等性深度判定算法的算法底座、支持端侧多维数据结构的高性能治理实战 前言 在进行 Flutter for OpenHarmony 开发时,面对复杂的业务 JSON 转化、深层嵌套的集合对比或需要对列表执行高频的优先级排序(Priority Queue)时,原生 List 和 Map 的功能往往显得捉襟见肘。collection 是 Dart 官方维护的最权威、最核心的集合工具库。本文将探讨如何在鸿蒙端构建极致、稳健的数据处理架构。 一、原直观解析 / 概念介绍 1.1 基础原理 该库扩展了 Dart 标准库中的集合能力。它不仅提供了如 Equality(深度相等判定)、PriorityQueue(

By Ne0inhk