天天看點

java比較曲線類似_為什麼 Java 不支援運算符重載?

作者 | Yujiaao

來源 | https://segmentfault.com/a/1190000019962661

另一個類似的 Java 面試難題。為什麼 C++ 支援運算符重載而 Java 不支援? 有人可能會說 + 運算符在 Java 中已被重載用于字元串連接配接,不要被這些論據所欺騙。

與 C++ 不同,Java 不支援運算符重載。Java 不能為程式員提供自由的标準算術運算符重載,例如+, -,*和/等。如果你以前用過 C++,那麼 Java 與 C++ 相比少了很多功能,例如 Java 不支援多重繼承,Java中沒有指針,Java中沒有位址引用傳遞。

另一個類似的問題是關于 Java 通過引用傳遞,這主要表現為 Java 是通過值還是引用傳參。雖然我不知道背後的真正原因,但我認為以下說法有些道理,為什麼 Java 不支援運算符重載。

1) 簡單性和清晰性。

清晰性是 Java 設計者的目标之一。設計者不是隻想複制語言,而是希望擁有一種清晰,真正面向對象的語言。添加運算符重載比沒有它肯定會使設計更複雜,并且它可能導緻更複雜的編譯器, 或減慢 JVM,因為它需要做額外的工作來識别運算符的實際含義,并減少優化的機會, 以保證 Java 中運算符的行為。

2) 避免程式設計錯誤。

Java 不允許使用者定義的運算符重載,因為如果允許程式員進行運算符重載,将為同一運算符賦予多種含義,這将使任何開發人員的學習曲線變得陡峭,事情變得更加混亂。

據觀察,當語言支援運算符重載時,程式設計錯誤會增加,進而增加了開發和傳遞時間。由于 Java和 JVM 已經承擔了大多數開發人員的責任,如在通過提供垃圾收集器進行記憶體管理時,因為這個功能增加污染代碼的機會, 成為程式設計錯誤之源, 是以沒有多大意義。

java比較曲線類似_為什麼 Java 不支援運算符重載?

3) JVM複雜性。

從JVM的角度來看,支援運算符重載使問題變得更加困難。通過更直覺,更幹淨的方式使用方法重載也能實作同樣的事情,是以不支援 Java 中的運算符重載是有意義的。與相對簡單的 JVM 相比,複雜的 JVM 可能導緻 JVM 更慢,并為保證在 Java 中運算符行為的确定性進而減少了優化代碼的機會。

4) 讓開發工具處理更容易。

這是在 Java 中不支援運算符重載的另一個好處。省略運算符重載後使語言更容易處理,如靜态分析等,這反過來又更容易開發處理語言的工具,例如 IDE 或重構工具。Java 中的重構工具遠勝于 C++。

繼續閱讀