一、方法重寫(overiding)
在j**a程式中,類的繼承關係可以產生乙個子類,子類繼承父類,它具備了父類所有的特徵,繼承了父類所有可訪問的方法和變數。
子類可以定義新的特徵,當子類需要修改父類的一些方法進行擴充套件,增大功能,程式設計者常常把這樣的一種操作方法稱為重寫,也稱為覆寫或覆蓋。
重寫體現了j**a優越性,重寫是建立在繼承關係上,它使語言結構更加豐富。在j**a中的繼承中,子類既可以隱藏和訪問父類的方法,也可以覆蓋繼承父類的方法。
在j**a中覆蓋繼承父類的方法就是通過方法的重寫來實現的。所謂方法的重寫是指子類中的方法與父類中繼承的方法有完全相同的返回值型別、方法名、引數個數以及引數型別。
這樣,就可以實現對父類方法的覆蓋。如果子類將父類中的方法重寫了,呼叫的時候肯定是呼叫被重寫過的方法,那麼如果現在一定要呼叫父類中的方法該怎麼辦呢?
此時,通過使用super
關鍵就可以實現這個功能,super
關鍵字可以從子類訪問父類中的內容,如果要訪問被重寫過的方法,使用「super.方法名(引數列表)」
的形式呼叫。
如果要使用super
關鍵字不一定非要在方法重寫之後使用,也可以明確地表示某個方法是從父類中繼承而來的。使用super
只是更加明確的說,要從父類中查詢,就不在子類查詢了。
二、重寫規則
在重寫方法時,需要遵循以下的規則:
父類方法的引數列表必須完全與被子類重寫的方法的引數列表相同,否則不能稱其為重寫而是過載。
父類的返回型別必須與被子類重寫的方法返回型別相同,否則不能稱其為重寫而是過載。
j**a中規定,被子類重寫的方法不能擁有比父類方法更加嚴格的訪問許可權。編寫過j**a程式的人就知道,父類中的方法並不是在任何情況下都可以重寫的,當父類中方法的訪問許可權修飾符為private
時,該方法只能被自己的類訪問,不能被外部的類訪問,在子類是不能被重寫的。如果定義父類的方法為public
,在子類定義為private
,程式執行時就會報錯。
由於父類的訪問許可權修飾符的限制一定要大於被子類重寫方法的訪問許可權修飾符,而private
許可權最小。所以如果某乙個方法在父類中的訪問許可權是private
,那麼就不能在子類中對其進行重寫。如果重新定義,也只是定義了乙個新的方法,不會達到重寫的效果。
在繼承過程中如果父類當中的方法丟擲異常,那麼在子類中重寫父類的該方法時,也要丟擲異常,而且丟擲的異常不能多於父類中丟擲的異常(可以等於父類中丟擲的異常)。換句話說,重寫方法一定不能拋出新的檢查異常,或者比被重寫方法宣告更加寬泛的檢查型異常。例如,父類的乙個方法申明了乙個檢查異常ioexception
,在重寫這個方法時就不能丟擲exception
,只能丟擲ioexception
的子類異常,可以丟擲非檢查異常。同樣的道理,如果子類中建立了乙個成員變數,而該變數和父類中的乙個變數名稱相同,稱作變數重寫或屬性覆蓋。但是此概念一般很少有人去研究它,因為意義不大。
三、方法過載(overloading)
方法過載是讓類以統一的方式處理不同型別資料的一種手段。呼叫方法時通過傳遞給它們的不同個數和型別的引數來決定具體使用哪個方法,這就是多型性。
所謂方法過載是指在乙個類中,多個方法的方法名相同,但是引數列表不同。引數列表不同指的是引數個數、引數型別或者引數的順序不同。
方法的過載在實際應用中也會經常用到。不僅是一般的方法,構造方法也可以過載。
在方法過載時,方法之間需要存在一定的聯絡,因為這樣可以提高程式的可讀性,一般只過載功能相似的方法。
過載是指我們可以定義一些名稱相同的方法,通過定義不同的引數來區分這些方法,然後再呼叫時,j**a虛擬機器就會根據不同的引數列表來選擇合適的方法執行。
也就是說,當乙個過載方法被呼叫時,j**a用引數的型別或個數來決定實際呼叫的過載方法。因此,每個過載方法的引數的型別或個數必須是不同。
雖然每個過載方法可以有不同的返回型別,但返回型別並不足以區分所使用的是哪個方法。
當j**a呼叫乙個過載方法是,引數與呼叫引數匹配的方法被執行。在使用過載要注意以下的幾點:
在使用過載時只能通過不同的引數列表,必須具有不同的引數列表。
不能通過訪問許可權、返回型別、丟擲的異常進行過載。
方法的異常型別和數目不會對過載造成影響。
可以有不同的返回型別,只要引數列表不同就可以了。
可以有不同的訪問修飾符。
可以丟擲不同的異常。
四、方法重寫與方法過載的區別
區別點重寫
過載英文
overriding
overloading
定義方法名稱、引數型別、返回值型別全部相同
方法名稱相同、引數型別或個數不同
許可權要求
被重寫的方法不能擁有更嚴格的要求
對許可權沒有要求
範圍發生在通過繼承而相關的不同類中
可以發生在同乙個類中,也可以發生在由於繼承而相關的不同類中
方法過載與重寫的區別
啥是方法過載?就是同乙個類中,假如有乙個方法a,你建立了乙個方法,方法名跟方法a名字一樣,引數中數量,型別,不一樣,那麼,你建立的方法 就是對方法a的過載。還有一點 返回值型別相同或者不同,跟方法的過載沒關係 啥是方法的重寫 重寫發生的場景 1 繼承關係的父子類 子類繼承了父類,子類要使用父類方法,...
方法過載和重寫的區別,方法過載重寫區別
答一 根本區別 重寫 重構 很直觀啊,子類覆蓋了父類的同名同參同返回值的方法,用子類呼叫的只會是重寫的方法 過載,同名而已。答二 1 過載 方法名相同,引數列表不同 2 重寫 也叫覆蓋,指在子類中定義乙個與父類中方法同名同引數列表的方法。因為子類會繼承父類的方法,而重寫就是將從父類繼承過來的方法重新...
方法重寫與方法過載
1 方法重寫 overiding method 1.1在物件導向程式設計中,子類可繼承父類中的方法,而不需要重新編寫相同的方法。但有時子類並不想原封不動地繼承父類的方法,而是想作一定的修改,這就需要採用方法的重寫。方法重寫又稱方法覆蓋。若子類中的方法與父類中的某一方法具有相同的方法名 返回型別和參數...