C語言是經(jīng)典的面向過程的編程語言,編程入門一般都學(xué)C語言以了解編程以及鍛煉邏輯思維能力,在一些跟硬件比較緊密的編程中也經(jīng)常用到。\x0d\x0a\x0d\x0aC++是在C語言的基礎(chǔ)上加入了面向?qū)ο蟮母拍睿蔀榛旌闲兔嫦驅(qū)ο笳Z言,功能強(qiáng)大,但難度也大。\x0d\x0a\x0d\x0aJava是在C++的基礎(chǔ)上進(jìn)行改進(jìn)的,摒棄了一些C++的不足之處,語法跟C++很像,它是運(yùn)行在Java虛擬機(jī)上,所以可以跨平臺(tái),一處編譯,到處執(zhí)行。\x0d\x0a\x0d\x0a編程都是易學(xué)難精,哪個(gè)都好學(xué),哪個(gè)又都不好學(xué)。都有很好的發(fā)展前景,就看是什么方向了。底層的C、桌面應(yīng)用程序、游戲等等C++、嵌入式,網(wǎng)頁,Java。
創(chuàng)新互聯(lián)專注于方正企業(yè)網(wǎng)站建設(shè),成都響應(yīng)式網(wǎng)站建設(shè)公司,商城網(wǎng)站開發(fā)。方正網(wǎng)站建設(shè)公司,為方正等地區(qū)提供建站服務(wù)。全流程定制網(wǎng)站設(shè)計(jì),專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)
java是一種面向?qū)ο蟮木幊陶Z言。盡管Java語言使用了許多C語言描述,但由于技能系統(tǒng)規(guī)劃著重于可移植性,安全性和可伸縮性,因此Java語言更適合Internet環(huán)境。這也是Java?;ヂ?lián)網(wǎng)時(shí)代飛速發(fā)展的重要原因。 Java語言功能強(qiáng)大,可以在互聯(lián)網(wǎng)時(shí)代,移動(dòng)互聯(lián)網(wǎng)時(shí)代和大數(shù)據(jù)時(shí)代找到自己的位置。
java好,沒有錯(cuò)。不是語言的問題,是java的生態(tài)更好,開源的屬性,框架多,資源多,容易找到學(xué)習(xí)的資源,碰到問題基本搜索即可搞定,工作也好找,應(yīng)用范圍廣,大廠都用。實(shí)際上,c語言與Java相同年代的Python演講在計(jì)劃思想上與Java有很多相似之處,但是Python的演講更加關(guān)注庫的作用,其演講風(fēng)格更加開放和Java的語言依賴于此Sun的技能體系似乎相對“專心”,但是Sun的技能體系還具有基于Java結(jié)果的新開發(fā)形式。是必需的,但是EJB沒有達(dá)到期望的結(jié)果。C偏向底層。java是應(yīng)用層。 比如單片機(jī) 嵌入式這塊C語言比較多。 而java更多應(yīng)用在服務(wù)端,Android 這些領(lǐng)域
大一學(xué)校在上c,自己正在學(xué)javaweb,別的不說,就java的IDE就比古老的vc好看,而且c學(xué)了只能操作黑框框,java配合前端寫個(gè)網(wǎng)頁比較有趣,c用來練習(xí)數(shù)據(jù)結(jié)構(gòu)題目不錯(cuò)本人自學(xué)一路過來兩個(gè)都學(xué)了,java確實(shí)要好學(xué)點(diǎn),但如果你要做單獨(dú)運(yùn)行系統(tǒng),要學(xué)習(xí)前臺(tái),那又比c麻煩很多,不過學(xué)會(huì)了一種其他都特別快c語言市場需求沒有JAVA大,大部分公司都是用JAVA來開發(fā),c語言是以前JAVA出現(xiàn)之前的主流面向過程的編程語言,JAVA的面向?qū)ο笳Z言基本上目前的主流了。
java是跨平臺(tái)的,效率比一般的高級語言低,C語言幾乎直接轉(zhuǎn)換為機(jī)器語言,效率是比所有的高級語言都高。因此C寫的軟件在運(yùn)行時(shí)比JAVA寫的同樣功能的代碼效果許多許多。
C語言是經(jīng)典的面向過程的編程語言,編程入門一般都學(xué)C語言以了解編程以及鍛煉邏輯思維能力,在一些跟硬件比較緊密的編程中也經(jīng)常用到。\x0d\x0a\x0d\x0aC++是在C語言的基礎(chǔ)上加入了面向?qū)ο蟮母拍?,成為混合型面向?qū)ο笳Z言,功能強(qiáng)大,但難度也大。\x0d\x0a\x0d\x0aJava是在C++的基礎(chǔ)上進(jìn)行改進(jìn)的,摒棄了一些C++的不足之處,語法跟C++很像,它是運(yùn)行在Java虛擬機(jī)上,所以可以跨平臺(tái),一處編譯,到處執(zhí)行。\x0d\x0a\x0d\x0a編程都是易學(xué)難精,哪個(gè)都好學(xué),哪個(gè)又都不好學(xué)。都有很好的發(fā)展前景,就看是什么方向了。底層的C、桌面應(yīng)用程序、游戲等等C++、嵌入式,網(wǎng)頁,Java。
JAVA和C++都是面向?qū)ο笳Z言。也就是說,它們都能夠?qū)崿F(xiàn)面向?qū)ο笏枷耄ǚ庋b,繼乘,多態(tài))。而由于c++為了照顧大量的C語言使用者,而兼容了C,使得自身僅僅成為了帶類的C語言,多多少少影響了其面向?qū)ο蟮膹氐仔?!JAVA則是完全的面向?qū)ο笳Z言,它句法更清晰,規(guī)模更小,更易學(xué)。它是在對多種程序設(shè)計(jì)語言進(jìn)行了深入細(xì)致研究的基礎(chǔ)上,摒棄了其他語言的不足之處,從根本上解決了c++的固有缺陷。
Java和c++的相似之處多于不同之處,但兩種語言有幾處主要的不同使得Java更容易學(xué)習(xí),并且編程環(huán)境更為簡單。
我在這里不能完全列出不同之處,僅列出比較顯著的區(qū)別:
1.指針
JAVA語言讓編程者無法找到指針來直接訪問內(nèi)存無指針,并且增添了自動(dòng)的內(nèi)存管理功能,從而有效地防止了c/c++語言中指針操作失誤,如野指針?biāo)斐傻南到y(tǒng)崩潰。但也不是說JAVA沒有指針,虛擬機(jī)內(nèi)部還是使用了指針,只是外人不得使用而已。這有利于Java程序的安全。
2.多重繼承
c++支持多重繼承,這是c++的一個(gè)特征,它允許多父類派生一個(gè)類。盡管多重繼承功能很強(qiáng),但使用復(fù)雜,而且會(huì)引起許多麻煩,編譯程序?qū)崿F(xiàn)它也很不容易。Java不支持多重繼承,但允許一個(gè)類繼承多個(gè)接口(extends+implement),實(shí)現(xiàn)了c++多重繼承的功能,又避免了c++中的多重繼承實(shí)現(xiàn)方式帶來的諸多不便。
3.?dāng)?shù)據(jù)類型及類
Java是完全面向?qū)ο蟮恼Z言,所有函數(shù)和變量都必須是類的一部分。除了基本數(shù)據(jù)類型之外,其余的都作為類對象,包括數(shù)組。對象將數(shù)據(jù)和方法結(jié)合起來,把它們封裝在類中,這樣每個(gè)對象都可實(shí)現(xiàn)自己的特點(diǎn)和行為。而c++允許將函數(shù)和變量定義為全局的。此外,Java中取消了c/c++中的結(jié)構(gòu)和聯(lián)合,消除了不必要的麻煩。
4.自動(dòng)內(nèi)存管理
Java程序中所有的對象都是用new操作符建立在內(nèi)存堆棧上,這個(gè)操作符類似于c++的new操作符。下面的語句由一個(gè)建立了一個(gè)類Read的對象,然后調(diào)用該對象的work方法:
Read r=new Read();
r.work();
語句Read r=new Read();在堆棧結(jié)構(gòu)上建立了一個(gè)Read的實(shí)例。Java自動(dòng)進(jìn)行無用內(nèi)存回收操作,不需要程序員進(jìn)行刪除。而c十十中必須由程序員釋放內(nèi)存資源,增加了程序設(shè)計(jì)者的負(fù)擔(dān)。Java中當(dāng)一個(gè)對象不被再用到時(shí),無用內(nèi)存回收器將給它加上標(biāo)簽以示刪除。JAVA里無用內(nèi)存回收程序是以線程方式在后臺(tái)運(yùn)行的,利用空閑時(shí)間工作。
5.操作符重載
Java不支持操作符重載。操作符重載被認(rèn)為是c十十的突出特征,在Java中雖然類大體上可以實(shí)現(xiàn)這樣的功能,但操作符重載的方便性仍然丟失了不少。Java語言不支持操作符重載是為了保持Java語言盡可能簡單。
6.預(yù)處理功能
Java不支持預(yù)處理功能。c/c十十在編譯過程中都有一個(gè)預(yù)編澤階段,即眾所周知的預(yù)處理器。預(yù)處理器為開發(fā)人員提供了方便,但增加了編譯的復(fù)雜性。JAVA虛擬機(jī)沒有預(yù)處理器,但它提供的引入語句(import)與c十十預(yù)處理器的功能類似。
7. Java不支持缺省函數(shù)參數(shù),而c十十支持
在c中,代碼組織在函數(shù)中,函數(shù)可以訪問程序的全局變量。c十十增加了類,提供了類算法,該算法是與類相連的函數(shù),c十十類方法與Java類方法十分相似,然而,由于c十十仍然支持c,所以不能阻止c十十開發(fā)人員使用函數(shù),結(jié)果函數(shù)和方法混合使用使得程序比較混亂。
Java沒有函數(shù),作為一個(gè)比c十十更純的面向?qū)ο蟮恼Z言,Java強(qiáng)迫開發(fā)人員把所有例行程序包括在類中,事實(shí)上,用方法實(shí)現(xiàn)例行程序可激勵(lì)開發(fā)人員更好地組織編碼。
8 字符串
c和c十十不支持字符串變量,在c和c十十程序中使用Null終止符代表字符串的結(jié)束,在Java中字符串是用類對象(string和stringBuffer)來實(shí)現(xiàn)的,這些類對象是Java語言的核心,用類對象實(shí)現(xiàn)字符串有以下幾個(gè)優(yōu)點(diǎn):
(1)在整個(gè)系統(tǒng)中建立字符串和訪問字符串元素的方法是一致的;
(2)J3陽字符串類是作為Java語言的一部分定義的,而不是作為外加的延伸部分;
(3)Java字符串執(zhí)行運(yùn)行時(shí)檢空,可幫助排除一些運(yùn)行時(shí)發(fā)生的錯(cuò)誤;
(4)可對字符串用“十”進(jìn)行連接操作。
9“goto語句
“可怕”的goto語句是c和c++的“遺物”,它是該語言技術(shù)上的合法部分,引用goto語句引起了程序結(jié)構(gòu)的混亂,不易理解,goto語句子要用于無條件轉(zhuǎn)移子程序和多結(jié)構(gòu)分支技術(shù)。鑒于以廣理由,Java不提供goto語句,它雖然指定goto作為關(guān)鍵字,但不支持它的使用,使程序簡潔易讀。
l0.類型轉(zhuǎn)換
在c和c十十中有時(shí)出現(xiàn)數(shù)據(jù)類型的隱含轉(zhuǎn)換,這就涉及了自動(dòng)強(qiáng)制類型轉(zhuǎn)換問題。例如,在c十十中可將一浮點(diǎn)值賦予整型變量,并去掉其尾數(shù)。Java不支持c十十中的自動(dòng)強(qiáng)制類型轉(zhuǎn)換,如果需要,必須由程序顯式進(jìn)行強(qiáng)制類型轉(zhuǎn)換。
11.異常
JAVA中的異常機(jī)制用于捕獲例外事件,增強(qiáng)系統(tǒng)容錯(cuò)能力
try{//可能產(chǎn)生例外的代碼
}catch(exceptionType name){
//處理
}
其中exceptionType表示異常類型。而C++則沒有如此方便的機(jī)制。
附:
Java群體每天都在擴(kuò)大,它既包括一些世界最大的ISV,也包括公司CIO、信息技術(shù)人員、系統(tǒng)分析人員、C/S開發(fā)人員、編程人員、多媒體設(shè)計(jì)者、市場行銷人員、教育工作者、經(jīng)理、影視生產(chǎn)者甚至業(yè)余愛好者等廣泛的用戶。從傳統(tǒng)上看,這樣一些人在一起有效地工作是不多見的。當(dāng)我們談到開放系統(tǒng)時(shí),我們往往是就已發(fā)表的API及規(guī)格,或者源碼的可得性,或者硬件、聯(lián)網(wǎng)及操作系統(tǒng)而言的,沒有一個(gè)人是從人的開放意義上來談的。Java完成了開放系統(tǒng)的閉合鏈。它開發(fā)了人力資源,而反過來又開辟了共同工作的道路。
一談到Java,人們馬上會(huì)想起一種類似于C++的、適用于分布環(huán)境的面向?qū)ο缶幊陶Z言,想到這種語言的簡單、穩(wěn)定、安全、與體系結(jié)構(gòu)無關(guān)、可移植、可解釋、高性能、多線程和動(dòng)態(tài)性等特征。這些都是Java作為一種程序設(shè)計(jì)語言的主要特征。
Java是由Sun公司的一個(gè)技術(shù)小組研制出來的。在實(shí)現(xiàn)Java語言的過程中,Sun小組的技術(shù)人員很快就意識(shí)到:C++無法成為一種完全面向?qū)ο蟮?、網(wǎng)絡(luò)化的開發(fā)語言。C++是通過給原先的C語言增加面向?qū)ο蠊δ芏_發(fā)出來的,因此,它存在著先天不足。這主要體現(xiàn)在C++種類繁多,功能大量冗余,同時(shí)又沒有任何一種C++編譯器能夠支持它的全部功能。鑒于這種情況,Sun公司的技術(shù)人員決定不擴(kuò)充C++,而開發(fā)一種全新的計(jì)算機(jī)語言(Java的前身Oak)。但是,C++已經(jīng)成了大多數(shù)編程人員所熟練掌握的語言,Java的設(shè)計(jì)顯然不能無視這個(gè)現(xiàn)實(shí)。如果Java和C++之間的差別過大,那么程序員們在學(xué)會(huì)這種語言的過程中無疑要花費(fèi)大量的時(shí)間和精力。因此,Java保留了盡可能多的C++風(fēng)格。
Java自誕生起,為網(wǎng)絡(luò)用戶創(chuàng)造了無數(shù)客戶端的小應(yīng)用程序,由于這類應(yīng)用程序效果良好、數(shù)量巨大,以至于許多用戶想到Java編程語言時(shí),會(huì)在腦海中出現(xiàn)一個(gè)不完全正確的印象-Java是用來編寫小的客戶端程序的。其實(shí),隨著技術(shù)的進(jìn)步,Java語言正在逐步改變自己執(zhí)行效率較低、無法擔(dān)任企業(yè)關(guān)鍵計(jì)算任務(wù)的形象,不斷向計(jì)算技術(shù)的核心地帶前進(jìn)。今天的Java技術(shù)正沿著網(wǎng)絡(luò)滲入各個(gè)應(yīng)用領(lǐng)域。
企業(yè)計(jì)算:企業(yè)計(jì)算是Java最重要的技術(shù)主題。Sun公司已經(jīng)公布了企業(yè)JavaBean(EJB,Enterprise JavaBean)的規(guī)格,隨后眾多公司開始開發(fā)企業(yè)應(yīng)用領(lǐng)域的Java技術(shù)。IBM公司也已經(jīng)為Windows NT開發(fā)了IBM HPCJ(High Performance Compiler for Java)12.0版,同時(shí)研制了IBM JDK(JavaDevelopment Kit)for Windows NT,Novell公司也在宣布了一個(gè)新的服務(wù)器端的企業(yè)Java平臺(tái),而Sun公司也在積極地升級自己的JDK系統(tǒng),這個(gè)形勢表明,Java正在穩(wěn)步走向企業(yè)高端計(jì)算。對于Java來說,與其它編程語言爭奪企業(yè)計(jì)算主力編程工具的優(yōu)勢在于:其一,Java在進(jìn)行面向?qū)ο蟮木幊坦ぷ鲿r(shí),比其它的編程語言如C++更加簡單,因此保證了編程的高效率,減少了編程投入;其二,Java虛擬機(jī)技術(shù)所提供的"一次編程,到處使用"的跨平臺(tái)能力非常適合網(wǎng)絡(luò)環(huán)境,這給Java在網(wǎng)絡(luò)服務(wù)器端的發(fā)展提供了便利條件;其三,Java擁有強(qiáng)大的提供商和支持者隊(duì)伍,該隊(duì)伍包括IBM、Oracle、Novell、Sybase和Netscape等公司。
提速運(yùn)行:許多企業(yè)的應(yīng)用開發(fā)人員非常喜愛Java的語言特性,但是在開發(fā)重要系統(tǒng)時(shí),語言特性和執(zhí)行效率之間的抉擇往往令人傷透腦筋。在關(guān)鍵計(jì)算中,用戶可能并不在乎數(shù)據(jù)如何壓縮或者運(yùn)行的延遲關(guān)系如何設(shè)置,但是對程序的運(yùn)行速度卻非常重視,這使廠商將Java的編譯策略開發(fā)放在了首位?,F(xiàn)在的Java語言,其執(zhí)行方式已經(jīng)不僅僅是解釋執(zhí)行方式了,即時(shí)編譯器(JITC、just-in-time compiler)技術(shù)和原型編譯技術(shù)已經(jīng)被許多廠家采用,包括Sun、IBM、Oracle以及Netscape等公司在內(nèi)的技術(shù)提供商正在利用這些技術(shù)逐步提高Java的執(zhí)行速度,其中IBM公司早已將Java虛擬機(jī)(JVM,JavaVirtual Machine)、操作系統(tǒng)和硬件的特性有機(jī)的結(jié)合在一起,非常有效地提高了Java的執(zhí)行效率。
嵌入計(jì)算:嵌入式Java是一個(gè)潛力巨大的應(yīng)用技術(shù),該技術(shù)充分發(fā)揮了Java小巧靈活的特點(diǎn)。以HP公司為例,該公司以自己的方式制造編譯工具和Java虛擬機(jī),其目的是將Java嵌入各種設(shè)備,如打印機(jī)、醫(yī)學(xué)監(jiān)視器和自動(dòng)提款機(jī)等。嵌入設(shè)備依靠一個(gè)實(shí)時(shí)操作系統(tǒng)來處理某一個(gè)實(shí)時(shí)生效的事件,Java被嵌入這些設(shè)備后,通過實(shí)時(shí)擴(kuò)展(real-time extension)開始發(fā)揮作用,使設(shè)備具備了一定的智能性,增強(qiáng)了嵌入設(shè)備的可管理性和可用性,大大提高了設(shè)備的工作效率。各廠商對這一潛力巨大的市場都非常重視,目前該市場缺乏的是一個(gè)標(biāo)準(zhǔn),如果存在標(biāo)準(zhǔn)的話,相信很快就會(huì)有大量使用嵌入Java技術(shù)的設(shè)備上市。
微軟剛剛發(fā)行的Windows XP放棄了對Java的支持,但Java能夠獨(dú)立運(yùn)行于很多操作平臺(tái)上,其中也包括Linux,并且在某些特性上要比在Windows上發(fā)揮得更好,我們完全有理由拋棄Windows而選擇使用Linux來做Java開發(fā)?,F(xiàn)在,你可以左手拿著Linux,右手拿著Java,然后對面帶微笑手里拿著Windows XP的Bill Gates說:"讓你的XP去見鬼吧!"
對于軟件開發(fā)者來講,任何一種編程語言都不可能是完美的。如果希望更好地理解Java語言,最好的方法是把這種語言與其同類型的語言相比較。既然Java類似于C++,把它同C++進(jìn)行一番比較也是順理成章的事情,哪一個(gè)好,哪一個(gè)不好,每個(gè)開發(fā)人員都有各自的看法。我個(gè)人認(rèn)為Java開發(fā)要比C++好一些。當(dāng)然每個(gè)人的看法和喜好是不同的。后面的文章將向大家介紹Java和C++的不同和對其的改進(jìn)。孰強(qiáng)孰弱,大家自然就會(huì)明白了。
我們知道,Java一開始采用C++的語法格式,基本上是為了讓程序設(shè)計(jì)者可以很快地熟悉 Java的語法格式,縮短學(xué)習(xí)Java的時(shí)間,畢竟C和C++仍舊是最多人會(huì)的一種程序語言。但是如果我們仔細(xì)檢查Java程序語言的許多細(xì)節(jié)設(shè)計(jì),我們可以發(fā)現(xiàn)Java去掉了不少C++的特點(diǎn),并且加入一些新的特性。這些與C++的差異包括:
1.不再有#define、#include等預(yù)處理程序(Preprocessor)的功能
C++語言很重要的一個(gè)特點(diǎn)就是它的預(yù)處理程序。有些其他程序語言雖然也加入了#include的功能,但是還是欠缺處理宏(Macro)的能力。#define的功能在Java中我們可以用定義常數(shù)(constant)的方式來取代,而#include在Java中是不需要的,因?yàn)樵贘ava中程序在執(zhí)行時(shí),會(huì)把類型數(shù)據(jù)記錄在對象實(shí)體之中,我們不需要靠一些標(biāo)頭文件(header file)來知道我們使用的對象或數(shù)值是屬于什么數(shù)據(jù)類型。
如果你使用C++語言時(shí),只使用預(yù)處理程序的#include和#define功能的話,那么你大概不會(huì)覺得Java這樣的設(shè)計(jì)對你產(chǎn)生什么樣的困擾,但是如果你是使用C++語言預(yù)處理程序中宏功能的高手,你可能會(huì)覺得很不方便,進(jìn)而懷疑Java如此設(shè)計(jì)的意義何在。
使用預(yù)處理程序雖然可以很方便地達(dá)到許多功能,但是站在軟件工程的角度上看,對整個(gè)軟件的維護(hù)其實(shí)是很不利的。由于C++語言中預(yù)處理程序的功能太過強(qiáng)大,厲害的程序設(shè)計(jì)高手常會(huì)自行開發(fā)一套只有自己看的懂的宏語言,一旦整個(gè)軟件要交給其他人去維護(hù),后繼者很難在短時(shí)間內(nèi)了解前一個(gè)人所寫下的宏功能,增加軟件開發(fā)時(shí)團(tuán)隊(duì)工作及日后維護(hù)的困難度。
另外一點(diǎn)則是C++語言的編譯器所看到的程序代碼,其實(shí)和程序設(shè)計(jì)者看到的程序代碼是不同的。程序設(shè)計(jì)者看到的是尚未經(jīng)過預(yù)處理程序處理過的程序代碼,而編譯器看到的則是預(yù)處理程序處理過的程序代碼,一旦交給預(yù)處理程序處理的宏內(nèi)容有誤,編譯器產(chǎn)生的錯(cuò)誤信息將不會(huì)是程序設(shè)計(jì)師所預(yù)料的。而這一點(diǎn)自然也增加了程序在排錯(cuò)時(shí)的困難度。
預(yù)處理程序的存在也造成了閱讀程序的不便。如果你想使用別人已經(jīng)完成的C++語言程序,那么通常你不但要閱讀他所寫下的文件,還必須一并查閱上文件,才能了解其程序的全貌。如果換成是Java程序,只要查看java的程序文件就夠了。
2.不再有structure、union及typedef
事實(shí)上,早在C++中就可以去掉C語言中的structure和union等對復(fù)雜數(shù)據(jù)的自定結(jié)構(gòu)類型,因?yàn)轭?Class)的定義方式可以完全做到這項(xiàng)功能。而typedef也是不必要的,一切都用類就可以了。雖然C++這樣的設(shè)計(jì)是為了和C語言兼容,但是使用多余的語言特點(diǎn)不但不必要,而且容易造成對程序認(rèn)識(shí)的混淆。
3.不再有函數(shù)
在Java程序語言中,去掉了程序向?qū)дZ言中最重要的單元--函數(shù)(Function)。如果我們以對象向?qū)У挠^念來看待函數(shù),就可以了解函數(shù)在對象向?qū)У母拍钪?,是不必要的。在對象向?qū)У某绦蛴^念里,對象的數(shù)據(jù)才是真正的主體,而處理對象數(shù)據(jù)的方法則必須依附在對象內(nèi)才有意義。因此,去掉函數(shù)并不表示不再有子程序等模組化程 序的概念,相反地,是利用對象中的方法來取代函數(shù),再一次強(qiáng)化對向?qū)У陌l(fā)展策略。
4.不再有多重繼承(Multiplelnheritance)
在C++中,多重繼承是一項(xiàng)很強(qiáng)的功能,但也是一般人難以掌控的部分。去掉多重繼承雖然降低了Java語言的功能,但是也大幅簡化撰寫程序時(shí)的困難度。雖然移除了多重繼承的功能,但是Java提供了interface的方式,可以達(dá)到部分多重繼承的功用。所謂的interface基本上定義了一個(gè)類的對外溝通的方法原型,以及類內(nèi)部的常 數(shù),和多重繼承不同之處在于interface并不會(huì)定義類方法的內(nèi)容,以及類中的變量數(shù)據(jù)。
5.不再有Goto
在程序語言的發(fā)展史上,Goto一直是毀譽(yù)參半的一項(xiàng)功能。在很多時(shí)候使用Goto可以大幅減少不必要的程序代碼,但是也由于Goto可以很自由地改變程序的流程,如果冒然地使用,更可能造成程序結(jié)構(gòu)混亂的情況。一般來說,正確使用Goto的例子多出現(xiàn)在循環(huán)內(nèi)部,想要提早結(jié)束某一層循環(huán)。在C語言中,我們可以使用break 或contine來改變某一層循環(huán)的流程, 但如果想要改變兩層以上的環(huán)執(zhí)行流程,不是使用Goto就是以多余的布爾(boolean)變量,配合上一串if-then-else的判斷來達(dá)成。
Java一方面移除了Goto的功能, 而另一方面同時(shí)擴(kuò)大了break和continue的功能,可以允許多層循環(huán)的break或continue。如此一來不但避免了濫用Goto的可能性,同時(shí)也保存下Goto的好處。
6.不再有OperatorOverloading
在C++中,Operator Overloading同樣也是一項(xiàng)值得討論的設(shè)計(jì)。幾乎在所有C++的書中,都會(huì)引用一些例子,告訴你使用OperatorOverloading可以使你的程序看起來更為自然。如下面是一個(gè)程序設(shè)計(jì)師自定義的復(fù)數(shù)類:
//C++中自定義的復(fù)數(shù)類及0pemtor Overloading
class Complex{
public:
Complex(double real,double image){
Real_number=real;
Image_number=image;
}
Complex operator+(Complexrhs){
Return Complex(rhs.real_number+real_number,
rhs.image_number+image_,nulnbef);
}
private:
doublereal_number //實(shí)部
doublejmage_nunmber; //虛部
}
在這里,如果你使用+來作為復(fù)數(shù)的加法符號(hào),大家都不會(huì)有疑義,但是如果你使用的是*或》這樣的符號(hào),那么別人看到你的程序之后,難保不會(huì)產(chǎn)生認(rèn)識(shí)上的錯(cuò)誤。這也是Operator Overloading一大問題,當(dāng)大家都對運(yùn)算符賦予自己的定義后,整個(gè)程序的可讀性就會(huì)大受影響。Operator Overloading的存在并不是必要的,我們一樣可以定義類中的方法來達(dá)到同樣的目的,至于Java去掉這項(xiàng)功能的利弊,恐怕就要讀者自己去評斷了。
7.取消自動(dòng)類型轉(zhuǎn)換
Java是一個(gè)嚴(yán)格進(jìn)行類型檢查的程序語言,對于下面這樣的程序,在C++的編譯器上編譯時(shí)最多只會(huì)出現(xiàn)警告的信息,但是在Java里則不予通過:
Int aInteger; Double aDouble=2.71828; AInteger = aDouble;
雖然這樣的轉(zhuǎn)型在C++里是合法的,但是也會(huì)造成數(shù)據(jù)精確度的損失。Java為了要確定寫程序的人充分地了解這點(diǎn),必須要程序設(shè)計(jì)強(qiáng)制轉(zhuǎn)型(type casting),Java的編譯器才會(huì)接受:
int aInteger;
doublea Double=2.71828;
aInteger=(int)aDouble;
8.不再有指針
取消指針(Pointer)這樣數(shù)據(jù)類型,可能會(huì)讓許多熟悉C++語言的程序設(shè)計(jì)師大吃一驚。在C++語言里,靈活地運(yùn)用指針是許多程序設(shè)計(jì)師的得意之作,但是占整個(gè)除錯(cuò)時(shí)間最久的也是指針的問題。配合上C++對內(nèi)存管理的態(tài)度,程序設(shè)計(jì)師必須要自己去追蹤自己向系統(tǒng)要到的內(nèi)存,最后確實(shí)地交還給系統(tǒng),并且在使用指針時(shí),要小心翼翼地注意不要跨過合法的記憶空間,造成Segmentation Fault或General Protection Fault之類的問題。
Java去掉了指針類型,并不表示程序設(shè)計(jì)師在開發(fā)高級數(shù)據(jù)結(jié)構(gòu),像堆棧(stack)、 隊(duì)列(queue)、二元樹(binarytree)時(shí),都必須要像在傳統(tǒng)Basic上,利用大范圍的數(shù)組來自行模擬系統(tǒng)內(nèi)存,自行建構(gòu)類似指針的表示方式。
相反地,Java提供了和Lisp語言中相似的Reference類型,通過Reference去讀取配置到的內(nèi)存內(nèi)容,可以確保不會(huì)去讀取到不屬于自己的內(nèi)存空間,而另一方面,程序的執(zhí)行系統(tǒng)也可以動(dòng)態(tài)地去做內(nèi)存垃圾回收的工作,將沒有被reference參考到的內(nèi)存空間回收給系統(tǒng)使用。
9.和C++連接
不管Java是多么強(qiáng)大,總是有人需要把它和C++連接起來。因?yàn)橹灰幸粋€(gè)新的程序語言或是軟件開發(fā)工具一出現(xiàn),大家就會(huì)問:"它是否具有和原有程序庫連接的能力呢?"也因?yàn)镃++語言在電腦界中占了很重要的地位。大家的問題其實(shí)就等于是直接問"它是否可以和C++連接?"。目前在Java中,的確提供了和C++語言連接的方法,它的做法基本上是先將C++語言所寫的程序建構(gòu)成動(dòng)態(tài)鏈接函數(shù)庫(DynamicLinking Library,DLL),再由Java程序去調(diào)用DLL里的函數(shù)。
這種連接的方式,使得DLL中的函數(shù),從Java的眼光看就是一個(gè)"方法"。不過因?yàn)檫@種方法是直接由其他的程序語言所提供,而不是以Java語言所寫的,所以它被稱之為"原生方法"(NativeMethod)。
由于Java Applet一些安全上的限制,所以這種連接外部程序的方法只能用在Java Application內(nèi)。
小結(jié):
事實(shí)上,constant和typedef這兩條語句包含了#define語句的作用?,F(xiàn)在,結(jié)構(gòu)和聯(lián)合已經(jīng)被Java的類所代替。刪除這些特性的原因是:由于其希望維持與C語言的向后兼容性,C ++的語言規(guī)范包含了大量冗余。比如,類實(shí)際上就已經(jīng)包括了結(jié)構(gòu)和聯(lián)合的作用,因此這兩種數(shù)據(jù)結(jié)構(gòu)完全可以取消。關(guān)于#define語句,Java語言規(guī)范的制訂者認(rèn)為:盡管該語句的出發(fā)點(diǎn)是為了增強(qiáng)程序的可讀性,但實(shí)際效果卻恰恰相反,它常常導(dǎo)致難讀的代碼,故應(yīng)該予以取消。Java不再支持獨(dú)立函數(shù),因此任何函數(shù)都必須封裝到某個(gè)類中。由于人們普遍認(rèn)為, C++所用的超類是非常不穩(wěn)定的,因此Java拋棄了C++中的多繼承并代之以接口。Java的接口指的是,在別的類看來一個(gè)類所能實(shí)現(xiàn)的方法。它所顯示的只是一個(gè)類的方法或常量和變量 ,而不是這個(gè)類的全部結(jié)構(gòu)。
最后,Java還取消了C++中的GOTO語句、操作符重載、自動(dòng)類型轉(zhuǎn)換及指針數(shù)據(jù)類型。 GOTO語句引起的爭議已經(jīng)有很多年了,可一直陰魂不散,這跟某些程序員對該語句一直情有獨(dú)鐘有關(guān)。C++仍然支持?jǐn)?shù)據(jù)類型的自動(dòng)轉(zhuǎn)換,但Java要求編程人員顯式實(shí)現(xiàn)數(shù)據(jù)類型之間的轉(zhuǎn)換。自動(dòng)數(shù)據(jù)類型轉(zhuǎn)換使得兩個(gè)數(shù)據(jù)類型互不兼容的變量可以相互賦值,而不需要給出顯式說明。這有時(shí)會(huì)導(dǎo)致一些問題,其中最常見的是精確度損失。比方說,如果把一個(gè)帶符號(hào)的32位整數(shù)賦給一個(gè)無符號(hào)整數(shù),則所有的結(jié)果均為正數(shù)。Java的設(shè)計(jì)者們認(rèn)為這很容易引起程序錯(cuò)誤,從而決定不支持這種轉(zhuǎn)換方式。
C語言是經(jīng)典的面向過程的編程語言,編程入門一般都學(xué)C語言以了解編程以及鍛煉邏輯思維能力,在一些跟硬件比較緊密的編程中也經(jīng)常用到。\x0d\x0a\x0d\x0aC++是在C語言的基礎(chǔ)上加入了面向?qū)ο蟮母拍?,成為混合型面向?qū)ο笳Z言,功能強(qiáng)大,但難度也大。\x0d\x0a\x0d\x0aJava是在C++的基礎(chǔ)上進(jìn)行改進(jìn)的,摒棄了一些C++的不足之處,語法跟C++很像,它是運(yùn)行在Java虛擬機(jī)上,所以可以跨平臺(tái),一處編譯,到處執(zhí)行。\x0d\x0a\x0d\x0a編程都是易學(xué)難精,哪個(gè)都好學(xué),哪個(gè)又都不好學(xué)。都有很好的發(fā)展前景,就看是什么方向了。底層的C、桌面應(yīng)用程序、游戲等等C++、嵌入式,網(wǎng)頁,Java。