摘 要:Java和C++都是非常流行的計算機(jī)編程語言,Java作為C++衍生出來的一種優(yōu)秀的語言,和C++有很多相似的地方,但仍然存在一些顯著的差異,文章比較了這兩種語言的主要差別,把握住兩種語言的差別,對于我們學(xué)習(xí)能起到事半功倍的作用。
關(guān)鍵詞:JVM 指針 模板 虛函數(shù)
C++語言在C語言的基礎(chǔ)上加入了面向?qū)ο蟮脑?,在C++語言基礎(chǔ)上又衍生出Java。Java語言借鑒了C++很多成功的經(jīng)驗,同時又摒棄了C++語言的一些“不足”。
1.Java編譯成字節(jié)碼,有Java虛擬機(jī)(JVM)負(fù)責(zé)解釋執(zhí)行,這就使得Java運行具有跨平臺性,同時也降低了執(zhí)行速度;而C++直接編譯成可執(zhí)行代碼,因此C++的執(zhí)行速度比較快,但其跨平臺性低于Java。
2.與C++想比較,Java語言放棄了指針,使用了垃圾回收機(jī)制,很好地避免了在C++語言中由于指針使用不當(dāng)造成的程序崩潰和內(nèi)存泄露,增加了安全性能。
指針是C和C++語言編程中最重要的概念之一,也是最容易產(chǎn)生困惑并導(dǎo)致程序出錯的問題之一。利用指針編程可以表示各種數(shù)據(jù)結(jié)構(gòu),通過指針可使用主調(diào)函數(shù)和被調(diào)函數(shù)之間共享變量或數(shù)據(jù)結(jié)構(gòu),便于實現(xiàn)雙向數(shù)據(jù)通訊;并能像匯編語言一樣處理內(nèi)存地址,可以有效地對變量進(jìn)行底層操作,直接操作變量的地址。非常方便好用,使代碼變得更簡潔。從而編出精練而高效的程序。指針極大地豐富了C和C++語言的功能。但是指針也帶來了很多問題,例如不正確地使用會導(dǎo)致錯誤甚至整個應(yīng)用程序崩潰,同時指針帶來了很多的安全隱患,它也是令很多初學(xué)者頭痛的難題。Java語言明確說明取消了指針。
3.C++允許多重繼承,Java則只能單繼承,Java要實現(xiàn)多繼承,只有借助與接口。
4.Java不支持操作符重載。操作符重載被認(rèn)為是C++的突出特征。Java語言不支持操作符重載是為了保持Java語言盡可能簡單。
5.自動內(nèi)存管理Java中所有的對象都是用new操作符建立在內(nèi)存堆棧上,這個操作符類似于C++的new操作符。下面的語句由一個建立了一個類Read的對象,然后調(diào)用該對象的work方法:Read r=new Read(); r.work();語句Read r=new Read();在堆棧結(jié)構(gòu)上建立了一個Read的實例。Java自動進(jìn)行無用內(nèi)存回收操作,不需要進(jìn)行刪除。而C++中必須釋放內(nèi)存資源,增加了設(shè)計者的負(fù)擔(dān)。Java中當(dāng)一個對象不被再用到時,無用內(nèi)存回收器將給它加上標(biāo)簽以示刪除。Java里無用內(nèi)存回收是以線程方式在后臺運行的,利用空閑時間工作。
6.模板。模板就是實現(xiàn)代碼重用機(jī)制的一種工具,它可以實現(xiàn)類型參數(shù)化,即把類型定義為參數(shù),從而實現(xiàn)了真正的代碼可重用性。Java范型非常類似模板,泛型本質(zhì)上是提供類型的“類型參數(shù)”,它們也被稱為參數(shù)化類型(parameterized type)或參量多態(tài)(parametric polymorphism)。其實泛型思想并不是 Java 最先引入的,C++ 中的模板就是一個運用泛型的例子。GJ (Generic Java)是對 Java 語言的一種擴(kuò)展,是一種帶有參數(shù)化類型的 Java 語言。用 GJ 編寫的程序看起來和普通的 Java 程序基本相同,只不過多了一些參數(shù)化的類型同時少了一些類型轉(zhuǎn)換。實際上,這些 GJ 程序也是首先被轉(zhuǎn)化成一般的不帶泛型的 Java 程序后再進(jìn)行處理的,編譯器自動完成了從 Generic Java 到普通 Java 的翻譯。 GJ 程序的語法在表面上與 C++ 中的模板非常類似,但是二者之間有著本質(zhì)的區(qū)別。 首先,Java 語言中的泛型不能接受基本類型作為類型參數(shù),它只能接受引用類型。這意味著可以定義 List
7.虛函數(shù)。在C++中,虛函數(shù)是在類中被聲明為virtual的成員函數(shù),當(dāng)編譯器看到通過指針或引用此類函數(shù)時,對其執(zhí)行晚綁定,即通過指針(或引用)指向的類型信息來決定該函數(shù)是哪個類的。通常此類指針或引用都聲明為基類的,它可以指向基類或派生類的對象。多態(tài)指同一個方法根據(jù)其所屬的不同對象可以有不同的行為。而在Java中所有的函數(shù)都默認(rèn)為虛函數(shù),其自動實現(xiàn)了虛函數(shù)的機(jī)制,這是較C++進(jìn)步的地方。
8.Java是純面向?qū)ο蟮恼Z言,C++則不同。Java作為純面向?qū)ο蟮恼Z言,很好的體現(xiàn)了面向?qū)ο缶幊痰乃枷?C++作為C語言的“超集”,保留了C語言的結(jié)構(gòu)化編程,加入了面向?qū)ο蟮木幊滩糠?。所以C++不是“純”的面向?qū)ο蟮恼Z言,它是面向結(jié)構(gòu)和面向?qū)ο蠡旌系恼Z言。
總之,Java衍生于C++,它們語法上有很多相似的地方,但是Java也在上述幾個地方與C++有重大區(qū)別,在學(xué)習(xí)Java和C++時,把握住它們的聯(lián)系和差別,可以起到事半功倍的效果。