張愛正
【摘 要】當(dāng)前大部分高校都設(shè)有JAVA與C++課程課程,其教學(xué)效果的好壞,直接影響到學(xué)生的程序設(shè)計(jì)能力和對高級語言知識的學(xué)習(xí)興趣。Java是從C++基礎(chǔ)之上發(fā)展過來的,它們有許多相似之處,學(xué)生在學(xué)習(xí)這兩門語言時容易走入誤區(qū),而一些教師又盲目教學(xué),因此學(xué)生在學(xué)習(xí)過程中云山霧水不知所措,在實(shí)際操作中總是出現(xiàn)這樣那樣的程序錯誤。在這里有必要把兩者的一些區(qū)別進(jìn)行分析,目的在于培養(yǎng)學(xué)生獨(dú)立編寫軟件的能力和獨(dú)自思考創(chuàng)新的能力,進(jìn)而提高學(xué)生的就業(yè)競爭力。文章針對教學(xué)中發(fā)現(xiàn)的兩者之間幾個容易混淆的內(nèi)容,對它們進(jìn)行了簡單闡述,希望對大家的學(xué)習(xí)有所幫助。
【關(guān)鍵詞】Java;C++;混淆探討
一、引言
筆者研究很多大學(xué)在第一學(xué)期開設(shè)C++課程,在接下來的學(xué)期會接著開設(shè)與JAVA相關(guān)的課程,只是課程名稱不同而已。在學(xué)習(xí)過程中發(fā)現(xiàn),學(xué)生在學(xué)習(xí)C++基礎(chǔ)上接著學(xué)習(xí)Java課程,并沒有想像的那樣學(xué)起來比較容易。許多學(xué)生在使用Java時會不自覺地混入C++的語法,讓很多人都感到頭疼。在這里對于Java與C++兩者相似但又明顯不同之處作一簡單闡述,希望能對學(xué)生的學(xué)習(xí)或是教師的教學(xué)有所幫助。
二、Java與C++不同之處
1.數(shù)據(jù)類型與變量
對于大部分設(shè)計(jì)語言,數(shù)據(jù)類型與變量都是很重要的基本概念。在C++中數(shù)據(jù)類型除了基本類型外,還有枚舉類型、結(jié)構(gòu)類型、指針類型等。數(shù)據(jù)類型與變量可以是獨(dú)立的,不屬于任何一個函數(shù)或是一個類,C++允許將變量定義為全局的。Java是完全面向?qū)ο蟮恼Z言,所有函數(shù)和變量必須是類的一部分。除了基本數(shù)據(jù)類型之外,其余的數(shù)據(jù)類型都作為類處理,包括數(shù)組。對象將數(shù)據(jù)和方法結(jié)合起來,把它們封裝在類中,這樣每個對象都可實(shí)現(xiàn)自己的特點(diǎn)和行為。此外,Java中取消了C++中的結(jié)構(gòu)和聯(lián)合,消除了不必要的麻煩。另外Java中char類型使用國際通用的16位Unicode字符集,所以能自動表達(dá)大多數(shù)國家的字符。
2.程序結(jié)構(gòu)與main()
在C++中應(yīng)用程序都是由若干個函數(shù)組成的,但必須有且只有一個main函數(shù)。而每一個Java應(yīng)用程序是由若干個類組成的,但必須有且只有一個public類,且類名稱必須與程序的文件名完全相同,這個類稱為主類。每個類可以定義多個方法,所有類中必須有一個main方法,也只能有一個。在C++應(yīng)用程序中,main函數(shù)的定義語句首部是main,它不屬于任何一個類,是獨(dú)立的。根據(jù)需要,這個main函數(shù)定義的首部可以寫成其他形式,如void mian(){},或給mian函數(shù)帶個參數(shù)。C++應(yīng)用程序從main函數(shù)開始執(zhí)行。這個main方法的定義首部一般是固定的(只有public與static的位置可以調(diào)換),也就是說public、static、void、String[]等關(guān)鍵詞全都要有,且不能錯,也不能省略參數(shù),要求非常嚴(yán)格。Java解釋器在沒有生成任何實(shí)例的情況下,以main()方法作為入口來執(zhí)行程序。
3.數(shù)組
數(shù)組是在程序設(shè)計(jì)中,為了處理方便,把具有相同類型的若干變量按有序的形式組織起來的一種形式。C++與Java在使用數(shù)組時定義方法與開辟內(nèi)存單元上有本質(zhì)不同。在C++中,無論是一維數(shù)組還是二維數(shù)組,定義時要指明大小與類型。例如int m[4],n[2][3];在聲明數(shù)組的同時也開辟了內(nèi)存空間,且是連續(xù)的空間。但是,在Java中,定義數(shù)組與開辟內(nèi)存空間必須分開處理。在定義數(shù)組時不能指明大小,例如:int myArray[],m[][];這個語句只能說myArray與m是數(shù)組,myArray是一維數(shù)組,m是二維數(shù)組,但是沒有大小,因此在內(nèi)存中無法開辟內(nèi)存空間。如果要開辟內(nèi)存空間,必須使用new運(yùn)算。例如int myArray[]=newint[10];這個語句的含義是,定義了一個數(shù)組myArray,在內(nèi)存中開辟了能存放10個整型數(shù)據(jù)的連續(xù)空間,數(shù)組myArray指向了這個連續(xù)空間的首地址。變量myArray與10個連續(xù)單元是不在一起的。
4.關(guān)于指針
Java不再使用指針.指針是C和C++中最靈活,也最容易產(chǎn)生錯誤的數(shù)據(jù)類型.由指針?biāo)M(jìn)行的內(nèi)存地址操作常會造成不可預(yù)知的錯誤,同時通過指針對某個內(nèi)存地址進(jìn)行顯式類型轉(zhuǎn)換后,可以訪問一個C++中的私有成員,從而破壞安全性.而Java對指針進(jìn)行完全地控制,程序員不能直接進(jìn)行任何指針操作。
5.繼承
關(guān)于繼承Java與C++都能從父類繼承派生出子類,應(yīng)在用上有還是不同之處。首先繼承的語句及訪問控制不同。在C++中class son:public class father{}就表示子類son公有繼承父類father。繼承時的訪問控制:public、private、protected,會改變父類中的成員在子類中的訪問屬性。而在Java中繼承是用關(guān)鍵詞extends來處理的,例如class son extends father{},繼承沒有訪問控制,因此不會改變從父類繼承過來的成員的訪問屬性,這樣可以減少很多訪問控制上的麻煩。第一關(guān)于多重繼承。C++支持多重繼承,但Java不支持。多重繼承是C++的一個特征,它允許多父類派生一個子類。盡管多重繼承功能很強(qiáng),但使用復(fù)雜,而且會引起許多麻煩,編譯程序?qū)崿F(xiàn)它也很不容易。Java不支持多重繼承,但允許一個類繼承多個接口,也允許一個接口繼承多個接口,實(shí)現(xiàn)了C++多重繼承的功能,又避免了C++中的多重繼承實(shí)現(xiàn)方式帶來的諸多不便。第三對于訪問父類構(gòu)造函數(shù)或方法。在C++語言中,在子類的構(gòu)造函數(shù)中是通過調(diào)用父類的構(gòu)造函數(shù)來給父類成員變量初始化的。如果在子類中重寫了父類的方法,又想在子類中調(diào)用父類的該方法,則可以使用”::”作用域范圍運(yùn)算符來處理,即父類名::函數(shù)名。在Java語言中,是通過super這個關(guān)鍵詞來調(diào)用父類的構(gòu)造方法或普通成員方法的。在子類的構(gòu)造方法中必須通過super()或是super(x)來調(diào)用父類的構(gòu)造方法,并且這條語句必須出現(xiàn)在子類構(gòu)造方法的第一條位置。在子類方法中,通過“super.方法”來訪問父類中被重寫過的方法,通過“super.成員”變量來訪問父類中的成員變量。
三、結(jié)束語
Java與C++都屬于最近普遍流行的高級語言,有很多相同的地方。在學(xué)習(xí)和使用過程中要注意兩者的區(qū)別,以上只是分析了部分區(qū)別,其次還有內(nèi)存管理、多態(tài)、類、函數(shù)沒有默認(rèn)參數(shù)等方面的區(qū)別。為了在C++基礎(chǔ)上更好地學(xué)好Java,在學(xué)習(xí)過程中要學(xué)會比較、歸納與總結(jié),這樣才能更好掌握J(rèn)ava的精華,才能為學(xué)習(xí)Java高級技術(shù)打下結(jié)實(shí)的基礎(chǔ)。