為什麼不能根據返回型別區分過載?
過載(Overload)和重寫(Override)的區別。過載的方法能否根據返回型別進行區分?
答:方法的過載和重寫都是實現多型的方式,區別在於前者實現的是編譯時的多型性,而後者實現的是執行時的多型性。過載發生在一個類中,同名的方法如果有不同的引數列表(引數型別不同、引數個數不同或者二者都不同)則視為過載;重寫發生在子類與父類之間,重寫要求子類被重寫方法與父類被重寫方法有相同的返回型別,比父類被重寫方法更好訪問,不能比父類被重寫方法宣告更多的異常(里氏代換原則)。過載對返回型別沒有特殊的要求。
面試題:華為的面試題中曾經問過這樣一個問題 – “為什麼不能根據返回型別來區分過載”,快說出你的答案吧!
因為呼叫時不能指定型別資訊,編譯器不知道你要呼叫哪個函式。
例如float max(int a, int b); int max(int a, int b);
void f() {} int f() {}
並不能作為某個方法的“標識”
答:方法的過載和重寫都是實現多型的方式,區別在於前者實現的是編譯時的多型性,而後者實現的是執行時的多型性。過載發生在一個類中,同名的方法如果有不同的引數列表(引數型別不同、引數個數不同或者二者都不同)則視為過載;重寫發生在子類與父類之間,重寫要求子類被重寫方法與父類被重寫方法有相同的返回型別,比父類被重寫方法更好訪問,不能比父類被重寫方法宣告更多的異常(里氏代換原則)。過載對返回型別沒有特殊的要求。
面試題:華為的面試題中曾經問過這樣一個問題 – “為什麼不能根據返回型別來區分過載”,快說出你的答案吧!
因為呼叫時不能指定型別資訊,編譯器不知道你要呼叫哪個函式。
例如float max(int a, int b); int max(int a, int b);
當呼叫max(1, 2);時無法確定呼叫的是哪個,單從這一點上來說,僅返回值型別不同的過載是不應該允許的。
再比如對下面這兩個方法來說,雖然它們有同樣的名字和自變數,但其實是很容易區分的:void f() {} int f() {}
若編譯器可根據上下文(語境)明確判斷出含義,比如在 int x=f()中,那麼這樣做完全沒有問題。
然而, 我們也可能呼叫一個方法,同時忽略返回值;我們通常把這稱為“為它的副作用去呼叫一個方法”,
因為我 們關心的不是返回值,而是方法呼叫的其他效果。所以假如我們象下面這樣呼叫方法: f();
怎樣判斷f()的具體呼叫方式呢?而且別人如何識別並理解程式碼呢?由於存在這一類的問題,
所以不能 根據返回值型別來區分過載的方法。
並不能作為某個方法的“標識”
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30046312/viewspace-2143540/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 過載(Overload)和重寫(Override)的區別。過載的方法能否根據返回型別進行區分IDE型別
- 軟體根據什麼原則、原理劃分模組
- java面試題0001-區分類中過載方法的依據是什麼?Java面試題
- Mybatis的Mapper中的方法為什麼不能過載?MyBatisAPP
- JavaScript字串物件 之 根據字元返回位置、根據位置返回字元、字串操作方法JavaScript字串物件字元
- 【轉載】git github gitlib gitlab分別是什麼,有什麼區別?GithubGitlab
- Dive Into Kotlin(四):為什麼 Kotlin 的根型別是「Any?」Kotlin型別
- MySQL、NoSQL分別是什麼?有什麼區別?MySql
- 根據副檔名識別檔案型別(轉)型別
- 為什麼Javascript需要型別?JavaScript型別
- 使用什麼工具可以快速分類檔案 根據名稱進行分類
- 網路攻擊事件分為哪些型別?主要包括什麼?事件型別
- Google搜尋為什麼不能無限分頁?Go
- 根據表示式得出變數型別的網站變數型別網站
- 面試官:Java的重寫和過載有什麼區別?面試Java
- 泛型作為返回型別的寫法泛型型別
- 為什麼劃分了獨立的boot區以後grub不能識別(轉)boot
- 什麼是組合資料型別?Python組合資料型別分為幾類?資料型別Python
- 雲原生和雲端計算分別指什麼?有什麼區別?
- Android 解決Map根據地址返回經緯度方法getFromLocationName()不能正常執行Android
- 駭客型別有哪些?他們有什麼區別?型別
- 剖根問底:Java 不能實現真正泛型的原因是什麼?Java泛型
- 【知識分享】根伺服器是什麼有哪些型別伺服器型別
- 等保1.0和2.0分別是什麼?兩者有什麼區別?
- 為啥大神們可以根據ORA 600錯誤引數猜測 錯誤型別?型別
- Java中基本資料型別和包裝型別有什麼區別?Java資料型別
- 根據需要的圖表型別選擇echarts對應的series型別型別Echarts
- iOS-列舉型別為什麼要用iOS型別
- []==''返回?為什麼?運算子==進行了什麼操作?
- 3 * 0.1 == 0.3將會返回什麼?為什麼?
- 根據使用者型別跳轉頁面(基於mybatis)型別MyBatis
- 測試面試題:cookie/session/token 分別表示什麼意思,有什麼區別?面試題CookieSession
- 央行:區塊鏈能做什麼、不能做什麼?區塊鏈
- java泛型中<?>和<T>有什麼區別?Java泛型
- 資料庫型別區分資料庫型別
- 社群的教程買過的為什麼不能看了
- 為什麼range不是迭代器?range到底是什麼型別?型別
- Linux中連結分為哪兩種?它們有什麼區別?Linux