從面向對象的角度看Go語言與Java語言的區別


Go語言風格

GO語言是支持並發編程和內存垃圾回收的編譯型靜態類型語言,運行效率高,具有較強的可伸縮性(scalable)。它是為軟件工程服務而進行的語言設計,強制語言規范。GO語言的面向對象編程非常簡潔優雅,沒有繼承,隱藏的this指針等。它的面向對象是語言類型系統中的天然的一部分。整個類型系統通過接口串起來渾然一體。

Go語言與JAVA語言的區別

  1. 類型系統:JAVA中有兩套完全獨立的類型系統,一套是值類型系統,byte、int、boolean、char、double另一套是以object類型為根的對象類型系統,Integer,HashMap等。值類型系統希望用object類型引用,則需要裝箱。而go語言中多數類型都是值語義,甚至包括一些復合類型如數組(array),結構體(struct)等,並且這些類型都可以有方法。我們可以給任何類型增加新方法。同時Go語言可以通過&獲得一個對象的引用如 var b=&a

  2. 對象傳遞:Java中對象的方法會有隱藏的this指針傳遞,而Go語言中面向對象只是換了一種語法形式來表達,沒有隱藏的this指針,即方法施加的目標顯示傳遞,沒有被隱藏。另外方法施加的目標不一定是指針(java傳遞的是指向對象的指針),如果是指針也可以不命名為this。

  3. 初始化:Java中有默認的構造函數或者用戶自定義的構造函數,在Go中不需要,可以自定義一個普通的函數。

  4. 成員的可訪問性:Java中使用private,protected,public,package等關鍵字進行訪問控制。如果希望某個符號可被其他包(package)訪問,需要將該符號定義為大寫字母開頭。小寫字母開頭的符號只能在包內訪。

  5. 繼承:Java的繼承通過extends關鍵字完成,不支持多繼承。Go語言的繼承通過匿名組合完成:基類以Struct的方式定義,子類只需要把基類作為成員放在子類的定義中,並且可以通過調整基類成員的位置改變內存布局。

  6. 接口:java中的接口作為不同組件中的契約存在,是強制的,類必須聲明實現了某接口,需要從該接口繼承。哪怕是兩個一模一樣的接口但只有名字不一樣,也只能根據類所聲明的實現接口是否包括該接口來決定該類是否實現該接口,叫做“侵入式”的接口。而GO語言中采用的是非侵入式接口,一個類只需要實現接口要求的所有函數,那我們就說該類實現了該接口。GO語言可以通過接口進行接口查詢(接口指向的對象是否實現了另外的接口),類型查詢等。

  7. 多態:Java中的多態實現遵循一個原則:當超類對象引用變量引用子類對象時,被引用對象的類型而不是引用變量的類型決定了調用誰的成員方法,但是這個被調用的方法必須是在超類中定義過的,也就是說被子類覆蓋的方法。Java中的多態可以通過基於繼承和基於接口兩種方法實現。而在go語言一般不允許不同類型的賦值,即不支持傳統的多態。interface是一個例外,可以用不同類型進行賦值只要一個類型實現了該接口,我們就可以將該類型的變量賦給該接口的變量。

參考資料


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM