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

《C++ 递归、搜索与回溯》第1题:汉诺塔问题

《C++ 递归、搜索与回溯》第1题:汉诺塔问题

🔥个人主页:Cx330🌸 ❄️个人专栏:《C语言》《LeetCode刷题集》《数据结构-初阶》《C++知识分享》 《优选算法指南-必刷经典100题》《Linux操作系统》:从入门到入魔 《Git深度解析》:版本管理实战全解 🌟心向往之行必能至 🎥Cx330🌸的简介: 前言: 聚焦算法题实战,系统讲解三大核心板块:“精准定位最优解”——优选算法,“简化逻辑表达,系统性探索与剪枝优化”——递归与回溯,“以局部最优换全局高效”——贪心算法,讲解思路与代码实现,帮助大家快速提升代码能力 目录 前言: 递归,搜索与回溯算法前置知识 1. 汉诺塔 算法原理(递归): 思路: 算法流程: 解法代码(C++): 博主手记(字体还请见谅哈): 结尾: 递归,搜索与回溯算法前置知识 1. 汉诺塔 题目链接: 面试题 08.

By Ne0inhk
C++ 虚函数与纯虚函数:多态的核心实现基石

C++ 虚函数与纯虚函数:多态的核心实现基石

C++ 虚函数与纯虚函数:多态的核心实现基石 💡 学习目标:深度理解虚函数与纯虚函数的本质区别,掌握虚函数表的底层原理,能够灵活运用二者设计具备多态特性的类结构。 💡 学习重点:虚函数的声明与重写规则、纯虚函数与抽象类的使用场景、虚函数表的工作机制、虚函数的常见陷阱与解决方案。 一、虚函数的本质与定义 ✅ 结论:虚函数是 C++ 实现动态多态的核心,通过在基类成员函数前添加 virtual 关键字,允许派生类重写该函数,并在运行时根据对象的实际类型调用对应版本。 1.1 虚函数的声明语法 虚函数的声明必须在基类中进行,语法格式如下: class 基类名 {public:virtual 返回值类型 函数名(参数列表){// 函数体}}; 1.2 虚函数的核心特性 1. 运行时绑定:函数调用关系在程序运行时确定,而非编译时。 2. 重写规则:派生类重写的函数必须与基类虚函数的函数名、参数列表、返回值类型完全一致(协变类型除外)。 3.

By Ne0inhk
C++可变参数队列与压栈顺序:从模板语法到汇编调用约定的深度解析

C++可变参数队列与压栈顺序:从模板语法到汇编调用约定的深度解析

C++可变参数队列与压栈顺序:从模板语法到汇编调用约定的深度解析 本文聚焦一个具体而关键的技术主题:C++ 可变参数模板(Variadic Templates)。我们将从现代 C++ 的优雅写法出发,深入剖析其在 x86-64 架构下的真实行为,特别澄清一个长期被误解的核心问题——可变参数是否“从右向左压栈”?它们在寄存器和栈中究竟是如何排布的? 如果你正在实现一个类型安全的消息队列、日志系统或任务调度器,并希望理解 enqueue(1, "hello", 3.14) 这行代码在 CPU 层面到底发生了什么,那么这篇文章就是为你量身打造的。 一、引言:可变参数 ≠ va_list —— 一场范式革命 很多初学者将 C++ 的可变参数模板与 C 语言的 va_list 混为一谈。这是重大误区,甚至会导致错误的性能假设和安全漏洞。 1.1

By Ne0inhk

[特殊字符]2026 最新 C++ 学习路线图|从零基础到大厂 Offer|保姆级完整版(建议收藏)

简介:零基础学 C++ 最全路线,语法 + 进阶 + 高级 + 项目 + 面试一站式通关。 一、前言:为什么现在还要学 C++? 很多同学问我:Python、Java 这么火,还有必要学 C++ 吗? 答案非常肯定:必须学! C++ 是性能之王,是所有大厂后端、游戏、嵌入式、音视频、自动驾驶、数据库、中间件的核心语言。 1.1 C++ 就业方向 * 后端开发(字节、腾讯、阿里、百度、美团) * 游戏开发(Unity、Unreal、客户端、服务器) * 嵌入式 / 物联网 / 单片机 * 音视频、

By Ne0inhk