一.多态概念 

  注:Python支持多态(同样还有鸭子类型【可以不必继承重写方法,只要方法名相同,动态语言的特性】)

  意味着允许不同类的对象对同一信息做出不同的反应。

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

  分类:

      编译时多态:设计时多态,方法重载

      运行时多态:程序运行时动态决定调用哪个方法

  Java多态必要条件:

      满足继承关系;

      父类引用指向子类对象

二.向上转型和向下转型

  1.向上转型(隐式转型/自动转型):

    父类引用指向子类实例,可以调用子类重写父类的方法以及父类派生的方法,无法调用子类独有的方法【小类转型为大类】

    注意:父类中的静态方法无法被子类重写,所以向上转型之后,只有调用父类原有的静态方法(如果想调用子类的静态方法就得向下转型)

   2.向下转型(强制类型转换):

     子类引用指向父类对象,此处必须进行强转,可以调用子类特有的方法【 必须满足转换条件才能进行强制转换】

Java多态 随笔 第1张
 1 package com.swpu.test;
 2 
 3 import com.swpu.plo.Animal;
 4 import com.swpu.plo.Cat;
 5 import com.swpu.plo.Dog;
 6 
 7 public class Test {
 8 
 9     public static void main(String[] args) {
10         /**
11          * 向上转型,隐式转型,自动转型
12          * 父类引用指向子类实例,可以调用子类重写父类的方法以及父类派生的方法,无法调用子类独有的方法
13          * 【小类转型为大类】
14          */
15         Animal one =new Animal();
16         Animal two=new Cat();
17         Animal three=new Dog();
18         one.eat();
19         //无法调用Cat和Dog独有的方法
20         two.eat();
21         three.eat();
22         /**
23          * 输出:
24          * 所有的动物都要吃东西
25                小猫吃东西!!!
26                狗吃东西!!!
27 
28          */
29         System.out.println("**************");
30         
31         /**
32          * 向下转型,强制类型转换
33          * 子类引用指向父类对象,此处必须进行强转,可以调用子类特有的方法
34          * 必须满足转换条件才能进行强制转换
35          */
36         Cat tmp=(Cat)two;
37         tmp.eat();
38         tmp.run();
39         //会报错,Cat和Dog没有关系,能转换为Cat是因为two原来指向的就是Cat空间【相当于还原】
40 //        Cat tmp2 =(Dog)two;
41         
42         
43 
44     }
45 
46 }
View Code

   3.instanceof:判断对象是否是某个类的实例

    注:相当于Python中的isinstance方法(会检查继承链,肯定是所实例类的对象实例,也是其所继承类的实例),而Python中type只判断是否指向同一个对象(不会检查继承链)

    Java多态 随笔 第3张

    

Java多态 随笔 第4张
 1     if(two instanceof Cat){
 2             Cat tmp=(Cat)two;
 3             tmp.eat();
 4             tmp.run();
 5             System.out.println("我是猫对象");
 6         }
 7         
 8         if (two instanceof Dog){
 9             Dog tmp=(Dog)two;
10             tmp.eat();
11             tmp.sleep();
12             System.out.println("我是狗对象");
13         }
14         if (two instanceof Animal){
15             System.out.println("我是Animal对象");
16 
17             
18         }
19         if (two instanceof Object){
20             System.out.println("我是Object对象");
21 
22         }
23         /*输出:
24          *  小猫吃东西!!!
25             小猫跑步~~~
26             我是猫对象
27             我是Animal对象
28             我是Object对象
29 
30          */
31                 
32         
View Code

   4.类型转换总结:

   Java多态 随笔 第6张

    注意:父类的静态方法不能在子类中被重写,可以同名(但是不构成重写,是子类特有的静态方法)

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