本文僅從片面的角度比較Java與C++的一些特性,如有錯誤的地方,請指正。
語言特性上的一些差異:
1、Java沒有無符號整數,C++/C#都有。
2、Java中不存在指針。Java的引用是功能弱化的指針,只能做“調用所指對象的方法”的操作,C#默認不使用指針,在unsafe標識時可以使用。
3、Java不能用雙等號比較字符串(注意常量池中的字符串),C++/C#可以。
4、Java強制局部變量初始化。
5、Java不支持自動類型轉換,必須強制類型轉換。
6、Java和C#沒有宏。
7、C++經過編譯連接后生成二進制代碼,C#生成MSIL,Java生成字節碼。
8、Java和C#有垃圾回收機制(GC),C++需要手動釋放資源,可能會因失誤忘記釋放資源而造成內存泄漏等問題(C++11提供智能指針來解決這一問題)。
類機制上的一些差異:
1、 Java是完全面向對象的,所有方法都必須寫在類中,C++既可以面向過程也可以面向對象,函數不必須寫在類中。為了避免命名重復與實現代碼重用性,C++和C#使用命名空間,Java使用包。
2、 Java中有強制性異常(除RuntimeException外,必須在編譯前處理),而C++沒有。(C++ C# 和Java的捕獲異常語法大體相同)
3、 Java所有對象都直接或間接繼承自Object,並且提供接口機制,C++沒有共同的基類。
4、 Java在重寫時默認為虛函數,而C++必須用virtual說明。
C++:
1 class A 2 { 3 public: 4 void virtual FUN() //修改這里的virtual 5 { 6 cout<<"FUN in A is called"<<endl; 7 } 8 }; 9 10 class B : public A 11 { 12 public: 13 void FUN() 14 { 15 cout<<"FUN in B is called"<<endl; 16 } 17 }; 18 int main() 19 { 20 A a; 21 B b; 22 A *p; 23 p = &a; 24 p->FUN(); 25 p = &b; 26 b.FUN(); 27 return 0; 28 } 29 /* 30 有virtual時結果 31 FUN in A is called 32 FUN in B is called 33 */ 34 /* 35 刪去virtual時結果 36 FUN in A is called 37 FUN in A is called 38 */
Java:
1 class A{ 2 public void FUN(){ 3 System.out.println("FUN in A is called"); 4 } 5 } 6 class B extends A{ 7 public void FUN(){ 8 System.out.println("FUN in B is called"); 9 } 10 } 11 public class VirtualTest { 12 public static void main(String args[]) { 13 A a = new A(); 14 B b = new B(); 15 A p; 16 p = a; 17 p.FUN(); 18 p = b; 19 p.FUN(); 20 } 21 } 22 /* 23 默認為virtual 24 FUN in A is called 25 FUN in B is called 26 */
5、 Java因會與方法重載產生語義二義性而不支持默認參數。
6、 C++有運算符重載,和類型轉換函數,而Java中沒有。
7、Java 不支持多重繼承,只能通過實現多個接口來達到相同目的,C++ 支持多重繼承。
8、Java 不支持條件編譯,C++ 通過 #ifdef #ifndef 等預處理命令從而實現條件編譯。