[size=small]一、只要擁有乙個繼承超類方法的類,就有機會重寫該方法(除非方法被標識為final或static)。重寫的主要好處是具有能夠定義某個子型別特定行為的能力。
以下是重寫方法的規則:
1. 引數列表必須與被重寫的方法的引數列表完全匹配,或者就成過載了;
2. 返回型別必須與超類中被重寫方法原先宣告的返回型別或其子型別相同;
3. 訪問級別的限制性一定不能比被重寫方法的更嚴格(如public->private);
4. 訪問級別的限制性可以比被重寫方法的弱;
5. 僅當例項方法被子類繼承時,它們才能被重寫。(與超類位於相同包內的子類可以重寫未標識為private或final的任何超類方法;不同包中的子類只能重寫那些標識為public或protected的非final方法。)
6. 重與方法可以丟擲任何示檢驗(執行時)異常,無論被重寫方法是否宣告了該異常;
7. 重與方法一一不能丟擲比被重寫方法宣告的檢驗異常更新或更廣的檢驗異常。(例如,乙個宣告filenotfoundexception異常的方法不能被乙個宣告sqlexception、exception或任何其他非執行時異常的方法重寫,除非它是filenotfoundexception的乙個子類;
8. 重寫方法能夠丟擲更少或更有限的異常。僅僅因為被重寫方法「承擔風險」,並不意味著重寫子類的異常會承擔同樣的風險。關鍵之處是:不管被重寫方法宣告了什麼異常,重寫方法都不必宣告它從不會丟擲的任何異常;
9. 不能重寫標識為final或static的方法;
10. 如果方法不能被繼承,就不能被重寫。
二、過載方法允許在類中復用相同的方法名稱,但是具有不同的引數(並可以選擇不同的返回型別)。過載乙個方法往往意味著對那些呼叫方法的人更加友好,因為你的**承擔起處理不同引數型別的責任,而不用強制要求呼叫程式在呼叫方法之前進行了轉換。
過載的規則相對簡單:
1. 過載方法必須改變引數列表;
2. 過載方法可以改變返回型別;
3. 過載方法可以改變訪問修飾符;
4. 過載方法可以宣告新的或更廣的檢驗異常;
5. 方法能夠在同乙個類或者乙個子類中被過載。
三、重寫和過載的區別:
1. 引數:
[list]
[*]過載方法:必須改變
[*]重寫方法:一定不能改變
[/list] 2. 返回型別:
[list]
[*]過載方法:可以改變
[*]重寫方法:除協變式返回外,不能改變。
[/list] 3. 異常:
[list]
[*]過載方法:可以改變
[*]重寫方法:可以減小或消除。一定不能拋出新的或更廣的檢驗異常。
[/list] 4. 訪問級別:
[list]
[*]過載方法:可以改變
[*]重寫方法:一定不能執行更嚴格的限制(可以降低限制)。
[/list] 5. 呼叫:
[list]
[*]過載方法:引用型別決定了選擇哪個過載版本(基於宣告的引數型別)。在編譯時做出決定。呼叫的實際方法仍然是乙個執行時發生的虛擬方法呼叫,但是編譯器總是知道所呼叫方法的簽名。因此在執行時,不僅是方法所在的類,而且引數匹配也已經明確。
[*]重寫方法:物件型別(也就是堆上實際的例項型別)決定了呼叫哪個方法在執行時做出決定。
[/list]
[color=red]注意:物件型別(不是引用變數的型別)決定在[b]執行時[/b]使用哪個重寫方法;而引用型別則決定了在[b]編譯時[/b]使用哪個過載方法。[/color][/size]
過載和重寫
物件導向的三大特性 繼承 封裝 多型。過載和重寫是多型的兩種表現形式。過載和重寫又有什麼區別呢?1 層次不同 重寫 發生在父類和子類之間。是子類重寫父類的方法,具有相同的方法名和方法引數。比如說,父子兩人都去吃飯 相同的方法 吃的是麵條 引數 父親飯量大,吃兩碗,兒子飯量小,就能吃一碗 實現了吃飯的...
過載和重寫
asp.net unity開發 net培訓 期待與您交流!過載 乙個類裡面有多個方法,方法名稱是相同的,返回值可以不同,引數列表的個數 型別 順序不同。區分過載方法可以通過引數列表的個數 型別 順序來決定呼叫哪個方法。過載可以子類過載父類的方法,並且可以靜態非靜態之間轉換。重寫 覆蓋 一般是指父類和...
重寫 和 過載
型構就是指方法的組成結構,具體包括方法的名稱和引數,涵蓋引數的數量 型別以及出現的順序,但是不包括方法的返回值型別,訪問許可權修飾符,以及abstract static final等修飾符。1.public void method int i,string s 4.5.public string m...