Java多態性的理解

先寫一些,有時間補充完整
首先要理解幾個概念:
1、對象與對象變量。
     舉個一般書中常見的栗子:比如要構造一個Date類的對象,語法爲new Date(),有基礎人的都知道這叫通過構造器構造了一個Date類的對象(至於什麼叫構造器,就請百度......)迴歸正題,通常,我們希望自己構造出的對象可以多次使用,所以一個東西去表示它,這時就出現了對象變量,將對象存放在對象變量中,語法爲Date time=new Date(),等號代表的也就是所謂的

2、引用的概念。翻譯過來就是對象變量引用了一個對象。當然這裏需要強調一點,一個對象變量並沒有實際包含一個對象,而僅僅引用了一個對象。

3、簽名。
     方法的名字和參數和在一起成爲簽名比如 f(int),其中f就是方法名,括號內的int就是參數名,注意簽名不包括返回的類型。
4、函數的重寫與重載。
     如果在子類中定義一個與父類簽名相同的方法,就叫做重寫,也就是此時子類的方法覆蓋了父類的方法。而如果具有相同的方法名卻有不同的參數,那麼就是重載,重載的目的在於以統一的方式去處理不同不同類型的數據,在調用方法時通過判斷所傳遞的參數去判斷去決定具體調用哪一個方法,這也是多態性的一種體現。
5、繼承
     繼承具體太多不展開,與題主的問題不符。簡單點說,繼承就是父類繼承一個子類,使得子類能夠重用父類的代碼,同時也是實現多態的前提,BTW:面向對象編程的三大特徵:即封裝、繼承、多態。
6、下面來講多態性:
       基本概念
:發送消息給某個對象,讓對象自行決定響應何種行爲。
       多態性機制的針對的是什麼:對象變量
       基礎:Java運行時多態性的基礎是動態方法調度,本質上是一種在運行時而不在編譯時調用重載方法的機制。
       多態性機制的直觀體現:
       栗子:Father child= new Child();//當然右邊爲Grandson也行.......
       也就是說:一個類的對象變量可以引用其任何一個子類的對象(反之不成立),換句話說:通過將子類對象的對象引用賦值給超類(父類)對象的對象變量來實現動態方法的調用。爲什麼一個類的對象變量只能引用自己的子類而不能引用自己的父類呢?因爲編譯器在處理此類問題的時候可以自動實現向上轉型,也就是將被引用的對象轉型成引用它的超類。如果要向下轉型,則需要顯式表示並且強制轉換。當然,當一個方法的型參中只提供程序運行時傳進的實參的父類類型是,也會進行向上轉換。
       多態性的機制所遵循的規則:當出現一個類的類型變量引用指向其子類對象時(也就是多態性出現的時候),在接下來的程序中,是由被引用的對象(子類)的類型而不是引用對象(父類)的類型來決定調用誰的方法,但是有前提條件:這個方法能被調用的前提在於它已經在超類中定義了該變量(或者說是被子類覆蓋了)。當一個父類對象變量指向一個子類的對象時,父類對象變量無法調用子類特有的方法(注意子類對父類方法重載後就算兩個不同的方法了),並且當父類中的方法被子類重寫後(也就是簽名相同時),那麼父類對象變量就會調用子類所重寫的這個方法,這也就是所說的動態連接。當然,如果將原對象強制轉換爲子類對象,那麼也就可以調用子類中特有的方法了。
      PS:方法調用的優先順序 ,優先級由高到低依次爲:this.show(Object)、super.show(Object)、this.show((super)Object)、super.show((super)Object)。(super是單級父類)
  當然,上述的優先級原則順序一定建立在多態性成立的前提下。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章