做者:Khellendros
連接:https://www.zhihu.com/question/29774397/answer/276514866
來源:知乎
著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。 java
引用:
java和c++都有引用的概念,但二者是徹底不一樣的東西,c++的引用是變量的一個別名,引用一旦綁定就不能從新引用其餘變量,c++引用也不能爲null。java引用更像c++的指針,對引用賦值是從新綁定引用的對象(在c++裏面是改變對象的值),引用能夠爲null(致使了煩人的NPE問題,萬惡之源)
類型系統:
java區分值類型與引用類型,用戶自定義類型都是引用類型,值類型和引用類型在不少地方不能混用(如泛型參數),c++沒有值類型和引用類型的概念,相似的概念是普通類和它的指針類型。
java有根基類Object,c++沒有根基類。
訪問控制:
都有public,protected,private三級訪問控制
此外,java還有包訪問控制,c++有友元
繼承:
c++分public繼承,protected繼承(意義不明)和private繼承(基本和組合沒啥區別),java只有public繼承。
c++只能覆蓋基類中顯式定義的虛函數,java中方法默認是虛的,除非顯式標明final
c++支持多重繼承,java只支持單繼承,但支持實現多個接口(c++沒有語法層面上的接口)
構造與析構:
對象構造大體相同,可是c++在構造函數中調用虛函數沒法多態(由於對象的子類部分還沒構造)
c++能夠定義析構函數,java沒有析構函數(java提供一個終結方法,但它和析構函數不是等價的)
對象生命週期控制:
c++主要靠手動申請,釋放內存或者藉助析構函數(RAII技術),java依靠gc
異常處理:
c++沒有也不須要finally塊,釋放資源依靠析構函數就好了。
泛型:
c++模板採用代碼生成技術,運行時可以保留類型信息,java採用類型擦除,類型信息在運行時就沒了(因此其實只是進行安全的自動類型轉換而已……)。c++模板參數能夠是基本類型,用戶自定義類型和整型常量,java只能是引用類型。c++還能夠對模板進行特化,java沒有這個功能。
其餘:
c++有運算符重載,java沒有(除了String類重載了+)c++