重載和重寫的區別與聯系


這三個概念都是與Java中的多態有關系的。如果單是區別重載與覆蓋這兩個概念是比較容易的,但是隱藏這一概念卻使問題變得有點復雜了, 下面說說它們的區別吧。        重載是指不同的函數使用相同的函數名,但是函數的參數個數或類型不同。調用的時候根據函數的參數來區別不同的函數。

       覆蓋(也叫重寫)是指在派生類中重新對基類中的虛函數(注意是虛函數)重新實現。即函數名和參數都一樣,只是函數的實現體不一樣。

       隱藏是指派生類中的函數把基類中相同名字的函數屏蔽掉了。隱藏與另外兩個概念表面上看來很像,很難區分,其實他們的關鍵區別就是在 多態的實現上。

   什么叫多態?簡單地說就是一個接口,多種實現吧。 覆蓋指的是派生類的虛擬函數覆蓋了基類的同名且參數相同的函數!

 

   重載(overload):   必須在一個域中,函數名稱相同但是函數參數不同,重載的作用就是同一個函數有不同的行為,因此不是在一個域中的函數是無法構成重載的,這個 是重載的重要特征   必須在一個域中,而繼承明顯是在兩個類中 相同的函數名的函數,在基類和派生類中的關系只能是覆蓋或者隱藏。 隱藏(hide): 指的是派生類的成員函數隱藏了基類函數的成員函數.隱藏一詞可以這么理解:在調用一個類的成員函數的時候,編譯器會沿着類的繼承鏈逐級的向上 查找函數的定義,如果找到了那么就停止查找了,所以如果一個派生類和一個基類都有同一個同名(暫且不論參數是否相同)的函數,而編譯器 最終選擇了在派生類中的函數,那么我們就說這個派生類的成員函數"隱藏"了基類的成員函數,也就是說它阻止了編譯器繼續向上查找函數的定義.

 override(重寫)

   1、方法名、參數、返回值相同。

   2、子類方法不能縮小父類方法的訪問權限。

   3、子類方法不能拋出比父類方法更多的異常(但子類方法可以不拋出異常)。

   4、存在於父類和子類之間。

   5、方法被定義為final不能被重寫。

 overload(重載)

  1、參數類型、個數、順序至少有一個不相同。 

  2、不能重載只有返回值不同的方法名。

  3、存在於父類和子類、同類中。

   方法的重寫(Overriding)和重載(Overloading)是Java多態性的不同表現。 重寫(Overriding)是父類與子類之間多態性的一種表現,而重載(Overloading)是一個類中多態性的一種表現。 如果在子類中定義某方法與其父類有相同的名稱和參數,我們說該方法被重寫 (Overriding) 。

   子類的對象使用這個方法時,將調用子類中的定義,對它而言,父類中的定義如同被"屏蔽"了. 如果在一個類中定義了多個同名的方法,它們或有不同的參數個數或有不同的參數類型或有不同 的參數次序,則稱為方法的重載(Overloading)。不能通過訪問權限、返回類型、拋出的異常 進行重載.

1. Override 特點

  1、覆蓋的方法的標志必須要和被覆蓋的方法的標志完全匹配,才能達到覆蓋的效果;

  2、覆蓋的方法的返回值必須和被覆蓋的方法的返回一致;

  3、覆蓋的方法所拋出的異常必須和被覆蓋方法的所拋出的異常一致,或者是其子類;

  4、被覆蓋的方法不能為private,否則在其子類中只是新定義了一個方法,並沒有對其進行覆蓋。

2.Overload 特點

  1、在使用重載時只能通過不同的參數樣式。例如,不同的參數類型,不同的參數個數,不同的參數順序(當然,同一方法內的幾個參數類型必須不一樣,例如可以是fun(int, float), 但是不能為fun(int, int));

  2、不能通過訪問權限、返回類型、拋出的異常進行重載;

  3、方法的異常類型和數目不會對重載造成影響;

  4、對於繼承來說,如果某一方法在父類中是訪問權限是priavte,那么就不能在子類對其進行重載,如果定義的話,也只是定義了一個新方法,而不會達到重載的效果。

 

1、Overload沒有關系,Override有點關系(范圍小的可以被范圍大的Override)。  2、Overload返回值類型不同不能作為不同的兩個函數,Override應該完全一樣的返回類型。  --------------------------------------------------------------- 

overload:  public   a(){}  public   a(int   a){]  在一個類中有同名的方法,但是方法帶有不同的參數 

Override:  public   class   a{      public   aaa(){]  }  public   class   b   extends   a   {      public   aaa(){}  }  方法aaa Override  還有,overload一般發生在同一個類中的有着不同的參數名和(或)不同數量的參數的同名方法之間,但同名方法的返回值可以一樣  override比較常見的是子類繼承父類后,override父類中的一些方法以滿足自己的需要。  我好像記得override的方法前的訪問控制不能比父類中的方法中的控制權限低,就是說protected的父類方法不能被override成private或default的,你可以去看看書,書上應該有介紹。 

--------------------------------------------------------------- 

>>overload(通常被翻譯為過載或重載) 

一般語境里overload是對method(方法)而言的,可以指一個類中多個名字相同而參數類型列表不相同的方法,這個名字代表的方法就是被overload了的。編譯器會根據參數類型列表的不同來決定調用叫這個名字的很多方法中具體的哪一個。 

>>override(通常被翻譯為覆蓋) 

一般語境里,如果說這個method(方法)是被override來的,就是說在定義這個方法的類的父類中有一個與這個方法同名且參數類型列表相同的方法,在子類中,這個方法被override了。在對這個子類的實例調用該方法時,編譯器確切的知道調用的是這個子類的方法。 

考慮這樣兩個類: 

class   Father  {
         public   void   doSomething(){}
         public   void   doSomething(int   a){}
         public   void   doSomething(String   s,   int   a){}
} 

class   Son   extends   Father   {
          public   void   doSomething(String   s,   int   a)   {}
          public   void   doSomething(int   a,   String   s){}  
} 

 

Father類中有3個doSomething方法,唯一的區別是參數類型列表,它們是overload了的方法。再看子類,第一個方法也叫doSomething,且父類中有一個doSomething方法和這個方法的參數類型列表相同,所以這是override;而第二個方法雖然名字也叫doSomething,但它的參數類型列表跟父類中和子類中其他的doSomething方法的參數類型列表不一致,所以編譯器默認這是一個overload的方法。那實際上我們有多少種方式來調用Son的實例呢?如下:  new   Son().dosomething();  new   Son().dosomething(3);  new   Son().dosomething("Hi",   5);  new   Son().dosomething(7,   "Hello"); 

其中前三個是從父類繼承的,且第三個是調用的子類的那個public   void   doSomething(String   s,   int   a){}方法,最后一個是在子類中新定義的一個overload的方法。 

注意:overload是指同樣的東西在不同的地方具有多種含義,而override是指它隨時隨地都只有一種含義。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM