一、多态

  • 多态故名思义,多种状态。比如Animal 这个类中,eat 方法是 公共的方法,但是当 People,Dog , Cat,继承时,我们知道人要吃的是米饭,狗要吃的是狗粮,猫要吃的是猫粮。所以当不同类型的引用(不同的对象)调用同一方法时,虽然是同一方法,但是产生的效果却是不一样的,这就叫多态

1.1、多态的概念

  • 当不同的引用(不同的对象)调用同一方法时,产生不同的结果

1.2、多态的实现条件(缺一不可)

  • 需要在继承的前提下
  • 子类需要对父类的方法进行重写
  • 需要父类的引用调用重写方法

1.3、多态的好处

  • 比如说以前的手机来电,他只能显示电话号码。现在的手机不仅可以显示电话号码,还显示名字,地址。这样的改变,如果我有多态,就不需要对以前的代码进行修改,我只需要重新创建一个类,继承以前的那个类,重写一下来电显示那个方法就行
  • 这样使得代码的可扩展性更强了

二、重写

  • 在重写代码的前一行,加上@Override,可以让编译器帮我们效验我们重写得对不对
  • 重写和重载都是多态的表现

2.1、什么是重写?

  • 重写是对父类的方法,在子类中重新写
  • 在子类中的方法,访问权限要大于等于父类的,类型要完全相同,方法名要完全一样,参数列表也要完全一样

2.2、重写的规则

  • 子类中的重写方法的访问权限要大于等于父类中的
  • 父类中需要重写的方法不能用 static, private ,final修饰,否则不能重写,构造方法也不能重写
  • 子类中的重写方法的返回值类型可以和父类的不一样,但是这个返回值类型必须和父类构成继承关系,这个叫协变类型

2.3、重写和重载的区别

  • 访问权限:重写:要求必须大于或等于父类的访问权限,重载:要求要相同
  • 返回值类型:重写:要求要完全一致,重载:不要求
  • 方法名:重写:要求完全一致,重载:也是要求完全一致
  • 参数列表:重写:要求完全一致,重载:参数列表必须不同(类型,名字,顺序)

2.4、动态绑定

  • 比如说我用 Animal 类,实例化一个Dog 对象(向上转型),我们知道,animal这个引用虽然指的是Dog,但是animal 的类型是Animal,所以animal这个引用只能调用Animal中的成员,不能调用Dog中特有的成员。换句话说,父类的引用只能调用父类中的成员,不能调用子类的成员。更深层的意思就是,发生了向上转型不能调用制类特色的成员
  • 什么是动态绑定?动态绑定也叫做运行时绑定。当我用animal调用重写的方法时,本应该调用的是父类中的方法,但是实际是调用了子类中的重写方法。这就是动态绑定
class Animal {public void eat(){sout("父类"+"正在吃饭...")}
}
class Dog extends Animal{
@Overridepublic void eat(){           //重写父类方法sout("子类"+"正在吃饭...")}
}
class Tect{Animal animal = new Dog();  //向上转型//此时调用的eat本应调用的是父类的eat,但实际是调用了子类Dog中的eat,因为此时发生了动态绑定animal.eat;                    //父类引用调用重写方法//所以说发生了多态
}
  • 同一个引用调用同一个方法,当这个引用 ,引用的对象不一样的时候,调用方法产生的结果也不一样,此时我们就把这种思想称之为多态

2.5、静态绑定

  • 什么是静态绑定?静态绑定也叫做(就是在写代码时绑定)编译时绑定。例子就是重载,跟据所传入的参数来调用合适的方法,此时就发生了静态绑定。(因为方法名字一样,所以根据你传入的参数来绑定要调用的方法,这就叫编译时绑定)

三、向上转型和向下转型

3.1、什么是向上转型,什么是向下转型?

  • 向上转型就是父类引用指向子类对象
Animal animal = new Dog();
  • 向下转型就是子类引用指向父类对象
Dog dog = (Dog)new Animal();

3.1.2、在向上转型中两个类型不一样,为什么不需要强制类型转换?

