• Java基础十一--多态


    Java基础十一--多态

    一、多态定义

    简单说:就是一个对象对应着不同类型.

    多态在代码中的体现:
    父类或者接口的引用指向其子类的对象。

      1 /*
      2 
      3 对象的多态性。
      4 
      5 class 动物
      6 {}
      7 
      8 class 猫 extends 动物
      9 {}
     10 
     11 class 狗 extends 动物
     12 {}
     13 
     14 
     15 
     16 猫 x = new 猫();
     17 
     18 动物 x = new 猫();//一个对象,两种形态。
     19 
     20 
     21 
     22 猫这类事物即具备者猫的形态,又具备着动物的形态。
     23 这就是对象的多态性。 
     24 
     25 简单说:就是一个对象对应着不同类型. 
     26 
     27 多态在代码中的体现:
     28     父类或者接口的引用指向其子类的对象。
     29 
     30 
     31 多态的好处:
     32     提高了代码的扩展性,前期定义的代码可以使用后期的内容。
     33 
     34 多态的弊端:
     35     前期定义的内容不能使用(调用)后期子类的特有内容。通过向下转型来解决。
     36 
     37 多态的前提:
     38     1,必须有关系,继承,实现。(实现是特殊的继承)
     39     2,要有覆盖 40 
     41 
     42 
     43 */
     44 
     45 abstract class Animal
     46 {
     47     abstract void eat();
     48 
     49 }
     50 
     51 class Dog extends Animal
     52 {
     53     void eat()
     54     {
     55         System.out.println("啃骨头");
     56     }
     57     void lookHome()
     58     {
     59         System.out.println("看家");
     60     }
     61 }
     62 
     63 class Cat extends Animal
     64 {
     65     void eat()
     66     {
     67         System.out.println("吃鱼");
     68     }
     69     void catchMouse()
     70     {
     71         System.out.println("抓老鼠");
     72     }
     73 }
     74 
     75 class Pig extends Animal
     76 {
     77     void eat()
     78     {
     79         System.out.println("饲料");
     80     }
     81     void gongDi()
     82     {
     83         System.out.println("拱地");
     84     }
     85 }
     86 
     87 
     88 
     89 class DuoTaiDemo 
     90 {
     91     public static void main(String[] args) 
     92     {
     93         
     94 //        Cat c = new Cat();
     95 //        c.eat();
     96 //        c.catchMouse();
     97 
     98         Animal a = new Cat(); //自动类型提升,猫对象提升了动物类型。但是特有功能无法s访问。
     99                             //作用就是限制对特有功能的访问。
    100                             //专业讲:向上转型。将子类型隐藏。就不用使用子类的特有方法。
    101 
    102 
    103 //        a.eat();
    104 
    105         //如果还想用具体动物猫的特有功能。 
    106         //你可以将该对象进行向下转型。
    107 //        Cat c = (Cat)a;//向下转型的目的是为了使用子类中的特有方法。
    108 //        c.eat();
    109 //        c.catchMouse();
    110 
    111 //        注意:对于转型,自始自终都是子类对象在做着类型的变化。
    112 //        Animal a1 = new Dog();
    113 //        Cat c1 = (Cat)a1;//ClassCastException
    114 
    115 
    116         /*
    117         Cat c = new Cat();
    118 
    119 //        Dog d = new Dog();
    120 
    121 //        c.eat();
    122         method(c);
    123 //        method(d);
    124 //        method(new Pig());
    125         */
    126 
    127         method(new  Dog());
    128 
    129     }
    130 
    131     public static void method(Animal a)//Animal a = new Dog();
    132     {
    133         a.eat();
    134      //解决类型匹配问题的时候,我们就可以判断一下
    135         if(a instanceof Cat)//instanceof:用于判断对象的具体类型。只能用于引用数据类型判断
    136 //                        //通常在向下转型前用于健壮性的判断。
    137 
    138         {
    139             Cat c = (Cat)a;
    140             c.catchMouse();
    141         }
    142         else if(a instanceof Dog)
    143         {
    144             Dog d = (Dog)a;
    145             d.lookHome();
    146         }
    147         else
    148         {
    149         
    150         }
    151         
    152     }
    153     /*
    154     public static void method(Cat c)
    155     {
    156         c.eat();
    157     }
    158     public static void method(Dog d)
    159     {    
    160         
    161     }
    162     */    
    163 }

    向上转型:父类引用指向子类对象。子类的特有功能无法访问。

    向下转型:子类引用指向父类对象。

    1 Animal a = new Cat(); //自动类型提升,猫对象提升了动物类型。但是特有功能无法s访问。
    2                       //作用就是限制对特有功能的访问。
    3                       //专业讲:向上转型。将子类型隐藏。就不用使用子类的特有方法。
    4 
    5 Cat c = (Cat)a;//向下转型的目的是为了使用子类中的特有方法。

    在实际应用中,向上转型便于代码扩展(之前写的代码以后能用,只有继承或者实现基类了的),但是要用到子类特有的功能的时候,必须向下转型。

    很多时候我们向上转型为Object类,当用到自己特有功能的时候,我们向下转型转回来。

    二、多态生活实例

     1 /*
     2 毕老师和毕姥爷的故事。
     3 */
     4 
     5 class 毕姥爷
     6 {
     7     void 讲课()
     8     {
     9         System.out.println("管理");
    10     }
    11     void 钓鱼()
    12     {
    13         System.out.println("钓鱼");
    14     }
    15 }
    16 
    17 class 毕老师 extends 毕姥爷
    18 {
    19     void 讲课()
    20     {
    21         System.out.println("Java");
    22     }
    23     void 看电影()
    24     {
    25         System.out.println("看电影");
    26     }
    27 }
    28 
    29 
    30 
    31 
    32 
    33 class  DuoTaiDemo2
    34 {
    35     public static void main(String[] args) 
    36     {   //原来
    37 //        毕老师 x = new 毕老师();
    38 //        x.讲课();
    39 //        x.看电影();
    40      //多态
    41         毕姥爷 x = new 毕老师();
    42         x.讲课(); //这里讲的是Java的内容,Java把管理学覆盖了 
    43         x.钓鱼();
    44 
    45         毕老师 y = (毕老师)x;//ClassCastException
    46         y.看电影();
    47 
    48 
    49 
    50 
    51     }
    52 }
  • 相关阅读:
    02
    01
    Redis、Mongo
    Django
    Django
    Django
    Django
    7.2
    Django
    contenttypes
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/6927015.html
Copyright © 2020-2023  润新知