之前就知道重寫override和重載overload的區別,平時也是逮着用就是了,Eclipse報錯再說。java
最近看一本書裏面出現了重寫、替換、覆蓋、置換、隱藏、重載,簡直亂得不行,概括整理一下。數組
從全局來看,java只有重寫、隱藏、重載3種,具體概括以下:ide
基本概念:post
方法簽名:方法名+參數列表(參數類型、個數、順序)。
=================================【重寫】=================================spa
某些書又叫覆蓋、替換、置換。本文統一叫重寫。.net
只有實例方法能夠被重寫!重寫後的方法必須仍爲實例方法!(實例方法------重寫------>實例方法)
成員變量和靜態方法都不能被重寫,只能被隱藏。對象
重寫實例方法:超類Parent中有實例方法A,子類child定義了與A「相同簽名和子集返回類型」的實例方法B,子類對象ChildObj只能調用本身的實例方法B。
即便將子類對象ChildObj轉換爲超類對象ParentObj,ParentObj依然只能調用重寫後的實例方法B!
(超類對象ParentObj中的實例方法A已經被實例方法B覆蓋了)
blog
重寫的語法規則以下:
(1)方法簽名必須相同(參數類型、個數、順序);
(2)對返回類型有要求,分2種狀況:
a.被重寫方法的返回類型是基本類型:重寫方法的返回類型必須「相同」。
基本類型包括了(byte,short,int,long,float,double,char,boolean,其實還包括一個void類型),但要注意返回類型是封裝類時屬於下面的狀況b。
b.被重寫方法的返回類型是引用類型:重寫方法的返回類型應「相同」或是其「子類型」;
引用類型包括了數組、string等一切非基本類型的類型(即類類型)。
(3)重寫方法的訪問權限不能小於被重寫方法的訪問權限,能夠更普遍。如被重寫方法是包訪問權限,重寫方法是public訪問權限。
重寫方法能夠改變其它的方法修飾符,如final、synchronized、native、strictfp。
無論被重寫方法中有無final修飾的參數,重寫方法均可以增長、保留、去掉這個參數的final修飾符(參數修飾符不屬於方法簽名)。
(4)重寫方法拋出的異常範圍不能大於被重寫方法拋出的異常的範圍(也能夠不拋出異常)。
(5)不能重寫final方法。(final修飾符存在的意義就是防止任何子類重寫該方法)
(6)不能重寫static靜態方法。(形式上能夠寫,但本質上不是重寫,屬於下面要講的隱藏)
(7)若是一個方法不能被繼承,則不能重寫它。或者說:只有當方法能夠被訪問時才能夠被重寫。
典型的就是超類的private方法。繼承
對於(3)須要注意:
1.重寫override對返回類型有要求,而重載overload對返回類型沒有要求。
重載能夠改變返回類型。由於編譯器經過對方法簽名的識別便可靜態編譯出不一樣的方法。這也是java中重載與重寫的區別之一。
2.嚴格來講,重寫屬於多態,由於是動態綁定(或稱爲動態聯編),而重載是靜態綁定,編譯時便可肯定。ip
=================================【隱藏】=================================
隱藏與覆蓋在形式上極其相似(語法規則),但有着本質的區別。
只有成員變量(無論是否是靜態)和靜態方法能夠被隱藏。
----------------------------成員變量------------------------
隱藏成員變量:超類Parent中有成員變量A,子類Child定義了與A同名的成員變量B,子類對象ChildObj調用的是本身的成員變量B。
若是把子類對象ChildObj轉換爲超類對象ParentObj,ParentObj調用的是超類的成員變量A!
注:1.隱藏成員變量時,只要同名便可,能夠更改變量類型(不管基本類型仍是隱藏類型)
2.不能隱藏超類中的private成員變量,換句話說,只能隱藏能夠訪問的成員變量。
3.隱藏超類成員變量A時,能夠下降或提升子類成員變量B的訪問權限,只要A不是private
4.隱藏成員變量與是否靜態無關!靜態變量能夠隱藏實例變量,實例變量也能夠隱藏靜態變量。
5.能夠隱藏超類中的final成員變量。
----------------------------靜態方法------------------------
隱藏後的方法必須仍爲靜態方法!(靜態方法------隱藏------>靜態方法)
隱藏靜態方法:超類Parent有靜態方法A,子類Child定義了與A「相同簽名和子集返回類型」的靜態方法B,子類對象ChildObj調用的是本身的靜態方法B。
若是把子類對象ChildObj轉換爲超類對象ParentObj,ParentObj調用的是超類的靜態方法A!
隱藏超類靜態方法的語法規則與重寫實例方法的規則幾乎徹底相同,只須要修改第(6)條爲:(6)不能隱藏實例方法。。
示例代碼: