淺談Overload和Override的區別
如果在子類中定義某方法與其父類有相同的名稱和引數,我們說該方法被重寫 (Overriding)。如果在一個類中定義了多個同名的方法,它們或有不同的引數個數或有不同的引數型別,則稱為方法的過載(Overloading)。本文介紹的是Overload和Override的區別。
Overload是過載的意思,Override是覆蓋的意思,也就是重寫。
過載Overload表示同一個類中可以有多個名稱相同的方法,但這些方法的引數列表各不相同(即引數個數或型別不同)。
重寫Override表示子類中的方法可以與父類中的某個方法的名稱和引數完全相同,通過子類建立的例項物件呼叫這個方法時,將呼叫子類中的定義方法,這相當於把父類中定義的那個完全相同的方法給覆蓋了,這也是面向物件程式設計的多型性的一種表現。
子類覆蓋父類的方法時,只能比父類丟擲更少的異常,或者是丟擲父類丟擲的異常的子異常,因為子類可以解決父類的一些問題,不能比父類有更多的問題。子類方法的訪問許可權只能比父類的更大,不能更小。如果父類的方法是private型別,那麼,子類則不存在覆蓋的限制,相當於子類中增加了一個全新的方法。
至於Overloaded的方法是否可以改變返回值的型別這個問題,要看你倒底想問什麼呢?這個題目很模糊。如果幾個Overloaded的方法的引數列表不一樣,它們的返回者型別當然也可以不一樣。
但我估計你想問的問題是:如果兩個方法的引數列表完全一樣,是否可以讓它們的返回值不同來實現過載Overload。這是不行的,我們可以用反證法來說明這個問題,因為我們有時候呼叫一個方法時也可以不定義返回結果變數,即不要關心其返回結果,例如,我們呼叫map.remove(key)方法時,雖然remove方法有返回值,但是我們通常都不會定義接收返回結果的變數,這時候假設該類中有兩個名稱和引數列表完全相同的方法,僅僅是返回型別不同,java就無法確定程式設計者倒底是想呼叫哪個方法了,因為它無法通過返回結果型別來判斷。
override可以翻譯為覆蓋,從字面就可以知道,它是覆蓋了一個方法並且對其重寫,以求達到不同的作用。對我們來說最熟悉的覆蓋就是對介面方法的實現,在介面中一般只是對方法進行了宣告,而我們在實現時,就需要實現介面宣告的所有方法。除了這個典型的用法以外,我們在繼承中也可能會在子類覆蓋父類中的方法。在覆蓋要注意以下的幾點:
1、覆蓋的方法的標誌必須要和被覆蓋的方法的標誌完全匹配,才能達到覆蓋的效果;
2、覆蓋的方法的返回值必須和被覆蓋的方法的返回一致;
3、覆蓋的方法所丟擲的異常必須和被覆蓋方法的所丟擲的異常一致,或者是其子類;
4、被覆蓋的方法不能為private,否則在其子類中只是新定義了一個方法,並沒有對其進行覆蓋。
overload對我們來說可能比較熟悉,可以翻譯為過載,它是指我們可以定義一些名稱相同的方法,通過定義不同的輸入引數來區分這些方法,然後再呼叫時,VM就會根據不同的引數樣式,來選擇合適的方法執行。在使用過載要注意以下的幾點:
1、在使用過載時只能通過不同的引數樣式。例如,不同的引數型別,不同的引數個數,不同的引數順序(當然,同一方法內的幾個引數型別必須不一樣,例如可以是fun(int,float),但是不能為fun(int,int));
2、不能通過訪問許可權、返回型別、丟擲的異常進行過載;
3、方法的異常型別和數目不會對過載造成影響;
4.對於繼承來說,如果某一方法在父類中是訪問許可權是priavte,那麼就不能在子類對其進行過載,如果定義的話,也只是定義了一個新方法,而不會達到過載的效果。
總之,重寫Overriding是父類與子類之間多型性的一種表現,過載Overloading是一個類中多型性的一種表現。很重要的一點就是,Overloaded的方法是可以改變返回值的型別。希望對你有幫助。
C# override和overload特點
過載(Overload)類中定義的方法可能有不同的版本特點:
◆方法名必須相同
◆引數列表必須不相同
◆返回值型別可以不相同
覆寫(overwrite)子類為滿足自己的需要來重複定義某個方法的不同實現,通過使用關鍵字override來覆寫。特點:
◆相同的方法名稱
◆相同的引數列表
◆相同的返回值型別
C# override和overload區別
◆override 表示重寫,用於繼承類對基類中虛成員的實現
◆overload 表示過載,用於同一個類中同名方法不同引數(包括型別不同或個數不同)的實現
- using System;
- using System.Collections.Generic;
- using System.Text;
- namespace Example07
- {
- class Program
- {
- class BaseClass
- {
- public virtual void F()
- {
- Console.WriteLine("BaseClass.F");
- }
- }
- class DeriveClass : BaseClass
- {
- public override void F()
- {
- base.F();
- Console.WriteLine("DeriveClass.F");
- }
- public void Add(int Left, int Right)
- {
- Console.WriteLine("Add for Int: {0}", Left + Right);
- }
- public void Add(double Left, double Right)
- {
- Console.WriteLine("Add for int: {0}", Left + Right);
- }
- }
- static void Main(string[] args)
- {
- DeriveClass tmpObj = new DeriveClass();
- tmpObj.F();
- tmpObj.Add(1, 2);
- tmpObj.Add(1.1, 2.2);
- Console.ReadLine();
- }
- }
- }