多態與類型轉換 子類重寫父類方法 1)位置:子類和父類中有同名的方法 2)方法名相同,返回類型和修飾符相同,參數列表相同 方法體不同 多態的優勢和應用場合 多態:同一個引用類型,使用不同的實例而執行不同的操作 實現多態的兩種形式 1.使用父類作為方法形參實現多態 2.使用父類作為方法返回值實現多態 ...
多態與類型轉換
子類重寫父類方法
1)位置:子類和父類中有同名的方法
2)方法名相同,返回類型和修飾符相同,參數列表相同
方法體不同
多態的優勢和應用場合
多態:同一個引用類型,使用不同的實例而執行不同的操作
實現多態的兩種形式
1.使用父類作為方法形參實現多態
2.使用父類作為方法返回值實現多態
形式1.1:父類做形參
子類做實參
形式1.2:父類做類型
子類實例化
(數據類型中的自動類型轉換)
形式2.1:父類作為方法的返回值
子類實例化,類型自動轉換
生活中的多態:
印表機
結論:
同一事物,由於條件不同,產生的結果也不同
多態實現思路:
編寫父類
編寫子類,子類重寫父類方法
運行時,使用父類的類型,子類的對象(自動類型轉換)
優勢:
把不同的子類對象都當作父類來看,可以屏蔽不同子類對象之間的差異,寫出通用的代碼,做出通用的編程,以適應需求的不斷變化。 賦值之後,父對象就可以根據當前賦值給它的子對象的特性以不同的方式運作。也就是說,父親的行為像兒子,而不是兒子的行為像父親。 舉個例子:從一個基類中派生,響應一個虛命令,產生不同的結果。 比如從某個基類繼承出多個對象,其基類有一個虛方法Tdoit,然後其子類也有這個方法,但行為不同,然後這些子對象中的任何一個可以賦給其基類的對象,這樣其基類的對象就可以執行不同的操作了。實際上你是在通過其基類來訪問其子對象的,你要做的就是一個賦值操作。 使用繼承性的結果就是可以創建一個類的家族,在認識這個類的家族時,就是把導出類的對象當作基類的的對象,這種認識又叫作upcasting。這樣認識的重要性在於:我們可以只針對基類寫出一段程式,但它可以適應於這個類的家族,因為編譯器會自動就找出合適的對象來執行操作。這種現象又稱為多態性。而實現多態性的手段又叫稱動態綁定(dynamic binding)。 簡單的說,建立一個父類的變數,它的內容可以是這個父類的,也可以是它的子類的,當子類擁有和父類同樣的函數,當使用這個變數調用這個函數的時候,定義這個變數的類(也就是父類)里的同名函數將被調用,當在父類里的這個函數前加virtual關鍵字,那麼子類的同名函數將被調用。
多態的終極目標:為了實現統一調用
■多態可以減少類中代碼量
·可以提高代碼的可擴展性和可維護性
■向上轉型一子類轉換為父類,
·自動進行類型轉換
■向下轉型一父類轉換為子類,
·結合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/
如需轉載,請註明出處!!!