一、方法的重寫(Override)(方法覆蓋)java
(1)介紹:編程
java SE5增長@Override註解,並非關鍵字,覆寫某個方法時,添加此註解。@Override能夠防止在不想重載時而意外地進行重載。ide
- 1.父類與之類之間的多態性,對父類的函數進行從新定義。同方法名和同參數;
- 2.子類中的方法與父類中的某一方法具備相同的方法名、返回類型和參數列表,則新方法將覆蓋原有的方法,若須要父類中原有的方法,使用super關鍵字;
- 3.子類函數的訪問修飾符不能小於父類的;(父類爲public,則子類不能爲protected或者private等,只能是public的)
- 4.子類拋出異常小於等於父類方法拋出異常;
- 5.重寫Override,運行時,方法重寫(子類繼承父類並重寫方法)以及對象造型(父引用子類型對象),父子類的多態性表現,是動態分派,指令invokevirtual,在運行期間根據常量池中的類方法的符號引用解析到實際的類型上;
(2)兩同兩小一大原則:函數
兩同:方法名相同,參數類型相同this
兩小:子類返回類型小於等於父類方法返回類型,對象
子類拋出異常小於等於父類方法拋出異常,繼承
一大:子類訪問權限大於等於父類方法訪問權限。it
- 1)參數列表必須徹底與被重寫方法的相同;
- 2)返回類型必須徹底與被重寫方法的返回類型相同;(備註:這條信息是標準的重寫方法的規則,可是在java 1.5 版本以前返回類型必須同樣,1.5(包含)j 版本以後ava放寬了限制,返回類型必須小於或者等於父類方法的返回類型 )。纔有了子類返回類型小於等於父類方法返回類型。在java裏面這個怎麼樣都是正確的,請小夥伴謹記。
- 3)訪問權限不能比父類中被重寫的方法的訪問權限更低。例如:若是父類的一個方法被聲明爲public,那麼在子類中重寫該方法就不能聲明爲protected。不然會有如下信息:Cannot reduce the visibility of the inherited method from Base
- 4)父類的成員方法只能被它的子類重寫。
- 5)聲明爲final的方法不能被重寫。
- 6)聲明爲static的方法不能被重寫,可是可以被再次聲明。(static和final的都不能被重寫)
- 7)子類和父類在同一個包中,那麼子類能夠重寫父類全部方法,除了聲明爲private和final的方法。
- 8)子類和父類不在同一個包中,那麼子類只可以重寫父類的聲明爲public和protected的非final方法。
- 9)重寫的方法可以拋出任何非強制異常,不管被重寫的方法是否拋出異常。可是,重寫的方法不能拋出新的強制性異常,或者不能拋出比被重寫方法聲明的更普遍的強制性異常,反之則能夠。
- 10)構造方法不能被重寫。(構造方法屬於static的)
- 11)若是不能繼承一個方法,則不能重寫這個方法。
二、方法的重載overload編譯
(1)介紹面向對象編程
- 1.方法名同樣,但參數類型和個數同樣,返回值類型能夠相同也能夠不一樣,沒法以返回類型做爲重載函數的區分標準;
- 2.方法重載就是在類中建立多個方法,方法名相同,參數列表不一樣,調用方法時經過傳遞給它們的不一樣參數個數和參數類型來決定具體使用哪一個方法,體現多態性;
- 3.方法重載是讓類以統一的方法處理不一樣類型數據(同方法名,不一樣參數列表)的一種手段;
- 4.重載overload,編譯時,同一個類中,同名方法有不一樣參數列表(個數、類型),是一個類中多態性的表現,是靜態分派,在編譯期,經過靜態類型而不是實際類型做爲斷定依據(靜態方法也能夠重載);
(2)構造方法的重載
構造方法的重載:只須要看參數便可,若是想在一個構造方法中調用另外一個構造方法,那麼可使用this()的方法調用,this()括號中的參數表示目標構造方法的參數,this()必需要做爲構造方法的第一跳語句,換句話說,this()以前不能有任何可執行的代碼。
三、重寫和重載:(多態)
底層實現(靜態分派和動態分派)
- 重載overload,編譯時,同一個類中,同名方法有不一樣參數列表(個數、類型),是一個類中多態性的表現,是靜態分派,在編譯期,經過靜態類型而不是實際類型做爲斷定依據(靜態方法也能夠重載);
- 重寫override,運行時,方法重寫(子類繼承父類並重寫方法)以及對象造型(父引用子類型對象),父子類的多態性表現,是動態分派,指令invokevirtual,在運行期間根據常量池中的類方法的符號引用解析到實際的類型上;
- 多態性是面向對象編程的一種特性,和方法無關;
- 一樣的一個方法可以根據輸入數據的不一樣,作出不一樣的處理,即方法的重載——有不一樣的參數列表(靜態多態性);
- 當子類繼承自父類的相同方法,輸入數據同樣,但要作出有別於父類的響應時,你就要覆蓋父類方法, 即在子類中重寫該方法——相同參數,不一樣實現(動態多態性);
- 單詞:重載overload,重寫loverride;
- 形式:重載,方法名相同,參數列表不一樣(個數、類型、順序);重寫,方法名、返回值、參數列表都相同;
- 範圍:重載,是編譯時的靜態分派,同一個類中;重寫,運行時動態分派,發生在繼承的父子類中;
- 權限:重載,沒有權限限制;重寫,子類的覆寫的方法權限不能比父類的訪問權限小;