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

lostinai發表於2014-04-18
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++在呼叫作業系統的同類函式時,是不能在持有鎖的時候睡眠的,因為睡眠不會釋放鎖。

http://blog.csdn.net/zjf280441589/article/details/19808681

相關文章