05_JavaSE之OOP--面向對象(多態)
對象(五)
一、多態的概述(Polymorphism)
多態可以理解成,事物具有多種形態,對象可以存在不同的形態。如:
人可以有男人,女人;也可以分成學生,老師各種職業;
動物可以有老鼠和貓,大象和獅子。
多態則是面向對象三大特征之一,接下來我們依次談談多態的是什麽樣的,有什麽好處和弊端,好處也就體現了他的作用,為什麽會有多態的出現。
二、多態詳述
1. 多態的前提
首先,必須要有繼承,
其次,要有方法的重寫,
再者,要有父類引用指向子類對象。
代碼01:
1 public class TestPolymorphic { 2 publicstatic 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;向下轉型。先有父類,才能向下轉型。
後續還有很多需要補充,目前先到這裏。
如有錯誤之處,歡迎指正。
05_JavaSE之OOP--面向對象(多態)