面向對象---多態
阿新 • • 發佈:2019-01-05
代碼 飼料 運行 技術 else abs system animal 成員
//4、千萬不要出現這樣的操作,就是將父類對象轉成子類類型 // 我們能轉換的是父類應用指向了自己的子類對象時,該應用可以被提升,也可以被強制轉換 // 多態自始至終都是子類對象在做著變化 // Animal a=new Animal(); //動物不能轉換成貓 // Cat c=(Cat)a;
//5、如果用貓的實例傳過去,並且function裏面具有貓的特性,則可以轉換 // 如果狗傳過去,則不能轉換 // 這時候,我們就需要一個判斷,對實例的判斷,instanceof:引用對象屬於什麽類型的時候用 // 判斷的時候不能把分類放在上面
多態,就是理解為事物存在的多種形態
Animal a=new Cat(); //1、類型提升,向上轉型(貓提升為動物了) //2、如果想要調用貓的特有方法時,如何操作? //3、強制將父類的引用,轉成子類類型。向下轉型 // Cat c=(Cat)a; //類似強制轉換 // c.catchMouse();
//4、千萬不要出現這樣的操作,就是將父類對象轉成子類類型 // 我們能轉換的是父類應用指向了自己的子類對象時,該應用可以被提升,也可以被強制轉換 // 多態自始至終都是子類對象在做著變化 // Animal a=new Animal(); //動物不能轉換成貓 // Cat c=(Cat)a;
//5、如果用貓的實例傳過去,並且function裏面具有貓的特性,則可以轉換 // 如果狗傳過去,則不能轉換 // 這時候,我們就需要一個判斷,對實例的判斷,instanceof:引用對象屬於什麽類型的時候用 // 判斷的時候不能把分類放在上面
1 abstract class Animal 2 { 3 abstract void eat();//不確定的就用抽象,同時也要把類也要抽象 4 } 5 6 class Cat extends Animal 7 { 8 public void eat() 9 { 10 System.out.println("吃魚"); 11 } 12 public void catchMouse() 13 { 14 System.out.println("抓老鼠"); 15 } 16 } 17 18 classView CodeDog extends Animal 19 { 20 public void eat() 21 { 22 System.out.println("吃骨頭"); 23 } 24 public void kanjia() 25 { 26 System.out.println("看家"); 27 } 28 } 29 30 class Pig extends Animal 31 { 32 public void eat() 33 { 34 System.out.println("飼料");35 } 36 public void gongdi() 37 { 38 System.out.println("拱地"); 39 } 40 } 41 //------------------------------------------------------- 42 43 class DuoTaiDemo2 44 { 45 public static void main(String[] args) { 46 //Animal a=new Cat(); //1、類型提升,向上轉型(貓提升為動物了) 47 //a.eat(); 48 49 //2、如果想要調用貓的特有方法時,如何操作? 50 //3、強制將父類的引用,轉成子類類型。向下轉型 51 //Cat c=(Cat)a; //類似強制轉換 52 //c.catchMouse(); 53 54 //4、千萬不要出現這樣的操作,就是將父類對象轉成子類類型 55 // 我們能轉換的是父類應用指向了自己的子類對象時,該應用可以被提升,也可以被強制轉換 56 // 多態自始至終都是子類對象在做著變化 57 //Animal a=new Animal(); //動物不能轉換成貓 58 //Cat c=(Cat)a; 59 60 //5、如果用貓的實例傳過去,並且function裏面具有貓的特性,則可以轉換 61 // 如果狗傳過去,則不能轉換 62 // 這時候,我們就需要一個判斷,對實例的判斷,instanceof:引用對象屬於什麽類型的時候用 63 // 判斷的時候不能把分類放在上面 64 65 function(new Cat()); 66 function(new Dog()); 67 } 68 69 public static void function(Animal a)//Animal c=new Cat(); 這樣也提高代碼的擴展性,後期不管加什麽都行 70 { 71 a.eat(); //判斷的時候不能把分類放在上面 72 if(a instanceof Cat){ //instanceof:引用對象屬於什麽類型的時候用 73 Cat c=(Cat)a; 74 c.catchMouse(); 75 } 76 else if(a instanceof Dog){ 77 Dog c=(Dog)a; 78 c.kanjia(); 79 } 80 81 } 82 }
在多態中成員函數的特點:
在編譯時期:
參閱引用型變量所屬的類中,是否有調用方法,如果有,編譯通過,沒有,編譯失敗
在運行時期:
參閱對象所屬的類中是否有調用方法
簡單總結:成員函數在多態調用時,編譯看左邊,運行看右邊
在多態中成員變量的特點:
無論編譯和運行,都參考左邊,
在多態中靜態成員函數的特點:
無論編譯和運行,都參考左邊
面向對象---多態