java.多态
概述#
多态是继封装、继承之后,面向对象的第三大特性
生活中,比如跑的动作,猫、狗和大象,跑起来是不一样的。再比如飞行的动作,昆虫、鸟和飞机,飞起来也是不一样的。可见,同一类行为,通过不同的事物,可以体现出来不同的形态。多态描述的就是这样的状态。
定义
多态:是指同一行为,具有多个不同表现形式
1、继承或实现【二选一】
2、方法重写【意义体现:不重写,无意义】
3、弗雷引用指向子类对象【格式体现】
多态的体现#
多态体现的格式:
父类类型 变量名 = new 子类对象;
变量名.方法名();
//父类类型:指子类对象继承的父类类型,或者实现的父接口类型
代码如下:
Fu f = new Zi();
f.method();
当使用多态方法调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,执行的是子类重写后方法
代码:
多态的好处#
实际开发中,父类类型作为方法形式参数,传递子类对象给方法,进行方法的调用,更能体现多态的扩展性与便利。代码如下:
由于多态特性的支持,showAnimalEat方法的Animal类型,是Cat和Dog的父类类型,父类类型接收子类对象,当然可以把Cat对象和Dog对象,传递给方法。
当eat方法执行时,多态规定,执行的是子类重写的方法,那么效果自然与showCatEat,showDogEat方法一致,所以showAnimalEat完全可以代替以上两方法
不仅仅是代替,在扩展性方面,无论之后再多的子类出现,我们都不需要编写showXxxEat方法,直接使用showAnimalEat都可以完成
所以,多态的好处,体现在可以使编程跟更简单,并有良好的扩展
引用类型转换#
多态的转型分为向上转型和向下转型两种
向上转型
多态本身是子类类型向父类类型向上转换的过程,这个过程是默认的
当父类引用指向一个子类对象时,便是向上转型
使用格式:
父类类型 变量名 = new 子类类型();
Animal a = new Cat();
向下转型
父类类型向子类类型向下转型的过程,这个过程是强制的
一个已经向上转型的子类对象,将父类引用转为子类引用,可以使用强制类型转换的格式,便是向下转型
使用格式:
子类类型 变量名 = (子类类型)父类变量名;
Cat c = (Cat) a;
为什么要转型?#
当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误。也就是说,不能调用子类拥有而父类没有的方法。所以想要调用子类特有的方法,必须做向下转型。
转型的异常
转型的过程中,一不小心就会遇到这样的问题,请看如下代码:
这段代码可以通过编译,但是运行时,却报出了 ClassCastException ,类型转换异常!这是因为,明明创建了
Cat类型对象,运行时,当然不能转换成Dog对象的。这两个类型并没有任何继承关系,不符合类型转换的定义。
为了避免ClassCastException的发生,Java提供了 instanceof 关键字,给引用变量做类型的校验,格式如下:
变量名 instanceof 数据类型
如果变量属于该数据类型,返回true。
如果变量不属于该数据类型,返回false。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