Java語言與C++語言的差異總結

Java的設計者曾說過,設計這門語言的靈感主要來自於C++。

世上先有C++,然後纔有Java,整個Java語言的發展歷史就是一部對C++的填坑史。所以在Java語言學習過程中,將其與C++語言對比是一件有意義的事情。通過這些對比,我們能夠瞭解到Java語言相對於C++語言有哪些改進,能帶給我們哪些進步,這樣對於更加深入理解這兩種語言是大有裨益的。

 

下面我總結一下Java語言與C++語言的各種差異。

1、Java用來操縱對象的引用可以先初始化再指向對象,而C++的引用必須在初始化時就指向對象。

2、Java類除static和final外其他函數定義默認是虛函數,而C++用virtual關鍵字定義定義函數纔是虛函數。

3、Java有一套繼承自object類型的單根繼承結構,而C++沒有標準庫內置的類繼承體系。

4、Java只能通過new在堆上創建對象,基本類型除外,而C++除了new還是可以創建全局對象或者棧對象。

5、Java有自帶垃圾回收機制,不用關心對象的內存釋放,而C++需要手動釋放通過new創建的對象。

6、Java數組成員能初始化默認值null,提供未初始化的訪問和越界訪問保護,而C++不提供這個機制。

7、Java局部作用域定義的變量不能隱藏更大作用域定義的變量,而C++可以隱藏。

8、Java類的基本類型成員變量可以自動初始化爲默認值,類的複雜類型成員變量或者函數的基本類型成員變量如果沒有初始化會報編譯錯誤,而C++不提供這個機制。

9、Java屬於純面對對象語言,函數只能定義在類裏,而C++可以將函數定義在類外。

10、Java函數調用時入參傳遞,對象類型參數只能傳引用不能傳值,基本類型參數可以傳值,而C++可以使用對象傳值方式。

11、Java用帶反轉域名的類庫命名方式來解決名字污染問題,而C++使用名字空間來解決。

12、Java類所有成員函數實現和變量初始化都要寫在類定義裏,而C++類成員函數在類定義裏申明,在類外實現,成員變量可以在類定義裏初始化。

13、Java通過類名來引用類的靜態成員時,是用類名加.號來引用,而不是C++的:號來引用。

14、Java每個文件只能有一個public類的名稱與文件名稱相同,包外可以訪問這個類但是無法訪問其他類,並且這個類有一個main函數,而C++沒有這個約束。

15、Java註釋採用特定的格式時,可以用javadoc來解析成幫助文檔,而C++不提供這個機制。

16、Java支持>>>操作符的無符號移位方式,不論正負數都用0填充,而C++沒有這個操作符。

17、Java不支持操作符重載機制,而C++支持這個機制。

18、Java沒有sizeof操作符,因爲所有數據類型在所有機器中的大小是相同的,而C++支持sizeof操作符且數據類型在不同機器裏大小不一定一致。

19、Java不支持從整形到布爾型的轉換,而C++支持這個機制。

20、Java支持foreach方式的遍歷數組或容器的循環方法,而C++不提供這個機制。

21、Java支持帶標籤的continue和break語句,用以提供有限的類似C++ goto語句的功能。

22、Java不支持C++的析構函數,但是提供了一個finalize函數,會在垃圾回收之前執行,但是除了一些特殊情況外應盡少使用finalize函數去釋放資源,而是在程序中主動顯式的去釋放資源。

23、Java類的靜態成員只有在類被第一次實例化纔會初始化一次,如果不實例化就不會初始化,而C++類的靜態成員在類實例化前就被初始化了,且跟類是否有實例化沒關係。

24、Java沒有C++類成員初始化列表,只能在類成員被定義後再顯示給類成員賦值。

25、Java數組不能越界寫,否則會報錯誤,而C++不提供這個機制。

26、Java不支持預編譯宏機制,因爲它不用考慮跨平臺差異編譯控制,而C++支持這個機制。

27、Java提供包訪問控制權限能讓包內的類互相訪問,而包外的類不能訪問包內的類,而C++不提供這個機制。

28、Java支持給類設定public或包訪問控制權限,而C++不提供這個機制。

