1. 程式人生 > >05_JavaSE之OOP--面向對象(多態)

05_JavaSE之OOP--面向對象(多態)

close pos 分享圖片 spl 需要 sys 郵箱 成員方法 ont

對象(五)

一、多態的概述(Polymorphism)   

  多態可以理解成,事物具有多種形態,對象可以存在不同的形態。如:

  人可以有男人,女人;也可以分成學生,老師各種職業;

  動物可以有老鼠和貓,大象和獅子。

  多態則是面向對象三大特征之一,接下來我們依次談談多態的是什麽樣的,有什麽好處和弊端,好處也就體現了他的作用,為什麽會有多態的出現。

二、多態詳述

  1. 多態的前提

  首先,必須要有繼承

  其次,要有方法的重寫

  再者,要有父類引用指向子類對象

  代碼01

 1 public class TestPolymorphic {
 2     public
static void main(String[] args){ 3 Person p = new Student(); //父類引用指向子類對象 4 p.playChiJi(); 5 } 6 } 7 8 // 父類 9 class Person { 10 public void playChiJi(){ 11 System.out.println("人在吃雞"); 12 } 13 } 14 15 //子類 16 class Student extends Person { //繼承
17 public void playChiJi(){ //重寫 18 System.out.println("小學生在吃雞"); 19 } 20 }

技術分享圖片

  有繼承,有方法的重寫,有父類引用指向子類對象。那麽多態有什麽好處呢?

  2. 多態的好處

a.提高了代碼的維護性  (繼承保證)

b.提高了代碼的可維護性 (多態保證)    

  3. 多態的弊端

不能使用子類的特有屬性和行為

  接下來,我們就詳細分析,通過案例的形式來談談多態。

  4.多態 -- 成員變量訪問特點

  a.成員變量:編譯時看左邊(父類),運行看左邊(父類)。也就是說,父類引用指向子類時,訪問的依舊是自己的成員變量。如代碼02

技術分享圖片
 1 public class TestPolymorphic {
 2     public static void main(String[] args){
 3         Person p = new Student();   //父類引用指向子類對象
 4         System.out.println(p.num);
 5     }
 6 }
 7 
 8 // 父類
 9 class Person {
10     int num = 10;
11     public void playChiJi(){
12         System.out.println("人在吃雞");
13     }
14 }
15 //子類
16 class Student extends Person {                  //繼承
17     int num = 20;
18     public void playChiJi(){                    //重寫
19         System.out.println("小學生在吃雞");
20     }
21 }
View Code

技術分享圖片

  結果是:10

  b.內存圖:

技術分享圖片

   當運行編譯的時候,看的是Person,編譯看左邊(父類),字節碼進入方法區內;父類Person p指向的是自己的成員變量,運行時,指向的是super。因此,成員變量輸出的結果是:10。

  而Student s = new Student();指向就是自己,this。因此s.num = 20。

  5.多態 -- 成員方法訪問特點

  a.成員方法:編譯看左邊(父類),運行看右邊(子類)。接下來,看上面的代碼01

   b.解釋一下:編譯時,會去父類中查看有沒有這個方法(playChiJi()),如果沒有,那就報錯;在運行的時候,執行的是子類的方法,因此也叫動態綁定。 

  小結一下:成員變量,編譯看左邊(父類),運行看左邊(父類)

        成員方法,編譯看左邊(父類),運行看右邊(子類)

  

  6.多態應用: 當做參數傳遞(實用)

技術分享圖片
 1 public class TestPolymorphic {
 2     public static void main(String[] args){
 3         method(new Student());
 4         method(new Girl());
 5     }
 6 
 7     public static void method(Person p){
 8         p.playChiJi();
 9     }
10 }
11 
12 // 父類
13 class Person {
14     int num = 10;
15     public void playChiJi(){
16         System.out.println("人在吃雞");
17     }
18 }
19 //子類
20 class Student extends Person {                  //繼承
21     int num = 20;
22     public void playChiJi(){                         //重寫
23         System.out.println("小學生在吃雞");
24     }
25 }
26 
27 //子類
28 class Girl extends Person {                     //繼承
29     int num = 20;
30     public void playChiJi(){                      //重寫
31         System.out.println("美眉在吃雞");
32     }
33 }
View Code

技術分享圖片

  一般開發中,很少用Person p = new Student(),而是以參數的形式進行傳遞,這樣體現了多態的特性,父類引用指向子類的。可以直接傳遞這個對象。
  但是,父類不能使用子類的特有的方法和變量。如果,子類特有一個方法,那麽就不能訪問。
  這個時候又有了向下轉型向上轉型

  Person p = new Student();其實就是向上轉型,Student轉成Person,向上轉型。

  Student s = (Student)p;向下轉型。先有父類,才能向下轉型。

  後續還有很多需要補充,目前先到這裏。

如有錯誤之處,歡迎指正。

郵箱:[email protected]

05_JavaSE之OOP--面向對象(多態)