不卡AV在线|网页在线观看无码高清|亚洲国产亚洲国产|国产伦精品一区二区三区免费视频

學習啦 > 知識大全 > 知識百科 > 百科知識 > 重寫和重載的區(qū)別_重寫和重載的不同之處(2)

重寫和重載的區(qū)別_重寫和重載的不同之處(2)

時間: 映芳735 分享

重寫和重載的區(qū)別_重寫和重載的不同之處

  重寫和重載在規(guī)則上的區(qū)別

  重寫的規(guī)則

  1.參數列表必須完全與被重寫的方法的相同,否則不能稱其為重寫而是重載。

  2.返回的類型必須一直與被重寫的方法的返回類型相同,否則不能稱其為重寫而是重載。

  3.訪問修飾符的限制一定要大于被重寫方法的訪問修飾符(public>protected>default>private)

  4.重寫方法一定不能拋出新的檢查異?;蛘弑缺恢貙懛椒ㄉ昝鞲訉挿旱臋z查型異常。

  例如:父類的一個方法申明了一個檢查異常IOException,在重寫這個方法是就不能拋出Exception,只能拋出IOException的子類異常,可以拋出非檢查異常。

  重載的規(guī)則

  1.必須具有不同的參數列表。

  2.可以有不同的返回類型,只要參數列表不同就可以了。

  3.可以有不同的訪問修飾符。

  4.可以拋出不同的異常。

  重載的編程語言

  重載是可使函數、運算符等處理不同類型數據或接受不同個數的參數的一種方法,關于重載一詞在詞義上有兩種不同的說法:

  多態(tài)

  重載是一種多態(tài)(如C++),有四種形式的多態(tài):

  1.虛函數多態(tài)

  2模板多態(tài)

  3重載

  4轉換

  所謂的動態(tài)和靜態(tài)區(qū)分是另一種基于綁定時間的多態(tài)分類,嚴格來說,重載是編譯時多態(tài),即靜態(tài)多態(tài),根據不同類型函數編譯時會產生不同的名字如int_foo和char_foo等等,以此來區(qū)別調用。故重載仍符合多態(tài)定義——通過單一標識支持不同特定行為的能力,只是重載屬于靜態(tài)多態(tài),而不是通過繼承和虛函數實現(xiàn)的動態(tài)多態(tài)。

  覆蓋

  重載(overload)和多態(tài)無關,真正和多態(tài)相關的是覆蓋(inheritance)。

  當派生類重新定義了基類的虛擬方法后,基類根據賦給它的不同的派生類引用,動態(tài)地調用屬于派生類的對應方法,這樣的方法調用在編譯期間是無法確定的。因此,這樣的方法地址是在運行期綁定的(動態(tài)綁定)。

  重載只是一種語言特性,是一種語法規(guī)則,與多態(tài)無關,與面向對象也無關。

  不過針對所謂的第二種重載,有一個專門的名詞--重寫或重定義。重載與重寫的區(qū)別就在于是否覆蓋,重寫一般多發(fā)生在不同的類且存在繼承關系之間,而重載多是在一個類里或者一塊代碼段里。

  特點:

  由于重載可以在同一個類中定義功能類似的函數,這給程序員管理類的相似函數提供了極大的方便。例如,在一個定義圓的類中,需要設定圓心和半徑來確定一個圓對象,程序員不需要設定setRadius(float r)和SetPoint(float x,float y)兩個不同名函數,而只需要設定一個CSetCicle函數名就夠了。在這個簡單的例子中重載并沒有明顯的優(yōu)勢,可是當一個類中相似功能函數有幾十、上百個的時候,重載的優(yōu)勢就顯現(xiàn)出來了,這時程序員不需要去記這么繁多的函數名,可以把更多的精力放在程序本身上。重載的方法只屬于子類。

  函數:

  1.函數名必須相同,返回值可以相同,也可以不同,但是特征標必須不同。是函數名來確定函數的不同,是特征標是函數可以重載。編譯器首先選在函數名,然后再根據特征標在眾多重載的函數中找到合適的。

  2.匹配函數時,編譯器將不區(qū)分類型引用和類型本身,也不區(qū)分const和非const變量。(小注:因為這些在定義和聲明時可能不同,但是在調用時都是一樣的,編譯器將無法區(qū)分)。但是值得注意的是,形參與const形參的等價性僅適于非引用形參。有const引用形參的函數與有非const引用形參的函數是不同的。類似的,如果函數帶有指向const類型的指針形參,則與帶有指向相同類型的非const對象的指針形參的函數不相同。

  3.名稱修飾(name decoration)。編譯器將根據原型中指定的形參對每個函數名進行加密。

  重定義:

  被重載的函數有不同版本,這些函數地位是一樣的,可以根據特征標的不同選擇不同的函數。被重定義的函數也有不同的版本,但是你不能隨意選擇,你只能選擇最新的版本,被重定義多發(fā)生在類之間的繼承里。

  4.函數會有那么多版本,那么編譯將選哪一個呢。當然,理想情況是,實參與形參的數據類型完全匹配,但是當不完全匹配時會怎樣呢?這就要牽扯到c++里復雜的類型轉換了。

  在重載及函數模板重載里,編譯器選擇函數,要經過以下三步,這個過程稱為重載解析。

  第一步:創(chuàng)建候選函數列表,其中包含有與被調函數名稱相同的函數與模板函數。

  第二步:使用候選函數列表創(chuàng)建可行函數列表。這些都是參數數目正確的函數。

  第三步:確定是否有最佳可行的函數。如果有,則使用。

  確定最佳函數,只考慮其特征標,而不考慮返回類型(也無從考慮,但是要是硬想辦法的話,也有,不過沒有必要為了不必要的性能而浪費資源)。確定最佳函數,匹配特征標要依次經過以下判斷:(1)完全匹配(常規(guī)函數優(yōu)于模板;允許無關緊要的轉換)(2)提升匹配(如char和short自動轉換為int)(3)標準轉換(int轉換為char,long轉換為double)(4)用戶自定義的轉換(如類聲明中定義的轉換函數)。

  完全允許無關緊要的轉換,這些轉換包括引用,指針與實體之間,數組與指針之間,函數與函數指針之間,const與非const等等。

  其次還要注意還要注意匹配的優(yōu)先級。1,指向非const數據的指針和引用優(yōu)先于const的指針和引用參數匹配(這種優(yōu)先級只有當指針或引用出現(xiàn)時產生)。2,非模板函數,優(yōu)于模板函數,顯示具體化的模板將優(yōu)于隱式具體化的模板,總之較具體的優(yōu)先(注意,具體并不是由于顯隱決定的,術語“最具體”是指編譯器推斷使用哪種類型時執(zhí)行的轉換最少)。

  重寫的基本內容

  通常,派生類繼承基類的方法,因此,在調用對象繼承方法的時候,調用和執(zhí)行的是基類的實現(xiàn).但是,有時需要對派生類中的繼承方法有不同的實現(xiàn).

  例如,假設動物類存在"跑"的方法,從中派生出馬和狗,馬和狗的跑得形態(tài)是各不相同的,因此同樣方法需要兩種不同的實現(xiàn),這就需要"重新編寫"基類中的方法.

  "重寫"基類方法就是修改它的實現(xiàn)或者說在派生類中重新編寫

  //java代碼

  //方法重寫

  public class Father {

  public void ovel(int i){

  /*do something...*/   }

  public String ovef(){

  /*do something...*/

  return "***";   }   }

  public class Sun extends Father{

  public void ovel(int i){

  /*do other something...*/   }

  public String ovef(){

  /*do other something...*/

  return "XXX";   }   }

  總結:重寫—   1、必須是在繼承里,   2、方法名、返回值類型、參數個數和參數類型 都必須相同   3、派生類重寫的方法的訪問權限不能低于基類的權限


看了重寫和重載的區(qū)別還看:

1.2017java筆試面試題及參考答案

2.javaweb常見面試題及參考答案

3.2016最新亞信聯(lián)創(chuàng)java面試題

4.最新的java面試題目及參考答案

5.C++基礎筆試題及答案

537689