天天看點

Java為什麼不支援運算符重載?

問題引入:

c++運算符重載一頓操作猛如虎,Java是否可以呢?

現實:

java并不支援這項特性,但是這樣的功能也是可以直接使用方法進行實作,就是用起來比較的啰嗦,c++一個運算符搞定的事情,java需要寫一個方法調用。

現況分析:

對面向對象的語言來說,運算符本身就不夠“面向對象”,一切都可以用方法來實作

java中确實沒有雲運算符重載,唯一例外是String裡面的=和+

String類的"=","+","+=",看似運算符重載,實際不是,隻是在java編譯器裡做了一點手腳。

java編譯器對String的運算符做了特殊處理。

java沒有提供運算符重載的功能,程式員無法定義+ * 等運算符,沒有給程式員自己重載運算符的權利。

java不支援運算符重載的原因:

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

2.避免程式設計錯誤。Java不允許使用者定義的運算符重載,因為如果允許程式員進行運算符重載,将為同一運算符賦予多種含義,這将使任何開發人員的學習曲線變得陡峭,事情變得更加混亂。據觀察,當語言支援運算符重載時,程式設計錯誤會增加,進而增加了開發和傳遞時間。由于Java和JVM已經承擔了大多數開發人員的責任,如在通過提供垃圾收集器進行記憶體管理時,因為這個功能增加污染代碼的機會,成為程式設計錯誤之源,是以沒有多大意義。

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

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