C++有許多基本類型,包括結構、聯合、枚舉、數組和指針。C++指針可能指向也可能不指向壹個對象。
Java不枚舉和組合類型是因為Java覺得沒必要。去掉不必要的語言元素是Java對C/C++的壹個重大改變,所以壹般認為Java比C++更輕便、更簡潔。
Java使用Unicode字符集,C++通常使用ASCII字符集。但是ASCII是Unicode的子集,對於習慣了ASCII的程序員來說沒什麽區別。
Java中的布爾類型不能轉換成其他類型,反之亦然。C++最近推出了bool type,表示布爾類型,整數也作為邏輯判斷。
模板是壹種“泛型編程思想”,不同於“面向對象編程思想”。C++已經在很大程度上支持了這種新的編程方式,尤其是STL的出現。
Java目前不支持泛型編程,但據說Sun公司有計劃在Java中引入模板。
C++支持“運算符重載”,這是壹個非常重要的多態特性,也是數據抽象和泛型編程的利器。它允許直接對對象進行四種操作,就像基本數據類型壹樣。
Java不支持這種多態性機制,也是為了降低復雜度。
兩種語言都支持方法重載。
在C++中,為了允許運行時動態決定調用哪個函數,函數必須用虛擬。虛擬關鍵字被自動繼承以支持多態性。
所有沒有用virtual修飾的成員函數(包括static)都是靜態綁定的,也就是說調用哪個版本是在編譯時決定的。
在Java中,除了static、final和private之外,所有方法都被視為動態綁定。
C++裏有個“復制構造函數”的概念,三種情況下會自動調用。
用壹個對象初始化另壹個對象。
對象作為參數進行函數調用
對象作為函數的返回值
通常,當壹個對象需要被“深度復制”(錢能:C++編程教程)時,我們需要事先為它定義“復制構造函數”、“賦值運算符重載函數”、“析構函數”。否則,編譯器會以“按位復制”的形式自動生成相應的默認函數。如果類包含指針成員或引用成員,那麽這三個默認函數意味著錯誤。
Java沒有這樣的語法結構和語義邏輯。
C++支持內聯函數,可以避免函數的棧調用,提高運行效率。
Java沒有這樣的語義。
在C++中,構造函數的初始化列表是這樣使用的:首先按照繼承的順序調用基類的構造函數構造基類對象,然後按照聲明的順序調用成員對象的構造函數構造成員對象,最後初始化列表中出現的成員變量。
Java不使用初始化列表作為構造機制。
它們的結構順序基本相同:
靜態變量初始化
靜態初始化塊(Java)
調用基類的構造函數來構造基類對象。
實例變量的初始化
構造函數的其余部分
Java使用abstract關鍵字來修飾抽象方法或抽象類。
C++的等價語法是“純虛函數”和“抽象類”
兩者都使用抽象類作為繼承層次中的基類,提供通用概念,子類實現其抽象方法,抽象類不能直接實例化為對象。
Java裏有final關鍵字,修飾類,方法或者變量。
最終類不能被繼承
最終方法不能被子類覆蓋。
最後壹個變量是常數。
C++裏沒有這個關鍵字,常量可以用const或者#define來定義。
Const還可以修飾成員函數,即“常量成員函數”。當壹個常量成員函數修改成員數據或者調用壹個非常量成員函數時,編譯器會報告壹個錯誤。
我們應該將不修改成員數據的函數聲明為const。
Java和C++中靜態關鍵字的語法和語義基本相同。
靜態成員變量,也稱為類變量,由類的所有對象共享。
A::x (C++):必須在類外初始化。
A.x (Java):必須在類體中初始化。
靜態成員方法,也稱為類方法,訪問靜態變量。
A::f( ) (C++)
(Java)
兩者都具有內部類和局部類的語法和語義。
Java中沒有friend函數和friend類的概念,嚴格支持封裝,不允許外部方法訪問類的私有成員。
C++支持friend關鍵字,並允許外部方法訪問類的私有成員,因此它不是純粹的面向對象編程語言。
Java中的類或接口可以用public修飾,也可以不用;和C++類不能修改。
三種訪問權限的語義是相同的,但語法略有不同。
C++裏有繼承權修飾符,Java裏沒有。
A類:受保護的B,公共的C (C++)
類A擴展了B (Java)
Java有super關鍵字,指的是父類對象,通常用來調用父類的構造函數或者通用方法。
C++沒有super關鍵字。
都有這個,指的是當前對象。
Java有包的概念,可以組織類,方便打包部署,也有利於類的安全。C++沒有這個概念,壹個類可以被任何類訪問。
Java applet可以嵌入到HTML文檔中,然後由Web瀏覽器下載並執行。
Java API對網絡通信有特殊的支持。
C++沒有內置網絡功能。
C++程序員必須顯式實現動態內存管理,在析構函數中使用delete運算符或free()函數釋放對象和其他動態分配的數據空間,否則會造成“內存泄漏”。
在Java中,垃圾收集是自動的。當對象的最後壹個引用變量被釋放時,該對象就成為垃圾收集器的候選對象。
所以Java不支持析構函數。
finalize()方法主要用於釋放之前打開的非內存資源,比如文件句柄。
Java源代碼編譯成字節碼(。類文件),這是壹種只能被JVM識別的低級二進制代碼。與具體的處理器無關,需要安裝在OS上的JVM來解釋和執行,並轉換成相應平臺的機器碼。因此,Java是架構中立的,跨平臺的。
而C++直接編譯成底層平臺的二進制機器碼,由CPU執行,是平臺相關的。
所以解釋執行的時候,Java程序比較慢。
Java語言支持多線程,允許並發線程同步和互斥操作。
C++沒有這樣的內部機制。