1. 程式人生 > >淺談Overload和Override的區別

淺談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 表示過載,用於同一個類中同名方法不同引數(包括型別不同或個數不同)的實現

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Text;  
  4. namespace Example07  
  5. {  
  6. class Program  
  7. {  
  8. class BaseClass  
  9. {  
  10. public virtual void F()  
  11. {  
  12. Console.WriteLine("BaseClass.F");  
  13. }  
  14. }  
  15. class DeriveClass : BaseClass  
  16. {  
  17. public override void F()  
  18. {  
  19. base.F();  
  20. Console.WriteLine("DeriveClass.F");  
  21. }  
  22. public void Add(int Left, int Right)  
  23. {  
  24. Console.WriteLine("Add for Int: {0}", Left + Right);  
  25. }  
  26. public void Add(double Left, double Right)  
  27. {  
  28. Console.WriteLine("Add for int: {0}", Left + Right);  
  29. }  
  30. }  
  31. static void Main(string[] args)  
  32. {  
  33. DeriveClass tmpObj = new DeriveClass();  
  34. tmpObj.F();  
  35. tmpObj.Add(1, 2);  
  36. tmpObj.Add(1.1, 2.2);  
  37. Console.ReadLine();  
  38. }  
  39. }