Java学习之 多态 Polymorphism
Java學習之多態
多態的概念
多態==晚綁定。
不要把函數重載理解為多態。
因為多態是一種運行期的行為,不是編譯期的行為。
多態:父類型的引用可以指向子類型的對象。
比如 Parent p = new Child();
當使用多態方式調用方法時,首先檢查父類中是否有該方法,如果沒有,則編譯錯誤;
如果有,再去調用子類的該同名方法。
(注意此處,靜態static方法屬于特殊情況,靜態方法只能繼承,不能重寫Override,如果子類中定義了同名同形式的靜態方法,它對父類方法只起到隱藏的作用。調用的時候用誰的引用,則調用誰的版本。)
(參考學習鏈接:http://docs.oracle.com/javase/tutorial/java/IandI/override.html)
如果想要調用子類中有而父類中沒有的方法,需要進行強制類型轉換,如上面的例子中,將p轉換為子類Child類型的引用。
因為當用父類的引用指向子類的對象,用父類引用調用方法時,找不到父類中不存在的方法。這時候需要進行向下的類型轉換,將父類引用轉換為子類引用。?????
?
結合實例說明???????????????
下面舉個例子(有問題的代碼已注釋):
主要講講兩種類型轉換和兩種編譯時候的錯誤?! ?/span>
多態示例代碼 public class PolyTest {public static void main(String[] args){//向上類型轉換Cat cat = new Cat();Animal animal = cat;animal.sing();//向下類型轉換Animal a = new Cat();Cat c = (Cat)a;c.sing();c.eat();//編譯錯誤//用父類引用調用父類不存在的方法//Animal a1 = new Cat();//a1.eat();//編譯錯誤//向下類型轉換時只能轉向指向的對象類型 //Animal a2 = new Cat();//Cat c2 = (Dog)a2; } } class Animal {public void sing(){System.out.println("Animal is singing!");} } class Dog extends Animal {public void sing(){System.out.println("Dog is singing!");} } class Cat extends Animal {public void sing(){System.out.println("Cat is singing!");}public void eat(){System.out.println("Cat is eating!");} }
例子的執行結果:
這段代碼:
?
Cat類中定義了eat()方法,但是Animal類中沒有這個方法,a1引用是Animal類的,所以找不到,編譯時出錯:
?
兩種類型的類型轉換
(1)向上類型轉換(Upcast):將子類型轉換為父類型。
對于向上的類型轉換,不需要顯示指定,即不需要加上前面的小括號和父類類型名。
?
(2)向下類型轉換(Downcast):將父類型轉換為子類型。
對于向下的類型轉換,必須要顯式指定,即必須要使用強制類型轉換。
?
并且父類型的引用必須指向子類的對象,即指向誰才能轉換成誰。
不然也會編譯出錯:
?
?
因為父類引用指向的是Cat類的對象,而要強制轉換成Dog類,這是不可能的。
?
多態學習的第二部分,抽象類和接口:http://www.cnblogs.com/mengdd/archive/2012/12/25/2832656.html
?
??
轉載于:https://www.cnblogs.com/mengdd/archive/2012/12/25/2832288.html
總結
以上是生活随笔為你收集整理的Java学习之 多态 Polymorphism的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sql语句转linq的一个小工具
- 下一篇: mysql字段中ID值自动增长