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

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

世上先有C++,而後纔有Java,整個Java語言的發展歷史就是一部對C++的填坑史。因此在Java語言學習過程當中,將其與C++語言對比是一件有意義的事情。經過這些對比,咱們可以瞭解到Java語言相對於C++語言有哪些改進,能帶給咱們哪些進步,這樣對於更加深刻理解這兩種語言是大有裨益的。正則表達式

 

下面我總結一下Java語言與C++語言的各類差別。數組

一、Java用來操縱對象的引用能夠先初始化再指向對象,而C++的引用必須在初始化時就指向對象。閉包

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

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

四、Java只能經過new在堆上建立對象,基本類型除外,而C++除了new仍是能夠建立全局對象或者棧對象。操作系統

五、Java有自帶垃圾回收機制,不用關心對象的內存釋放,而C++須要手動釋放經過new建立的對象。線程

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

七、Java局部做用域定義的變量不能隱藏更大做用域定義的變量,而C++能夠隱藏。對象

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

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

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

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

十二、Java類全部成員函數實現和變量初始化都要寫在類定義裏,而C++類成員函數在類定義裏申明,在類外實現,成員變量能夠在類定義裏初始化。

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

1四、Java每一個文件只能有一個public類的名稱與文件名稱相同,包外能夠訪問這個類可是沒法訪問其餘類,而且這個類有一個main函數,而C++沒有這個約束。

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

1六、Java支持>>>的無符號移位方式,不論正負數都用0填充,而C++根據第一個bit的值來決定是0填充仍是1填充。

1七、Java不支持操做符重載機制,而C++支持這個機制。

1八、Java沒有sizeof操做符,由於全部數據類型在全部機器中的大小是相同的,而C++支持sizeof操做符且數據類型在不一樣機器裏大小不必定一致。

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

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

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

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

2三、Java類的靜態成員只有在類被第一次實例化纔會初始化一次,若是不實例化就不會初始化,而C++類的靜態成員在類實例化前就被初始化了,且跟類是否有實例化不要緊。

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

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

2六、Java不支持預編譯宏機制,由於它不用考慮跨平臺差別編譯控制,而C++支持這個機制。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

4一、Java泛型裏基本類型不能做爲泛型參數,須要用到包裝類型,好比int類型要包裝成Interger類型,緣由是泛型對象被擦除成Object類型了,而Object類型不能存儲int類型只能存儲Interger類型,C++沒有這個問題。

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

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

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

4五、Java容器支持可選操做,某個類型的對象能夠不支持這些接口,若是對這種對象調用這個接口就會拋出UnsupportedOperationException異常,這種動態語言特性C++不支持。

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

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

4八、Java支持註解機制,能夠在代碼中嵌入必定格式的元數據,而C++不提供這個機制。

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

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

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

相關文章
相關標籤/搜索