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

 

posted @   忱康  阅读(67)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示