1. 程式人生 > >面向對象---多態

面向對象---多態

代碼 飼料 運行 技術 else abs system animal 成員

多態,就是理解為事物存在的多種形態

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 class
Dog 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 }
View Code

在多態中成員函數的特點:

  在編譯時期:

    參閱引用型變量所屬的類中,是否有調用方法,如果有,編譯通過,沒有,編譯失敗

  在運行時期:

    參閱對象所屬的類中是否有調用方法

  簡單總結:成員函數在多態調用時,編譯看左邊,運行看右邊

在多態中成員變量的特點:

  無論編譯和運行,都參考左邊,

在多態中靜態成員函數的特點:

  無論編譯和運行,都參考左邊

面向對象---多態