29、Java所有非基本類型對象都有一個特殊的toString方法,用於將對象轉變成String對象,而C++要靠定義String操作符處理函數來實現。

30、Java支持在子類不會覆蓋父類的同名函數,並且可以用super關鍵字來顯示調用父類的函數,而C++的子類會直接覆蓋父類的同名函數。

31、Java中子類構造函數中通過super關鍵字來顯示初始化父類的構造函數,而C++直接調用父類構造函數來進行初始化。

32、Java支持關鍵字final用於定義常量、不能改變的函數參數、不能被覆蓋的方法和不能被繼承的類,而C++對於前兩種通過通過define和const關鍵字支持,對於後兩種不支持。

33、Java用abstract關鍵字表示類的抽象方法,而C++用類似的純虛函數來表示。

34、Java支持用interface定義一個類爲接口類,接口類裏只能存在抽象方法,並用implements來實現這個接口類,而C++不提供這個機制。

35、Java的多重繼承只支持從一個抽象基類或具體基類加多個接口基類派生,或者通過多個抽象的內部類來派生,而C++支持從任意數量抽象基類或具體基類派生。

36、Java擁有類似閉包功能的內部類,能夠訪問外部類的成員,而C++的嵌套類不支持這個機制。

37、Java容器有公共基類collection,如果容器如果沒有指定類型,那麼裏面保存的對象默認都是Object類型,而C++容器沒有這些特性。

38、Java的異常機制支持finally關鍵字,能夠保證不論異常是否被匹配上都會執行finally關鍵字的代碼,而C++不提供這個機制。

39、Java標準庫支持正則表達式,而C++不提供這個機制。

40、Java支持反射機制,其區別於RTTI的是不需要在編譯時確定類的類型信息,而是在運行時才確定類的類型信息,通過Class類可以獲取類名、成員變量、方法和創建類對象等,而C++只支持RTTI機制。

41、Java泛型裏基本類型不能作爲泛型參數,需要用到包裝類型,比如int類型要包裝成Interger類型,原因是泛型對象被擦除成Object類型了,而Object類型不能存儲int類型只能存儲Interger類型,C++沒有這個問題。

42、Java泛型在運行期,無法獲取泛型參數的類型信息,在編譯期做完類型一致性檢查後,對象的類型信息就被擦除了,被轉換成Object類型,運行期不能創建這種參數類型的對象,且只能調用Object或不帶泛型參數類型對象所擁有的方法,一個補償的辦法是爲泛型增加邊界,泛型只會擦除到它的第一個邊界,通過設定邊界就能夠調用這個邊界類型所擁有的方法,而C++模板沒有這個問題。

43、Java泛型支持通配符機制,<?extends T>表示某種從類型T派生的類型,<? super T>表示某種類型T的基類型,<?>表示非Object的某種類型,而C++不支持這個特性。

44、Java爲數組操作提供Arrays類,包含一些靜態函數,而C++通過C庫來完成一些操作,但沒有Java的Arrays類豐富強大。

45、Java容器支持可選操作,某個類型的對象可以不支持這些接口,如果對這種對象調用這個接口就會拋出UnsupportedOperationException異常,這種動態語言特性C++不支持。

46、Java的標準輸入輸出對象是System.in/System.out,而C++是cin/cout。

47、Java中的enum類型比較像類,可以有方法,除了不能繼承,而C++的enum不提供這個機制。

48、Java支持註解機制,可以在代碼中嵌入一定格式的元數據,而C++不提供這個機制。

49、Java的線程庫提供Thread.yield()方法,能夠主動讓出線程的執行權,而C++不支持這個特性。

50、Java語言支持內置的synchronized關鍵字來標記一個方法或語句塊受到鎖的保護,並且一個對象的所有synchronized方法或一個類的所有靜態synchronized方法共享同一個鎖,而C++不提供這個機制。

51、Java的Object.wait()會暫停當前線程進入睡眠狀態,同時會釋放持有的鎖,當另一個進程調用Object.notify()後,睡眠線程會重新持有鎖,然後被喚醒繼續執行,而C++在調用操作系統的同類函數時,是不能在持有鎖的時候睡眠的,因爲睡眠不會釋放鎖。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章