猜猜 Java 為什么不支持運(yùn)算符重載?
作者 |?Yujiaao
來源 |?https://segmentfault.com/a/1190000019962661另一個類似的 Java 面試難題。為什么 C++ 支持運(yùn)算符重載而?Java?不支持??有人可能會說 + 運(yùn)算符在?Java?中已被重載用于字符串連接,不要被這些論據(jù)所欺騙。
與 C++ 不同,Java 不支持運(yùn)算符重載。Java 不能為程序員提供自由的標(biāo)準(zhǔn)算術(shù)運(yùn)算符重載,例如+, -,*和/等。如果你以前用過 C++,那么?Java?與 C++ 相比少了很多功能,例如?Java?不支持多重繼承,Java中沒有指針,Java中沒有地址引用傳遞。
另一個類似的問題是關(guān)于 Java 通過引用傳遞,這主要表現(xiàn)為 Java 是通過值還是引用傳參。雖然我不知道背后的真正原因,但我認(rèn)為以下說法有些道理,為什么 Java 不支持運(yùn)算符重載。
1) 簡單性和清晰性。
清晰性是?Java?設(shè)計者的目標(biāo)之一。設(shè)計者不是只想復(fù)制語言,而是希望擁有一種清晰,真正面向?qū)ο蟮恼Z言。添加運(yùn)算符重載比沒有它肯定會使設(shè)計更復(fù)雜,并且它可能導(dǎo)致更復(fù)雜的編譯器, 或減慢?JVM,因?yàn)樗枰鲱~外的工作來識別運(yùn)算符的實(shí)際含義,并減少優(yōu)化的機(jī)會, 以保證?Java?中運(yùn)算符的行為。
2) 避免編程錯誤。
Java 不允許用戶定義的運(yùn)算符重載,因?yàn)槿绻试S程序員進(jìn)行運(yùn)算符重載,將為同一運(yùn)算符賦予多種含義,這將使任何開發(fā)人員的學(xué)習(xí)曲線變得陡峭,事情變得更加混亂。
據(jù)觀察,當(dāng)語言支持運(yùn)算符重載時,編程錯誤會增加,從而增加了開發(fā)和交付時間。由于?Java和?JVM?已經(jīng)承擔(dān)了大多數(shù)開發(fā)人員的責(zé)任,如在通過提供垃圾收集器進(jìn)行內(nèi)存管理時,因?yàn)檫@個功能增加污染代碼的機(jī)會, 成為編程錯誤之源, 因此沒有多大意義。
3) JVM復(fù)雜性。
從JVM的角度來看,支持運(yùn)算符重載使問題變得更加困難。通過更直觀,更干凈的方式使用方法重載也能實(shí)現(xiàn)同樣的事情,因此不支持 Java 中的運(yùn)算符重載是有意義的。與相對簡單的?JVM?相比,復(fù)雜的?JVM?可能導(dǎo)致?JVM?更慢,并為保證在?Java?中運(yùn)算符行為的確定性從而減少了優(yōu)化代碼的機(jī)會。
4) 讓開發(fā)工具處理更容易。
這是在?Java?中不支持運(yùn)算符重載的另一個好處。省略運(yùn)算符重載后使語言更容易處理,如靜態(tài)分析等,這反過來又更容易開發(fā)處理語言的工具,例如 IDE 或重構(gòu)工具。Java 中的重構(gòu)工具遠(yuǎn)勝于 C++。
-?END?-
往期推薦
Spring Boot自定義Annotation實(shí)現(xiàn)接口自動冪
Java 性能優(yōu)化:35 個你注意不到的小細(xì)節(jié)
下方二維碼關(guān)注我

互聯(lián)網(wǎng)草根,堅持分享技術(shù)、創(chuàng)業(yè)、產(chǎn)品等心得和總結(jié)~

點(diǎn)擊“閱讀原文”,領(lǐng)取 2020 年最新免費(fèi)技術(shù)資料大全
↓↓↓