Java的不斷發(fā)展要?dú)w功于C、C++ 和C# 等編程語(yǔ)言的不斷挑戰(zhàn)。C++、C#和Java等編程語(yǔ)言基本上都來(lái)源于C語(yǔ)言但又有很多區(qū)別。業(yè)內(nèi)人士經(jīng)常將C比作爺爺,C++比做兒子,C# 和Java等語(yǔ)言比作孫子。
對(duì)于變量聲明、參數(shù)傳遞、操作符、流控制等,Java使用了和C、C++、C# 相同的傳統(tǒng),而C++ 主要是對(duì)C的擴(kuò)展并融入了面向?qū)ο蟮乃枷耄珻#和Java語(yǔ)言是純粹的面向?qū)ο蟮木幊陶Z(yǔ)言并吸收了C、C++ 語(yǔ)言的很多優(yōu)點(diǎn),摒棄了很多缺點(diǎn),但C#編程語(yǔ)言的運(yùn)行依賴于Windows平臺(tái),而Java語(yǔ)言不依賴于任何平臺(tái),因此使得熟悉C、C++、C#的程序員能夠很方便地轉(zhuǎn)向Java編程。具體描述有如下幾點(diǎn)。
Java與C、C++對(duì)比
1) 全局變量
在Java編程的過(guò)程中,不能在類之外定義全局變量,如:
public String name; //錯(cuò),不能在類之外定義全局變量
public class GlobalVar{
public static global_var; //全局變量也叫成員變量或成員屬性
}
要定義全局變量,只能通過(guò)在一個(gè)類中定義公用、靜態(tài)的變量來(lái)實(shí)現(xiàn)一個(gè)全局變量。在類GlobalVar中定義變量global_var為public static,使得其他類可以訪問(wèn)和修改該變量。Java對(duì)全局變量進(jìn)行了更好的封裝。而在C和C++ 中,依賴于不加封裝的全局變量常常造成系統(tǒng)的崩潰。
2) 剔除goto關(guān)鍵字
雖然在Java中將關(guān)鍵字goto保留了,但是Java不支持C、C++ 中的goto語(yǔ)句,而是通過(guò)異常處理語(yǔ)句try、Catch、final等來(lái)代替C、C++ 中用goto語(yǔ)句來(lái)處理遇到錯(cuò)誤時(shí)跳轉(zhuǎn)的情況,使程序更易讀且更結(jié)構(gòu)化。
3) 良好的指針控制
指針是C、C++ 編程語(yǔ)言中最有魅力的特性,但它的超高使用難度加上超高靈活性,使得大部分程序員望而止步,在學(xué)習(xí)C、C++ 語(yǔ)言進(jìn)行編程的過(guò)程中,通過(guò)指針?biāo)M(jìn)行的內(nèi)存地址操作常常會(huì)造成不可預(yù)知的錯(cuò)誤,同時(shí)通過(guò)指針對(duì)某個(gè)內(nèi)存地址進(jìn)行顯式類型轉(zhuǎn)換后,可以訪問(wèn)一個(gè)C或C++ 中的私有成員,從而破壞安全性,造成系統(tǒng)的崩潰。而Java語(yǔ)言對(duì)指針進(jìn)行完全的控制,程序員不能直接進(jìn)行任何指針操作,例如把整數(shù)轉(zhuǎn)化為指針,或者通過(guò)指針釋放某一內(nèi)存地址等。同時(shí),數(shù)組作為類在Java中實(shí)現(xiàn),較好地解決了數(shù)組訪問(wèn)越界這一問(wèn)題。
4) 自動(dòng)內(nèi)存回收
一般內(nèi)存資源有限,很容易被程序破壞。在C中,程序員通過(guò)庫(kù)函數(shù)malloc()和free()來(lái)分配和釋放內(nèi)存,在C++ 中則通過(guò)運(yùn)算符new和delete來(lái)分配和釋放內(nèi)存。再次釋放已釋放的內(nèi)存塊或未被分配的內(nèi)存塊,會(huì)造成系統(tǒng)的崩潰;同樣,忘記釋放不再使用的內(nèi)存塊也會(huì)逐漸耗盡系統(tǒng)資源。而在Java中,所有的數(shù)據(jù)結(jié)構(gòu)都是對(duì)象,通過(guò)運(yùn)算符new為它們分配內(nèi)存堆。通過(guò)運(yùn)算符new可以得到對(duì)象的處理權(quán),而實(shí)際分配給對(duì)象的內(nèi)存可能隨程序運(yùn)行而改變,Java對(duì)此自動(dòng)地進(jìn)行管理并且進(jìn)行垃圾收集,有效防止了由于程序員的誤操作而導(dǎo)致的錯(cuò)誤,并且更好地利用了系統(tǒng)資源。
5) 固定的數(shù)據(jù)類型
在C、C++ 語(yǔ)言中不同數(shù)據(jù)類型在不同的平臺(tái)上所占的位數(shù)不一樣,例如,int類型的數(shù)據(jù)在IBM PC中占16位,在VAX-II中占32位,這就導(dǎo)致了代碼的不可移植性。但在Java中,對(duì)于這些數(shù)據(jù)類型都采用國(guó)際統(tǒng)一字符編碼,即分配固定長(zhǎng)度的位數(shù),例如,對(duì)int類型的數(shù)據(jù),它在任何機(jī)器上都占32位,這就保證了Java的平臺(tái)無(wú)關(guān)性。
6) 嚴(yán)格控制數(shù)據(jù)類型轉(zhuǎn)換
一種數(shù)據(jù)類型的數(shù)據(jù)轉(zhuǎn)換成另外一種數(shù)據(jù)類型的數(shù)據(jù)時(shí),常常會(huì)出現(xiàn)數(shù)據(jù)精度丟失的問(wèn)題,在C、C++ 中,通過(guò)指針進(jìn)行任意的數(shù)據(jù)類型轉(zhuǎn)換極不安全,而在Java中,運(yùn)行時(shí)系統(tǒng)對(duì)對(duì)象的處理要進(jìn)行類型相容性檢查,以防止不安全的轉(zhuǎn)換。
7) 庫(kù)文件
編程語(yǔ)言中豐富的庫(kù)文件能快速地開(kāi)發(fā)出各種應(yīng)用軟件。C、C++ 中用頭文件來(lái)聲明類的原型以及全局變量、庫(kù)函數(shù)等,在大的系統(tǒng)中,維護(hù)這些頭文件是很困難的。而Java不支持頭文件,類成員的類型和訪問(wèn)權(quán)限都封裝在一個(gè)類中,運(yùn)行時(shí)系統(tǒng)對(duì)訪問(wèn)進(jìn)行控制,防止對(duì)私有成員的操作。同時(shí),Java中用import語(yǔ)句來(lái)與其他類進(jìn)行通信,以便使用它們的方法。
8) 類與結(jié)構(gòu)體和聯(lián)合體
安全是一個(gè)永恒的話題。C、C++ 中的結(jié)構(gòu)體和聯(lián)合體中的所有成員均為公有,這就帶來(lái)了安全性問(wèn)題。Java中不包含結(jié)構(gòu)體和聯(lián)合體,所有的內(nèi)容都封裝在類中。其實(shí)Java與C、C++ 編程語(yǔ)言還有很多的差別如:速度、內(nèi)部類、方法嵌入等,但總的來(lái)說(shuō)Java提取了很多其他編程語(yǔ)言的優(yōu)點(diǎn),使它更適合于大眾程序員的需求。
2. Java與C# 對(duì)比
Java語(yǔ)言是開(kāi)放式的世界語(yǔ)言,基本源代碼都公開(kāi),而C# 作為Microsoft的一門主打語(yǔ)言也不甘示弱。一個(gè)開(kāi)源,一個(gè)收費(fèi),它們兩者基本上都對(duì)C、C++ 深澀的語(yǔ)法和語(yǔ)義進(jìn)行了改進(jìn)。在語(yǔ)法方面,兩者都摒棄了const修飾、宏替換等;在繼承方面,兩者都采用更易于理解的單繼承和多接口實(shí)現(xiàn)方案;在源代碼組織方面,兩者都提出了聲明與實(shí)現(xiàn)于一體的邏輯封裝。
Java與C# 的不同點(diǎn)主要體現(xiàn)在:C# 在Microsoft的支撐下提供了強(qiáng)大的Visual Studio開(kāi)發(fā)平臺(tái),可以極好地提高C# 程序的開(kāi)發(fā)效率。而且C#更善于利用Windows平臺(tái)。Java的設(shè)計(jì)宗旨是獨(dú)立于任何平臺(tái),因此自然不會(huì)提供太多的Windows特性。但這也正體現(xiàn)了Java語(yǔ)言的跨平臺(tái)優(yōu)勢(shì)。一般企業(yè)級(jí)應(yīng)用,無(wú)法確定這個(gè)應(yīng)用是在怎樣的平臺(tái)上運(yùn)行。因而企業(yè)級(jí)開(kāi)發(fā)一般選擇Java作為開(kāi)發(fā)語(yǔ)言。