最近有點空閑時間,學習了Java語言。教材《Java簡明教程》第四版,清華大學出版社。本人以前有C++基礎,所以主要總結下兩者區別。
一、基本類型和運算
1.布爾常量,true和false不是數值,不能進行算術運算。而C++實際是整型。
2.字符串常量,Java作為對象,有自己的屬性和方法。C++,采用‘\0’結束的字符數組。
3.字符型變量,Java采用Unicode編碼,長度為16位,最大值65535。而C++是8位,最大值128。
4.局部變量檢查,當局部變量和外層如類中全局變量相同時,提示編譯錯誤。Java認為相同的命名會容易導致對程序的誤解和混淆。C++則“小范圍變量屏蔽大范圍變量”。
5.變量賦值,類中未給出初始化值,將默認為0,或者空等。而C++不確定的值。
在方法中,未給出初始值,Java無法通過編譯。C++則不會。
6.類型轉換,int x=2+3.14; C++編譯通過。Java編譯失敗,必須改成如下進行強制轉換:
int x=2+(int)3.14;
7.引用,Java規定基本類型按值傳遞,對象類型按引用傳遞。返回值類似。但是Java引用是沒有任何特殊標志,而C++則用‘&’表示。
8.%運算符,Java不但可以對整型運算,浮點型也可以。C++只能對整型運算。
總的來說,Java是一種強類型語言,對變量和常量的類型檢驗比較嚴格。但同時又具備更好的擴展性。
二、類和對象
1.首先,從編輯和文件管理而言,Java的類定義和實現放在一起。C++是分開的。
2.關鍵字this,Java中是特殊的引用,既可以指代對象,也可以指代構造函數(也只能放在構造函數的第一句,所以用在構造函數的重載函數中)。
而C++中,this只能是指向自己的指針,沒有指向函數的功能。
3.Object類,Java所有其他類的祖先。C++沒這個概念。因為Java基於類設計語言,C++可以基於函數。
4.關鍵字super,當父類定義了默認構造函數即無參數構造函數,子類可以自動調用父類的該構造函數。
但是當父類定義了帶參數的構造函數時,子類必須通過super調用父類的該構造函數。C++通過初始化列表。
5.關鍵字final,可以修飾變量和參數,相當於C++中的const。也能修飾類和方法,表示不能被繼承,表示終極類和終極方法。
6.關鍵字abstract,修飾類和方法,表示抽象類和抽象方法,一般用來被繼承。修飾方法時,類似於C++中的純虛函數。
三、字符串處理
C++對字符串處理常用數組,沒有提供字符串對象,如果想要使用對象,則需要自己封裝。而Java提供了兩個類和一系列方法。
1.String類,常量,值不會改變。注意,關系操作符‘==’用於地址比較,而equals方法,用於內容比較。
2.StringBuffer類,帶緩沖區的字符串,值可以被改變。
3.運算操作符,操作符‘+’可以連接兩個String對象,不能連接兩個StringBuffer對象。Java取消了運算操作符,但保留了String的‘+’和‘+=’。
4.StringBuffer對象到String對象的轉換,通過toString()方法。
5.其他,String對象可直接賦值,StringBuffer賦值則通過構造函數。
四、多線程
C++多線程往往需要自己編寫。而Java標准庫支持多線程。例如Java的垃圾回收器是一個低優先級的線程。
1.Java定義了一個類Thread和一個接口Runable。
2.采用synchronized實現多線程同步,協調資源,保護共享變量和方法。
3.多線程優先級,范圍1-10,默認值5。
4.線程間通訊,主要有三個方法:wait(),notify(),notifyAll()。其中,wait()和notify()必須成對出現。
五、其他
1.Java先編譯后解釋執行,而C++是純編譯方式。所以后者執行速度快。
2.Java結構中立,字節碼的中介方式,與運行平台無關。所以可移植性好。
3.Java的變量長度確定不變,與運行平台無關。如int類型都是四個字節。而C++不一樣,跟平台有關。所以Java移植性比C++佳。
4.Java僅支持單繼承(關鍵字extends表示繼承),支持多接口(關鍵字interface定義,關鍵字implements表示實現);當然接口之間也可以存在繼承關系(extends)。
而C++支持多繼承,甚至還可以虛擬繼承。
目前學習到的主要區別是這些,歡迎批評指正。