(1) Java有記憶體回收機制,當然也就沒有C++的解構函式。但是,可控制性和C++相比就差了一點,而且也不是說有了記憶體回收,就不會產生記憶體流失。由於相互引用等原因可能造成對象的生存周期過長,記憶體回收失效。對象記憶體的回收,個人認為應該是由程式員來掌握的事情。C++可以用auto_ptr,shared_ptr等智能指標來完成自動析構,當然前提是你要熟悉他們的實現機制和應用場合(2) Java中所有的對象都是分配在堆上,在Java中只有控制代碼,也就是引用,沒有指標。這樣做有哪些好處呢? a)沒有指標。在java中沒有sizeof, 沒有*。看看下面這些語句吧,感覺是不是很象。b) 避免了臨時對象。在Java中所有的對象都是以控制代碼表示,函數參數傳遞,結果返回等都是以控制代碼形式。也就避免了C++中經常出現的局部指標局部引用問題, 對象參數拷貝賦值,切片等問題,提高了效率和可靠性。String a = new String(“123”); // Java Codestd::string *a = new string(“123”); //c++ code(c) 在Java中,內含項目關聯性只能由控制代碼表示。(3) Java是單根繼承體系,而C++可以有多重繼承。java可以用interface來實現多重繼承。來談談Java中的Object類,許多有趣的地方。Clone方法,C++也可以實現,呵呵,”虛擬建構函式”,參見<<More Effective C++>>Equals方法, 由於Java中對象只能由控制代碼表示,又沒有C++操作符重載的能力,所以這個來比較等價對象。C++中我們可以重載”==”操作符來判斷等價對象。Finalize方法,呵呵,類似於解構函式,但是千萬不要當成解構函式來用哦,這個方法何時調用不是你能把握的,取決於記憶體回收機制hashCode方法, STL沒有HashMap,HashTable等,但是java.util中有,所以…..剩餘的都是滿足線程和同步的方法,跟C++沒有可比性(3) 在java中數組也是對象,所以當你下標越界的時候,會收到一個異常。而C++數組顯然要比Java快點,因為他不檢查index。(4) 在java中,”123”這種字串也是對象,而在C++中確是const char*, 最讓人範錯的是那個字串結束符。但是java和c++對這種const char* 字元去有相同的最佳化,試試下面的代碼:String a = "123"; String b = "123";if (a == b){ System.out.println("OK");} C++代碼:const char *p = "123";const char *q = "123"; if ( q == p) { std::cout<<"OK"<<std::endl; }(5) Java中所有的對象方法都是virtual, 除了聲明為final的方法。(6) 沒有操作符重載(7) 語言級的序列化機制, C++也可以實現,呵呵,看看C++高手對話中的,那位用模板模式來實現序列化。(8) 語言級的線程類極其配套互斥類等(9) 語言級的異常體系。C++中的異常少的可憐,就STL中那幾個,當然C++要的就是高效(10) Java反射機制哎,從反射機制就可以看出來,Java和C++根本就沒有可比性嘛。編譯器能和平台比嗎。那天我在公司論壇上說Java是指令碼,別人還一本正經跟我爭,我覺得我自己很無聊啊