JAVA中的多态
A.多态的概述
a.简单说明:多态即为同一个对象在不同时刻表现出的不同形态。
B.多态的前提和体现
1.有继承/实现关系
2.有方法重写
3.有父类引用指向子类对象
C.多态中成员访问的特点
a: 成员变量:编译看左边,执行看左边
b: 成员方法:编译看左边,执行看右边(因为子类重写了父类的方法)
对Cat实例化,外部看到的是Animal对象,Animal对象无weight属性,报错:
访问到父类的成员变量:
编译看左边,Animal类中无palyGame方法,编译报错:
执行看右边,子类重写了父类方法:
为什么成员变量和成员方法的访问不一样:
因为成员方法有重写,而成员变量没有。
D.多态的好处与弊端
a.好处:提高了程序的扩展性。具体体现在定义方法的时候使用父类型作为参数,在将来使用时使用具体的子类型参与操作。
b.弊端:不能使用子类的特用功能。
c.代码演示:
1 package demo120; 2 3 /** 4 * @author ln 5 * @date 2022/1/20 6 * @description 多态的好处与弊端 7 * a.好处:提高了程序的扩展性。具体体现在定义方法的时候使用父类型作为参数, 8 * 在将来使用时使用具体的子类型参与操作。 9 * 10 * b.弊端:不能使用子类的特用功能。 11 * 父类 12 */ 13 public class Animal03 { 14 15 public void eat() { 16 System.out.println("动物要吃东西。。。。"); 17 } 18 19 }
1 ackage demo120; 2 /** 3 * @author ln 4 * @date 2022/1/20 5 * @description 多态的好处与弊端 6 * a.好处:提高了程序的扩展性。具体体现在定义方法的时候使用父类型作为参数, 7 * 在将来使用时使用具体的子类型参与操作。 8 * 9 * b.弊端:不能使用子类的特用功能。 10 * 子类 11 */ 12 public class Cat03 extends Animal03 { 13 //方法重写 14 15 @Override 16 public void eat() { 17 System.out.println("猫要吃鱼。。。。。"); 18 } 19 }
1 package demo120; 2 /** 3 * @author ln 4 * @date 2022/1/20 5 * @description 多态的好处与弊端 6 * a.好处:提高了程序的扩展性。具体体现在定义方法的时候使用父类型作为参数, 7 * 在将来使用时使用具体的子类型参与操作。 8 * 9 * b.弊端:不能使用子类的特用功能。 10 * 子类 11 */ 12 public class Dog03 extends Animal03 { 13 //方法重写 14 15 @Override 16 public void eat() { 17 System.out.println("狗子要吃肉骨头。。。。。"); 18 } 19 20 //在此处给狗类添加一个自己独特的成员方法 21 public void play() { 22 System.out.println("狗子要拆家。。。。。。"); 23 } 24 }
1 package demo120; 2 /** 3 * @author ln 4 * @date 2022/1/20 5 * @description 多态的好处与弊端 6 * a.好处:提高了程序的扩展性。具体体现在定义方法的时候使用父类型作为参数, 7 * 在将来使用时使用具体的子类型参与操作。 8 * 9 * b.弊端:不能使用子类的特用功能。 10 * 操作类 11 */ 12 public class UseAnimal03 { 13 //把父类型作为参数 14 public void useAnimal(Animal03 a) { 15 a.eat(); 16 } 17 }
1 package demo120; 2 /** 3 * @author ln 4 * @date 2022/1/20 5 * @description 多态的好处与弊端 6 * a.好处:提高了程序的扩展性。具体体现在定义方法的时候使用父类型作为参数, 7 * 在将来使用时使用具体的子类型参与操作。 8 * 9 * b.弊端:不能使用子类的特用功能。 10 * 测试类 11 */ 12 public class AnimalDemo03 { 13 public static void main(String[] args) { 14 //创建操作类的对象 15 UseAnimal03 ua = new UseAnimal03(); 16 17 //创建猫类对象 18 Animal03 cat = new Cat03(); 19 20 //创建狗类的对象 21 Animal03 dog = new Dog03(); 22 23 //调用操作类的方法 24 ua.useAnimal(cat); 25 ua.useAnimal(dog); 26 27 //弊端:不能使用子类的特用功能测试类, 28 //报错:Cannot resolve method 'play' in 'Animal03' 29 // dog.play() 30 } 31 }
E.多态中的转型:
a.向上转型:从子到父,父类引用指向子类对象。
b.向下转型:从父到子,父类引用转为子类对象(解决了多态不能访问子类独自的方法问题)
c.代码演示;
1 package demo120; 2 /** 3 * @author ln 4 * @date 2022/1/20 5 * @description 多态的转型 6 * a.向下转型:从子到父类,父类引用指向子类对象。 7 * 8 * b.向上转型:从父到子,父类引用抓换为子类对象(解决了多态不能访问子类独自的方法问题) 9 * 10 * 父类 11 */ 12 public class Animal04 { 13 public void eat() { 14 System.out.println("动物要吃东西。。。。。"); 15 } 16 }
1 package demo120; 2 /** 3 * @author ln 4 * @date 2022/1/20 5 * @description 多态的转型 6 * a.向下转型:从子到父类,父类引用指向子类对象。 7 * 8 * b.向上转型:从父到子,父类引用抓换为子类对象(解决了多态不能访问子类独自的方法问题) 9 * 10 * 子类 11 */ 12 public class Cat04 extends Animal04 { 13 @Override 14 public void eat() { 15 System.out.println("猫要吃鱼。。。。。。"); 16 } 17 18 //子类自己的方法 19 public void play() { 20 System.out.println("猫要玩。。。。。"); 21 } 22 }
1 package demo120; 2 /** 3 * @author ln 4 * @date 2022/1/20 5 * @description 多态的转型 6 * a.向下转型:从子到父类,父类引用指向子类对象。 7 * 8 * b.向上转型:从父到子,父类引用抓换为子类对象(解决了多态不能访问子类独自的方法问题) 9 * 10 * 测试类 11 */ 12 public class AnimalDemo04 { 13 public static void main(String[] args) { 14 //向上转型:从子到父,父类引用指向子类对象。 15 Animal04 a = new Cat04(); 16 a.eat(); 17 18 //向下转型:从父到子,父类引用转为子类对象(解决了多态不能访问子类独自的方法问题) 19 Cat04 c =(Cat04) a; 20 c.eat(); 21 //可以调用子类自己的方法了 22 c.play(); 23 } 24 }
1 猫要吃鱼。。。。。。 2 猫要吃鱼。。。。。。 3 猫要玩。。。。。 4 5 Process finished with exit code 0
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY