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 }