多态(Polymorphism)
【1】多态跟属性无关,多态指的是方法的多态,而不是属性的多态。
【2】案例代入:
package com.msb; /** * @Auther:liu * @Date:-16:38:18 * @Description:IntelliJ IDEA * @Version:1.0 */ public class Animal {//父类:动物 public void shout(){ System.out.println("我是小动物我可以叫"); } }
package com.msb; /** * @Auther:liu * @Date:-16:21:49 * @Description:IntelliJ IDEA * @Version:1.0 */ public class Cat extends Animal{ //喊叫方法 public void shout(){ System.out.println("我是小猫,我可以喵喵叫。。。"); } public void scratch(){ System.out.println("我是小猫我可以挠人。。。"); } }
package com.msb; /** * @Auther:liu * @Date:-16:29:27 * @Description:IntelliJ IDEA * @Version:1.0 */ public class Dog extends Animal{ //喊叫: public void shout(){ System.out.println("我是小狗,我可以汪汪叫"); } public void guard(){ System.out.println("我是小狗,我可以看家护院!"); } }
package com.msb; /** * @Auther:liu * @Date:-16:23:25 * @Description:IntelliJ IDEA * @Version:1.0 */ public class Girl { //跟猫玩耍: // public void play(Cat cat){ // cat.shout(); // } //跟狗玩耍: // public void play(Dog dog){ // dog.shout(); // } public void play(Animal a){ a.shout(); } }
package com.msb; /** * @Auther:liu * @Date:-10:38:53 * @Description:IntelliJ IDEA * @Version:1.0 */ public class Pag extends Animal{ public void shout(){ System.out.println("我是小猪,嗯嗯嗯的叫"); } public void eat(){ System.out.println("我是小猪,我喜欢吃吃吃吃。。"); } }
package com.msb; /** * @Auther:liu * @Date:-16:24:21 * @Description:IntelliJ IDEA * @Version:1.0 */ public class Test { //这是一个main方法:是程序的入口 public static void main(String[] args) { //具体的猫:猫的对象 //Cat c=new Cat(); //具体的小女孩:小女孩的对象 Girl g=new Girl(); //小女孩跟猫玩 //g.play(c); //具体的够:狗的对象 //Dog dog =new Dog(); //g.play(dog); //Cat c=new Cat(); //Dog d=new Dog(); //Animal an=new Animal(); //an=d; Pag P =new Pag(); Animal an = P; g.play(an); } }
【3】总结:
(1)先有--父类,再有--子类叫继承,现有--子类,再有--父类叫泛化
(2)什么是多态:
多态就是多种状态:同一个行为,不同的子类表现出来的不同的形态。
多态指的就是同一个方法调用,然后由于对象不同会产生不同的行为。
(3)多态的好处:
为了提高代码的扩展性,符合面向对象的设计原则:开闭原则。
开闭原则:指的就是扩展是开放的,修改是关闭的。
注意:多态可以提高扩展性,但是扩展性没有达到最好,以后我们会学习反射
(4)多态的三个要素:
继承:Cat extends Animal ,pig extends Animal ,Dog extends Animal
重写:子类对父类的方法shout()重写
父类引用指向子类对象:
1 Pag P =new Pag(); 2 Animal an = P;
将上面的代码合成一句话:
Animal an=new Pag();
等号左侧:编译器的类型
等号右侧:运行期的类型
Animal an=new Pag();
g.play(an);
1 public void play(Animal an){//Animal an=an=new Pag(); 2 an.shout(); 3 }
上面的代码,也是多态的一种非常常见的应用的场合:父类当方法的形参,然后传入的是具体的子类的对象,
然后调用同一个方法,根据传入的子类的不同,展现出来的效果也不同,构成了多态。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本