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

【OpenClaw从入门到精通】第10篇:OpenClaw生产环境部署全攻略:性能优化+安全加固+监控运维(2026实测版)

【OpenClaw从入门到精通】第10篇:OpenClaw生产环境部署全攻略:性能优化+安全加固+监控运维(2026实测版)

摘要:本文聚焦OpenClaw从测试环境走向生产环境的核心痛点,围绕“性能优化、安全加固、监控运维”三大维度展开实操讲解。先明确生产环境硬件/系统选型标准,再通过硬件层资源管控、模型调度策略、缓存优化等手段提升响应速度(实测响应效率提升50%+);接着从网络、权限、数据三层构建安全防护体系,集成火山引擎安全方案拦截高危操作;最后落地TenacitOS可视化监控与Prometheus告警体系,配套完整故障排查清单和虚拟实战案例。全文所有配置、代码均经实测验证,兼顾新手入门实操性和进阶读者的生产级部署需求,帮助开发者真正实现OpenClaw从“能用”到“放心用”的跨越。 优质专栏欢迎订阅! 【DeepSeek深度应用】【Python高阶开发:AI自动化与数据工程实战】【YOLOv11工业级实战】 【机器视觉:C# + HALCON】【大模型微调实战:平民级微调技术全解】 【人工智能之深度学习】【AI 赋能:Python 人工智能应用实战】【数字孪生与仿真技术实战指南】 【AI工程化落地与YOLOv8/v9实战】【C#工业上位机高级应用:高并发通信+性能优化】 【Java生产级避坑指南:

By Ne0inhk
ARM Linux 驱动开发篇--- Linux 并发与竞争实验(互斥体实现 LED 设备互斥访问)--- Ubuntu20.04互斥体实验

ARM Linux 驱动开发篇--- Linux 并发与竞争实验(互斥体实现 LED 设备互斥访问)--- Ubuntu20.04互斥体实验

🎬 渡水无言:个人主页渡水无言 ❄专栏传送门: 《linux专栏》《嵌入式linux驱动开发》《linux系统移植专栏》 ❄专栏传送门: 《freertos专栏》《STM32 HAL库专栏》 ⭐️流水不争先,争的是滔滔不绝  📚博主简介:第二十届中国研究生电子设计竞赛全国二等奖 |国家奖学金 | 省级三好学生 | 省级优秀毕业生获得者 | ZEEKLOG新星杯TOP18 | 半导纵横专栏博主 | 211在读研究生 在这里主要分享自己学习的linux嵌入式领域知识;有分享错误或者不足的地方欢迎大佬指导,也欢迎各位大佬互相三连 目录 前言  一、实验基础说明 1.1、互斥体简介 1.2 本次实验设计思路 二、硬件原理分析(看过之前博客的可以忽略) 三、实验程序编写 3.1 互斥体 LED 驱动代码(mutex.c) 3.2.1、设备结构体定义(28-39

By Ne0inhk
Flutter for OpenHarmony:swagger_dart_code_generator 接口代码自动化生成的救星(OpenAPI/Swagger) 深度解析与鸿蒙适配指南

Flutter for OpenHarmony:swagger_dart_code_generator 接口代码自动化生成的救星(OpenAPI/Swagger) 深度解析与鸿蒙适配指南

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net 前言 后端工程师扔给你一个 Swagger (OpenAPI) 文档地址,你会怎么做? 1. 对着文档,手写 Dart Model 类(容易写错字段类型)。 2. 手写 Retrofit/Dio 的 API 接口定义(容易拼错 URL)。 3. 当后端修改了字段名,你对着报错修半天。 这是重复劳动的地狱。 swagger_dart_code_generator 可以将 Swagger (JSON/YAML) 文件直接转换为高质量的 Dart 代码,包括: * Model 类:支持 json_serializable,带 fromJson/

By Ne0inhk
Linux 开发别再卡壳!makefile/git/gdb 全流程实操 + 作业解析,新手看完直接用----《Hello Linux!》(5)

Linux 开发别再卡壳!makefile/git/gdb 全流程实操 + 作业解析,新手看完直接用----《Hello Linux!》(5)

文章目录 * 前言 * make/makefile * 文件的三个时间 * Linux第一个小程序-进度条 * 回车和换行 * 缓冲区 * 程序的代码展示 * git指令 * 关于gitee * Linux调试器-gdb使用 * 作业部分 前言 做 Linux 开发时,你是不是也遇到过这些 “卡脖子” 时刻?写 makefile 时,明明语法没错却报错,最后发现是依赖方法行没加 Tab;想提交代码到 gitee,记不清 git add/commit/push 的 “三板斧”,还得反复搜教程;用 gdb 调试程序,输了命令没反应,才想起编译时没加-g生成 debug 版本;甚至连写个进度条,都搞不懂\r和\n的区别,导致进度条乱跳…… 其实这些问题,

By Ne0inhk