Java 物件導向三大特徵之一: 多態,三大多態
多態與類型轉換
子類重寫父類方法
1)位置:子類和父類中有同名的方法
2)方法名相同,傳回型別和修飾符相同,參數列表相同
方法體不同
多態的優勢和應用場合
多態:同一個參考型別,使用不同的執行個體而執行不同的操作
實現多態的兩種形式
1.使用父類作為方法形參實現多態
2.使用父類作為方法傳回值實現多態
形式1.1:父類做形參
子類做實參
形式1.2:父類做類型
子類執行個體化
(資料類型中的自動類型轉換)
形式2.1:父類作為方法的傳回值
子類執行個體化,類型自動轉換
生活中的多態:
印表機
結論:
同一事物,由於條件不同,產生的結果也不同
多態實現思路:
編寫父類
編寫子類,子類重寫父類方法
運行時,使用父類的類型,子類的對象(自動類型轉換)
優勢:
■多態可以減少類中代碼量
·可以提高代碼的可擴充性和可維護性
■向上轉型一子類轉換為父類,
·自動進行類型轉換
■向下轉型一父類轉換為子類,
·結合instanceof運算子進行強制類型轉換
栗子:
/** * */package bdqn.javademos;/** * * @author: 房上的貓 * * @time: 下午3:51:59 * * 部落格地址: https://www.cnblogs.com/lsy131479/ * *//** * @author xjz *父類 寵物類 */public class Pet { public void eat(){ System.out.println("pet正在吃"); }}父類
/** * */package bdqn.javademos;/** * * @author: 房上的貓 * * @time: 下午3:51:59 * * 部落格地址: https://www.cnblogs.com/lsy131479/ * *//** * @author xjz * */public class Cat extends Pet { public void eat(){ System.out.println("貓吃貓糧"); } public void ball(){ System.out.println("貓玩球"); }}Cat類
/** * */package bdqn.javademos;/** * @author xjz *子類:狗狗類 */public class Dog extends Pet{ public void eat(){ System.out.println("狗狗吃狗糧"); } public void catchFlyDisk(){ System.out.println("狗狗玩飛盤"); }}Dog類
/** * */package bdqn.javademos;/** * @author xjz *企鵝類 */public class Penguin extends Pet{ public void eat(){ System.out.println("企鵝吃魚"); } public void swiming(){ System.out.println("企鵝遊泳"); }}Penguin 類
/** * */package bdqn.javademos;/** * @author xjz *主人類 */public class Master { public void feed(Pet pet){ pet.eat(); } //領養寵物 多態形式3:父類作為方法傳回值,子類執行個體化 類型自動轉換 public Pet getPet(int typeid){ Pet pet=null; if(typeid==1){ pet=new Dog(); } else if(typeid==2){ pet=new Penguin(); } else if(typeid==3) { pet=new Cat(); } return pet; } }Master 類
package bdqn.javademos;import java.util.Scanner;public class Test { /** * @param args */ public static void main(String[] args) { //多態的形式1 Dog dog=new Dog(); Penguin peng=new Penguin(); Cat cat=new Cat(); Master ms=new Master(); ms.feed(dog); ms.feed(peng); ms.feed(cat); //多態的形式2:父類做類型,子類執行個體化 Pet pet=new Dog();//自動轉換 pet.eat(); //調用領養寵物 形式3:父類作為方法的傳回型別 System.out.println("請選擇您要領養的寵物:(1-狗狗 2-企鵝 3-貓) "); Scanner input=new Scanner(System.in); int xz=input.nextInt(); Master dx=new Master(); Pet pets=dx.getPet(xz); pets.eat(); }}
instanceof運算子的使用
類型轉換比較
1.
子類轉換父類
向上轉型
自動轉換
2.
父類轉換子類
向下轉型
使用isntanceof用作比較判定
子類 對象名 = (子類)父類;
使用子類對象
栗子:
/** * */package bdqn.javademos;/** * @author xjz *父類 寵物類 */public class Pet { public void eat(){ System.out.println("pet正在吃"); }}父類
/** * */package bdqn.javademos;/** * @author xjz * */public class Cat extends Pet { public void eat(){ System.out.println("貓吃貓糧"); } public void ball(){ System.out.println("貓玩球"); }}Cat 類
/** * */package bdqn.javademos;/** * @author xjz *子類:狗狗類 */public class Dog extends Pet{ public void eat(){ System.out.println("狗狗吃狗糧"); } public void catchFlyDisk(){ System.out.println("狗狗玩飛盤"); }}Dog 類
/** * */package bdqn.javademos;/** * @author xjz *企鵝類 */public class Penguin extends Pet{ public void eat(){ System.out.println("企鵝吃魚"); } public void swiming(){ System.out.println("企鵝遊泳"); }}Penguin 類
/** * */package bdqn.javademos;/** * @author xjz *主人類 */public class Master { public void feed(Pet pet){ pet.eat(); } //領養寵物 多態形式3:父類作為方法傳回值,子類執行個體化 類型自動轉換 public Pet getPet(int typeid){ Pet pet=null; if(typeid==1){ pet=new Dog(); } else if(typeid==2){ pet=new Penguin(); } else if(typeid==3) { pet=new Cat(); } return pet; } //主人和寵物玩耍的行為 public void play(Pet pet){ if (pet instanceof Dog) { Dog dog=(Dog)pet;//向下轉型 dog.catchFlyDisk(); }else if(pet instanceof Penguin){ Penguin peng=(Penguin)pet; peng.swiming(); }else if(pet instanceof Cat){ Cat cat=(Cat)pet; cat.ball(); } } }Master 類
package bdqn.javademos;import java.util.Scanner;public class Test { /** * @param args */ public static void main(String[] args) { //多態的形式1 Dog dog=new Dog(); Penguin peng=new Penguin(); Cat cat=new Cat(); Master ms=new Master(); ms.feed(dog); ms.feed(peng); ms.feed(cat); //多態的形式2:父類做類型,子類執行個體化 Pet pet=new Dog();//自動轉換 pet.eat(); //調用領養寵物 形式3:父類作為方法的傳回型別 System.out.println("請選擇您要領養的寵物:(1-狗狗 2-企鵝 3-貓) "); Scanner input=new Scanner(System.in); int xz=input.nextInt(); Master dx=new Master(); Pet pets=dx.getPet(xz); pets.eat(); dx.play(dog); }}測試類別
(C) 房上的貓 。 著作權所有,並保留一切權利。
https://www.cnblogs.com/lsy131479/
如需轉載,請註明出處!!!