Java基礎十一--多態,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;//ClassCastException114 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 else148 {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 DuoTaiDemo234 {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;//ClassCastException46 y.看電影();47 48 49 50 51 }52 }