Java基础十一--多态

时间:2023-02-16 11:00:57

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 }