1. 程式人生 > >面向物件---多型

面向物件---多型

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

 

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

在多型中成員函式的特點:

  在編譯時期:

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

  在執行時期:

    參閱物件所屬的類中是否有呼叫方法

  簡單總結:成員函式在多型呼叫時,編譯看左邊,執行看右邊

 

在多型中成員變數的特點:

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

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

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