多态揭秘:同一行为,不同结果
发布时间:2026/10/14 19:41:28 锦皓数字建站

目录前言一、多态的概念1.1 多态实现条件1.2 代码示例1.3 重写1.4 重写和重载的区别1.5 重写的设计原则1.6 向上转型和向下转型1.7 多态的优点1.8 避免在构造方法中调用重写的方法前言多态的学习一、多态的概念多态Polymorphism通俗来说就是多种形态。具体而言就是去完成某个行为当不同的对象去完成时会产生出不同的状态。简而言之就是同一件事情发生在不同对象身上就会产生不同的结果。1.1 多态实现条件在 Java 中多态的实现需要满足以下三个条件必须在继承体系下子类与父类之间存在继承关系。子类必须对父类中的方法进行重写Override子类重新实现父类的同名方法。通过父类的引用调用重写的方法运行时JVM 会根据实际对象类型调用对应类中的方法。多态体现在代码运行时当传递不同类对象时会调用对应类中的方法。1.2 代码示例以Animal为父类Cat和Dog为子类为例当类的调⽤者在编写 eat 这个⽅法的时候,参数类型为Animal(⽗类),此时在该⽅法内部并不知道, 也不关注当前的animal引⽤指向的是哪个类型(哪个⼦类)的实例.此时aimal这个引⽤调⽤eat⽅法可能会有多种 不同的表现(和a引⽤的实例相关),这种⾏为就称为多态.1.3 重写重写(override)重写是⼦类对⽗类⾮静态、⾮private修饰⾮final修饰⾮构造⽅法等的实现过程进⾏重新编写,返回值和形参都不能改变。即外壳不变核⼼重写重写的好处在于⼦类 可以根据需要定义特定于⾃⼰的⾏为。也就是说⼦类能够根据需要实现⽗类的⽅法。⽅法重写的规则• ⼦类在重写⽗类的⽅法时⼀般必须与⽗类⽅法原型⼀致返回值类型 ⽅法名 (参数列表) 要完 全⼀致 • 被重写的⽅法返回值类型可以不同但是必须是具有⽗⼦关系的• 访问权限不能⽐⽗类中被重写的⽅法的访问权限更低。例如如果⽗类⽅法被public修饰则⼦类 中重写该⽅法就不能声明为protected• ⽗类被static、private修饰的⽅法、构造⽅法都不能被重写。• 重写的⽅法,可以使⽤Override注解来显式指定.有了这个注解能帮我们进⾏⼀些合法性校验. 例如不⼩⼼将⽅法名字拼写错了(⽐如写成aet),那么此时编译器就会发现⽗类中没有aet⽅法,就 会编译报错,提⽰⽆法构成重写.1.4重写和重载的区别重写父子类之间方法签名相同运行时根据实际对象类型决定调用谁。重载同一个类中方法名相同但参数不同编译时根据参数决定调用谁。即⽅法重载是⼀个类的多态性表现,⽽⽅法重写是⼦类与⽗类的⼀种多态性表现。1.5重写的设计原则对于已经投⼊使⽤的类尽量不要进⾏修改。最好的⽅式是重新定义⼀个新的类来重复利⽤其中 共性的内容并且添加或者改动新的内容。静态绑定也称为前期绑定(早绑定)即在编译时根据⽤⼾所传递实参类型就确定了具体调⽤那个⽅ 法。典型代表函数重载。动态绑定也称为后期绑定(晚绑定)即在编译时不能确定⽅法的⾏为需要等到程序运⾏时才能 够确定具体调⽤那个类的⽅法。1.6向上转型和向下转型向上转型向上转型实际就是创建⼀个⼦类对象将其当成⽗类对象来使⽤。语法格式⽗类类型 对象名new⼦类类型()使⽤场景直接赋值 ⽅法传参 ⽅法返回向上转型的优点让代码实现更简单灵活向上转型的缺陷不能调⽤到⼦类特有的⽅法。向下转型举例编译失败编译时编译器将 animal 当成 Animal 对象处理⽽ Animal 类中没有 bark ⽅法因此编译失败程序可以通过编程但运⾏时抛出异常-- 因为 animal 实际指向的是狗 // 现在要强制还原为猫⽆法正常还原因此Java中为了提⾼向下转型的 安全性引⼊了instanceof如果该表达式为true则可以安全转换。1.7多态的优点能够降低代码的圈复杂度,避免使⽤⼤量的if-else圈复杂度圈复杂度是⼀种描述⼀段代码复杂程度的⽅式.⼀段代码如果平铺直叙,那么就⽐较简单容易理 解.⽽如果有很多的条件分⽀或者循环语句,就认为理解起来更复杂.如果使⽤使⽤多态,则不必写这么多的if-else分⽀语句,代码更简单修改后可扩展能⼒更强如果要新增⼀种新的形状,使⽤多态的⽅式代码改动成本也⽐较低如上述新增加的三角型1.8避免在构造⽅法中调⽤重写的⽅法⼀段有坑的代码.我们创建两个类,B是⽗类,D是⼦类.D中重写func⽅法.并且在B的构造⽅法中调 ⽤func• 构造D对象的同时,会调⽤B的构造⽅法• B的构造⽅法中调⽤了func⽅法,此时会触发动态绑定,会调⽤到D中的func• 此时D对象⾃⾝还没有构造,此时num处在未初始化的状态,值为0.• 所以在构造函数内尽量避免使⽤实例⽅法除了final和private⽅法。Java对象初始化
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。