C++和Java的區別:
(面試問到這個問題,特來總結一下 根據C++Prime和Think in Java兩本書總結而來)
儘管Java是基於C++的的,可是相比之下,Java是一種更純粹的面向對象程序設計語言。在Java中,一切都被視爲對象。
1. C++建立對象以後,須要再使用完將其調用delete方法將其銷燬;Java有垃圾回收機制,用來監視new出來的全部對象,辨別不會再被引用的對象,而後釋放內存空間。
2. 做用域(C、C++、Java的做用域由花括號的位置決定):
可是如下代碼在C和C++中是合法的,在Java中編譯器會報告變量已定義。由於C和C++會將較大做用域的變量隱藏起來,可是Java不容許。java
{ int x = 12; { int x = 96; } }
基本成員的默認值
當變量做爲類的成員使用時,Java才確保給定默認值,以確保那些基本類型的成員變量獲得初始化,可是C++沒有此功能。而對於局部變量,C++編譯器會對其予以警告,Java則會視爲錯誤。
Java不能夠將一個非布爾值當作布爾值在邏輯表達式中使用,C++卻能夠。
在C++中表達式的值爲0則爲假,非0則爲真。
例如:c++
if(1){ }
移位操做符
Java中新增了一種「無符號」右移位操做符(>>>),它使用「零擴展」,不管正負,都在高位插入0。這是C、C++中所沒有的。
C++引入了操做符重載機制,Java不支持,可是C#中能夠實現本身的重載操做符。
Java容許咱們把任何基本數據類型轉換成別的基本數據類型,除了布爾類型外。
Java沒有Sizeof()。在C\C++中,sizeof()操做符能夠告訴咱們爲數據項分配的字節數,由於C++中不一樣的數據類型在不一樣的機器上可能有不一樣的大小。可是Java中全部數據類型在全部機器中大小都是相同的。(例如,C++的int在16位機器上爲16位,在32及以上爲32位,long在32位及如下爲32位,在64位上爲64位)
C++有goto,Java沒有goto。
Java提供了一種相似的跳起色制:標籤。用法 label:面試
label1: outer-iteration{ inner-iteration{ break;(1) continue;(2) continue label1;(3) break label1;(4) } }
(1)中,break中斷內部迭代,回到外部迭代
(2)中,continue使執行點移回到內部迭代的起始處。
(3)中,continue label1同時終端內部迭代以及外部迭代,直接轉到label1處;隨後繼續迭代,從外部迭代開始。
(4)break label1 也會中斷全部迭代,並回到label1處,可是不從新進入迭代。即徹底終止兩個迭代。
10. C++中析構函數是提供一個在對象刪除前能夠釋放這個對象所佔用的資源的機會,可是Java並未提供「析構函數」或者相似的概念。
在C++中,對象必定會被銷燬(程序沒有缺陷的狀況下);
在Java裏,對象卻並不是老是被垃圾回收。(垃圾回收並不等於「析構」)
11. 名稱屏蔽若是Java的基類擁有某個已被屢次重載的方法名稱,那麼在導出類中從新定義該方法名稱並不會屏蔽其在基類中的任何版本。而C++若要在子類中引入一個新的重載方法,則須要屏蔽基類方法。數組
12. C++中有多繼承,Java中只有單一繼承。Java能夠經過接口實現多繼承。
13. Java是半解釋和半編譯的,運行速度比C++慢。
14. Java沒有Struct或者Union
15. Java的泛型不容許使用基本數據類型。
16. 數組
在c++中,數組定義時,已經分配存儲空間,並可使用。 (定義時指定數組大小)
在java中,數組定義時,int arr[],隻字義了數組變量,數組是不可使用的。 只有數組new之後,纔會建立數組,分配存儲空間,並可使用。 (定義時指定數組大小是非法的,建立時指定數組大小)
17. C++有指針,Java沒有。
18.附上C++在32位和64位系統的主要長度對比:函數