的基本認識和了解)
多態(tài)的概念多態(tài)的概念通俗來說就是多種形態(tài)具體點就是去完成某個行為當(dāng)不同的對象去完成時會產(chǎn)生出不同 的狀態(tài)??偟膩碚f就是同一件事發(fā)生在不同的對象上產(chǎn)生不同的結(jié)果多態(tài)實現(xiàn)的條件在Java中實現(xiàn)多態(tài)必須滿足以下條件1.在繼承體系下2.子類必須重寫父類的方法3.通過父類的應(yīng)用調(diào)用重寫的方法在了解多態(tài)前我們得先了解繼承向上轉(zhuǎn)型和重寫1.繼承我們上節(jié)博客有講過這里不再重新講述了。 接下來我們先了解向上轉(zhuǎn)型和重寫向上轉(zhuǎn)型和向下轉(zhuǎn)型向上轉(zhuǎn)型實際就是創(chuàng)建一個子類對象將其當(dāng)成父類對象來使用。格式父類類型 對象名new子類類型()BasebasenewSub();右邊的Sub是子類型被一個父類 的類型引用使小范圍向大范圍轉(zhuǎn)換稱為向上轉(zhuǎn)型向上轉(zhuǎn)型有三種使用場景1.直接賦值2.方法傳參3方法返回1.直接賦值publicclassAnimal{publicAnimal(Stringname,intage){this.namename;this.ageage;}Stringname;intage;}publicclassDogextendsAnimal{publicDog(Stringname,intage){super(name,age);}publicstaticvoidmain(String[]args){AnimalanimalnewDog(旺財,10);animal.eat();}}由向上轉(zhuǎn)型直接給賦值將子類的對象直接賦值給父類對象2.方法傳參classAnimal{voideat(){System.out.println(Animal eats);}}classDogextendsAnimal{Overridevoideat(){System.out.println(Dog eats bones);}}publicclassMain{staticvoidfeed(Animalanimal){// 參數(shù)為父類類型animal.eat();}publicstaticvoidmain(String[]args){DogdognewDog();feed(dog);// 向上轉(zhuǎn)型Dog - Animal}}這里給feed(Animal animal)了一個父類的形參給子類實例話了之后可以將子類的變量調(diào)用到函數(shù)中。注形參為父類引用可以接受任意系類對象。方法返回classAnimal{publicvoideat(){System.out.println(動物進食);}}classDogextendsAnimal{Overridepublicvoideat(){System.out.println(狗吃骨頭);}// 子類獨有方法父類中無聲明publicvoidbark(){System.out.println(狗汪汪叫);}}// 3. 測試類包含返回父類類型的方法publicclassReturnTest{// 方法聲明返回父類Animal實際返回子類DogpublicstaticAnimalgetAnimal(){// 自動向上轉(zhuǎn)型Dog - AnimalreturnnewDog();}publicstaticvoidmain(String[]args){// 接收返回值父類引用指向子類對象典型向上轉(zhuǎn)型AnimalanimalgetAnimal();animal.eat();方法返回的本質(zhì)來說和直接賦值一樣的。向下轉(zhuǎn)型概念將一個子類對象經(jīng)過向上轉(zhuǎn)型之后當(dāng)成父類方法使用再無法調(diào)用子類的方法但有時候可能需要調(diào)用子類特有的方法此時將父類引用再還原為子類對象即可即向下轉(zhuǎn)換。publicclassAnimal{Stringname;intage;voideat(){System.out.println(this.name正在吃飯...);}}publicclassDogextendsAnimal{voideat(){System.out.println(this.name正在吃狗糧...);}}publicclasstest{publicstaticvoidmain(String[]args){AnimalanimalnewDog();animal.name旺財;animal.eat();}}向上轉(zhuǎn)型的優(yōu)點可以將代碼更靈活向下轉(zhuǎn)型的缺點不可以調(diào)用子類特有的方法動態(tài)綁定publicclassAnimal{publicStringname;publicintage;publicAnimal(Stringname,intage){this.namename;this.ageage;}publicvoideat(){System.out.println(this.name正在吃飯...);}}publicclassCatextendsAnimal{publicCat(Stringname,intage){super(name,age);}publicvoideat(){System.out.println(this.name正在吃貓糧);}}publicclassDogextendsAnimal{publicDog(Stringname,intage){super(name,age);}publicvoideat(){System.out.println(this.name正在吃狗糧);}}publicclassTest{publicstaticvoidfunc(Animalanimal){animal.eat();}publicstaticvoidmain(String[]args){DogdognewDog(大黃,5);func(dog);System.out.println();CatcatnewCat(咪咪,3);func(cat);}}由上面的代碼可以了解到在同一個函數(shù)中調(diào)用的參數(shù)不同是所產(chǎn)生的結(jié)果也是不一樣的。即同一個方法不同的對象去做的時候產(chǎn)生的結(jié)果也是不同的則稱為動態(tài)綁定多態(tài)Polymorphism的實現(xiàn)確實依賴于動態(tài)綁定Dynamic Binding。這是 Java 面向?qū)ο缶幊痰暮诵臋C制之一。靜態(tài)綁定publicclassTest{publicstaticintadd(inta,intb){returnab;}publicstaticintadd(inta,intb,intc){returnabc;}publicstaticvoidmain(String[]args){add(1,2);add(1,2,3);}}靜態(tài)綁定也稱為前期綁定(早綁定)即在編譯時根據(jù)用戶所傳遞實參類型就確定了具體調(diào)用那個方法。典型代表函數(shù)重載。多態(tài)的優(yōu)點多態(tài)可以運用在循環(huán)中來達到代碼的簡便避免使用大量if-else的循環(huán)例如 首先定義下面幾個類。classShape{publicvoiddraw(){System.out.println(畫圖形);}}classRectextendsShape{Overridepublicvoiddraw(){System.out.println(?);}}classCycleextendsShape{Overridepublicvoiddraw(){System.out.println(●);}}classFlowerextendsShape{Overridepublicvoiddraw(){System.out.println(?);}}我們現(xiàn)在需要打印的不是一個形狀了, 而是多個形狀. 如果不基于多態(tài), 實現(xiàn)代碼如下publicstaticvoiddrawShapes(){RectrectnewRect();CyclecyclenewCycle();FlowerflowernewFlower();String[]shapes{cycle,rect,cycle,rect,flower};for(Stringshape:shapes){if(shape.equals(cycle)){cycle.draw();}elseif(shape.equals(rect)){rect.draw();}elseif(shape.equals(flower)){flower.draw();}}}如果使用多態(tài)實現(xiàn)的話則不需要這么多的if-else循環(huán)publicstaticvoiddrawShapes(){// 我們創(chuàng)建了一個 Shape 對象的數(shù)組.Shape[]shapes{newCycle(),newRect(),newCycle(),newRect(),newFlower()};for(Shapeshape:shapes){shape.draw();}}