  • 可以这么说,狗一定是动物,但动物不一定是狗,所以向下转型需要强转

3.2、使用场景

  • 直接赋值
Animal animal = new Dog();
  • 作为参数传递
public static void get(Animal animal){     //把dog传过来就发生了向上转型animal.draw();
}
Dog dog = new Dog();
get(dog);
  • 作为返回值传递
public Animal get(){             //返回值应该是Animal类型return new Dog();           //但返回值是Dog实例化出来的对象,发生了向上转型
} 

3.3、需要注意什么?

  • 向上转型和向下转型,其实都是为了类型的统一
  • 向下转型需要注意,因为动物不一定是狗。所以可以使用 instanceof 关键字来让编译器效验是不是强转的类型,即用该关键字验证animal 所指的对象是不是狗,这样使用instanceof 保证了向下转型的安全性
Animal animal = new Dog();
if(animal instanceof Dog){Dog dog1 = (Dog) animal;
}else if(animal instanceof Cat){Cat cat = (Cat) animal;
}

四、避免在构造方法中调用重写方法

  • 因为极易出现很难找出的隐藏问题

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

文件结构树的├、└、─ 符号

目录一、├、└、─符号的背景二、├、└、─ 符号的含义2.1 ├ 带竖线的分支符号2.2 └不带竖线的分支符号2.3 ─横线符号三、Windows系统中生成目录树一、├、└、─符号的背景 我们在编程中,可能会经常遇到一些特殊符号├、└、─。这并非偶然,二十由…

微软XBOX游戏部门大裁员

近日有报道称,微软正计划对Xbox游戏部门进行另外一次裁员,影响的将是整个团队,而不是特定岗位或者部门,大概10%至20%的Xbox团队成员受到影响,这是微软这次对Xbox业务重组的一部分。 据报道,微软已经开始新…

【关于Java 8 的新特性】

问:“Java 8 有啥新东西?” 你憋了半天,只说出一句:“嗯……有 Lambda 表达式。”别慌!Java 8 可不只是“语法糖”那么简单。它是一次真正让 Java 从“老派”走向“现代” 的大升级!一、Lambda 表达式&…

《嵌入式数据结构笔记(六):二叉树》

1. ​​树数据结构的基本定义和属性​​树是一种重要的非线性数据结构,用于表示层次关系。​​基本定义​​:树是由 n(n ≥ 0)个结点组成的有限集合。当 n 0 时,称为空树;当 n > 0 时,树必须…

sqlite的sql语法与技术架构研究

(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu) 参考:参考提示词与豆包AI交互输出内容。 sqlite作为最常用的本地数据库,其支持的sql语法也比较全面,历经了二十多年经久不衰,其技术架构设计也是非常优秀的。 一&#xff1a…

Javascript中的一些常见设计模式

1. 单例模式(Singleton Pattern) 核心思想 一个类只能有一个实例,并提供一个全局访问点。 场景 全局缓存Vuex / Redux 中的 store浏览器中的 localStorage 管理类 示例 const Singleton (function () {let instance;function createInstance…

2025 年最佳 AI 代理:工具、框架和平台比较

目录 什么是 AI Agents 应用 最佳 AI Agents:综合列表 LangGraph AutoGen CrewAI OpenAI Agents SDK Google Agent Development Kit (ADK) 最佳no-code和open-source AI Agents Dify AutoGPT n8n Rasa BotPress 最佳预构建企业 AI agents Devin AI …

Linux 学习 ------Linux 入门(上)

Linux 是一种自由和开放源代码的类 Unix 操作系统。它诞生于 1991 年,由芬兰程序员林纳斯・托瓦兹(Linus Torvalds)发起并开发。与 Windows 等闭源操作系统不同,Linux 的源代码是公开的,任何人都可以查看、修改和传播&…

[202403-E]春日

[202403-E]春日 题目背景 春水初至, 文笔亦似花开。 题目描述 坐看万紫千红, 提笔洋洋洒洒, 便成篇文章。 现在给你这篇文章, 这篇文章由若干个单词组成, 没有标点符号, 两两单词之间由一个空格隔开。 为了…

Unity笔记(三)——父子关系、坐标转换、Input、屏幕

写在前面写本系列的目的(自用)是回顾已经学过的知识、记录新学习的知识或是记录心得理解,方便自己以后快速复习,减少遗忘。这里只有部分语法知识。九、父子关系1、获取、设置父对象(1)获取父对象可以通过this.transform.parent获取当前对象的父对象Trans…

基于Dubbo的高并发服务治理与流量控制实战指南

基于Dubbo的高并发服务治理与流量控制实战指南 在微服务架构的大规模应用场景中,如何保证服务在高并发压力下的稳定与可用,是每位后端开发者必须面对的挑战。本文结合实际生产环境经验,分享基于Apache Dubbo的高并发服务治理与流量控制方案&a…

Mac 洪泛攻击笔记总结补充

一、Mac 洪泛攻击原理交换机依靠 MAC 地址表来实现数据帧的精准转发,该表记录着端口与相连主机 MAC 地址的对应关系。交换机具备自动学习机制,当收到一个数据帧时,会将帧中的源 MAC 地址与进入的端口号记录到 MAC 表中。同时,由于…

路由器不能上网的解决过程

情况 前段时间,公司来人弄了一下网络后,我的路由器就不能上网了,怎么回事啊。 先看看路由器的情况:看着网络是有连接的:看这上面是能上网的,但是网都是上不去。 奇怪! 路由器介绍 路由器&#x…

Rancher 和 KubeSphere对比

以下是 Rancher 与 KubeSphere 的深度对比,涵盖核心定位、架构设计、功能模块、适用场景等关键维度,助您精准选型:一、核心定位与设计哲学维度RancherKubeSphere本质Kubernetes 多集群管理控制平面Kubernetes 全栈云原生操作系统目标简化K8s集…

【深度学习新浪潮】TripoAI是一款什么样的产品?

TripoAI是由硅谷AI初创公司VAST开发的多模态3D内容生成平台,其核心技术基于数十亿参数的3D基础模型,专注于通过文本描述、单图/多图输入或手绘涂鸦快速生成高精度可编辑的3D模型。以下是其核心信息: 一、技术架构与核心功能 秒级生成与多模态输入 生成速度:仅需8秒即可生成…

二十八天(数据结构:图的补充)

图:是一种非线性结构形式化的描述: G{V,R}V:图中各个顶点元素(如果这个图代表的是地图,这个顶点就是各个点的地址)R:关系集合,图中顶点与顶点之间的关系(如果是地图,这个关系集合可能就代表的是各个地点之间的距离)在顶点与顶点…

户外广告牌识别准确率↑32%:陌讯多模态融合算法实战解析

原创声明本文为原创技术解析,核心技术参数与架构设计引用自《陌讯技术白皮书》,禁止任何形式的转载与抄袭。一、行业痛点:户外广告牌识别的三大技术瓶颈户外广告牌作为城市视觉符号的重要载体,其智能化识别在商业监测、合规监管等…

【vue组件通信】一文了解组件通信多种方式

前言 在 Vue 中,组件通信有多种方式,适用于不同场景(父子组件、兄弟组件、跨级组件等)。以下是完整的组件传值方法总结,仅供概览参考:一、父子组件通信 1. Props(父 → 子) 父组件通…

项目一系列-第3章 若依框架入门

第3章 若依框架入门 3.1 若依框架概述 为什么要基于若依框架开发? 快速开发:能快速搭建一个应用框架,减少工作量。可定制化:提供丰富插件和拓展点,满足不同项目的特定需求。简化开发流程:框架提供常用的功能…

WSL安装MuJoco报错——FatalError: gladLoadGL error

文章目录WSL中配置MuJoCo报错 FatalError: gladLoadGL error 的终极解决方案🔍 问题原因分析✅ 解决方案:切换至 EGL 渲染后端第一步:安装系统级依赖库第二步:使用 Conda 安装兼容的图形库第三步:设置环境变量以启用 E…