Java語言和C++語言的差異——老生常談 (轉)
【宣告】如需複製、傳播,請附上本宣告,謝謝。原文出處:,to:moyingzz@etang.com">moyingzz@etang.com
[引子]這個話題並不新鮮,但是作為語言比較類的文章,從基礎的、具體的、細節的層面來做比較,做小結,恐怕對beginner而言,應該是有所裨益的,想來會比論壇裡的口水仗,抑或概念性的、大層面的比較要來得更為實際一些吧
採用了C及C++的語法格式,對於學習過C及C++的設計者來說,學習Java將有可能很輕鬆。但是,如果仔細檢查Java語言的許多細節,就會發現Java取消了不少C及C++的特性,並且加入了一些新的特性。這些差異包括:
o 不再有指標(Pointer)的概念。
這是Java和C/C++在語法上的主要區別之一。在C及C++中,指標的靈活運用將會給程式設計帶來極大的便利,但是其靈活性也成為了導致程式不穩定的一個主要因素。配合C及C++的管理策略,人員必須親自跟蹤自己向申請到的記憶體,最後確認交還給系統。並且在使用指標時,要隨時注意是否超過合法的記憶體空間,造成Segmentation Fault或General Protection Fault這樣的問題。
Java提供了一種引用(Reference)型別用來替代指標,透過引用去訪問申請到的記憶體空間,可以確保不會訪問不屬於自己的記憶體空間,同時,程式的系統也可以動態地做記憶體垃圾回收工作,將那些被取消引用的記憶體空間回收給系統使用。這種動態記憶體分配機制,透過犧牲一定的靈活性,保證了記憶體分配一定程度上的性。
o 不再有(Function)的概念。
Java程式語言中,取消了結構化語言中最重要的部分--函式。在面向程式設計的概念裡,物件的資料才是真正的主題,而處理物件資料的方法則必須依附在物件內才有意義。因此函式概念完全是不必要的。這強化了物件導向的開發策略。
o 不再使用structure、union和typedef。
事實上,在C++中就可以去掉C中的structure和union等對複雜資料的自定義結構型別了,因為類(Class)的定義方式完全可以做到這項功能。而typedef的功能也可以由類來實現。雖然C++這樣的設計是為了和C相容,但是這些畢竟是多餘的語言特點,在Java語言中便被拋棄了。
o 不再有類的多重繼承(Multiple Inheritance)。
在C++中,多重繼承是一項很強的功能,但也是較難掌握的。取消多重繼承降低了Java語言的功能,但它使Java看起來更為簡潔。同時,Java也提供了介面(Interface)的方式,可以實現部分多重繼承的作用。和多重繼承的不同之處在於介面並不會定義類方法的內容,以及類中的資料。
o 不再有運算子過載(Operator Overloading)。
運算子過載被看作是C++的一個特色。在C++中,利用運算子過載,程式設計者透過對現有運算子賦予自己的定義,可以使程式看起來更為自然。但是,如果使用不當,也會使整個程式的可讀性大受影響。同時,這一功能的存在也並非必要,程式設計者可以定義類中的方法來達到同樣的目的。
o 取消了自動型別轉換。
Java是一種強型別檢查的程式語言,對於諸如浮點型變數賦值給整型變數這樣的情況而言,在C++的語法中是允許的,最多隻是在編譯時給出警告資訊。但是,在Java中,除非寫明強制型別轉換,否則編譯無法透過。
o 不再有預(preprocessor)功能。
利用C/C++中提供的#define、#include等預處理指令,厲害的程式設計人員可以自己開發一套只有自己才看得懂的宏指令集。從工程的角度上看,這對團隊開發軟體和整個軟體的維護都是十分不利的。同時,預編譯後的程式程式碼和程式設計者看到的程式程式碼是不同的。如果宏指令集有錯,產生的錯誤資訊將不會是程式設計人員所預期的,這增加了程式的難度。
o 取消了goto語句。
在C++中,goto語句已經不被建議使用了,保留goto只是為了和C語法相容。在Java中goto語句被完全拋棄了,與此同時,Java又擴大了break語句和continue語句的功能,透過使用break和continue,程式流程被允許在多層迴圈中跳轉。
可以這樣說,Java程式語言是一種簡潔而有效的純物件導向的程式語言。而C++語言因為要與C相容(C++語言是作為C語言的一個超集被定義的),所以在物件導向的特性方面不如Java好。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-980887/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【C++】 63_C語言異常處理C++C語言
- 三種語言實現差分(C++/Python/Java)C++PythonJava
- 【Python】Python 對比 C語言的差異PythonC語言
- Go 語言異常處理Go
- 老生常談-Activity
- 老生常談之再談this
- Java-異常、斷言和日誌Java
- Python與其它程式語言的差異化總結Python
- 類索引器的老生常談索引
- 用Go語言異常機制模擬TryCatch異常捕捉Go
- C++語言程式設計筆記 - 第12章 - 異常處理C++程式設計筆記
- Go和Rust都是系統語言和通用語言 - RedditGoRust
- 聊聊 C 語言和 ABAP 這兩門程式語言的關係
- 老生常談 String、StringBuilder、StringBufferUI
- 老生常談之CSS的垂直居中CSS
- 從錯誤處理看 Rust 的語言和 Go 語言的設計RustGo
- 老生常談之NSProxy和NSTimer
- iOS面試題 — 老生常談iOS面試題
- 今天談談.NET與Java,入門語言的選擇Java
- python---之編譯型語言和解釋型語言的區別Python編譯
- 聊聊C語言/C++—程式和程式語言C語言C++
- 老生常談之Flux與Redux思想Redux
- 老生常談-實現一個PromisePromise
- 大資料教程之《MYSQL資料庫》TCL語言和DCL語言大資料MySql資料庫
- Java核心技術筆記 異常、斷言和日誌Java筆記
- Python 與 JavaScript 語法差異點PythonJavaScript
- 老生常談,聊聊前端的資料互動前端
- Java基礎之淺談異常與瞭解斷言Java
- java語言屬於哪種語言Java
- 老生常談Java虛擬機器垃圾回收機制(必看篇)Java虛擬機
- C++ 的指令碼語言:ChaiScriptC++指令碼AI
- 老生常談:Promise 用法與原始碼分析Promise原始碼
- 聊聊C語言和ABAPC語言
- 初學計算機語言者(C語言,C++,java,pytion,C#)計算機C語言C++JavaC#
- 《C++ Primer》學習筆記(五):迴圈、分支、跳轉和異常處理語句C++筆記
- 不同資料庫SQL語法差異資料庫SQL
- 什麼是靜態語言和動態語言。史上秒懂的大白話翻譯。
- 在資料科學領域,Python語言和R語言有何區別?資料科學PythonR語言
- Java語言概述Java