天天看點

Java的特點以及與C++、C、C#的聯系與差別

一、Java簡介

Java是由Sun Microsystems公司于1995年5月推出的Java面向對象程式設計語言和Java平台的總稱。由James Gosling和同僚們共同研發,并在1995年正式推出。

Java分為三個體系:

1、JavaSE(J2SE)(Java2 Platform Standard Edition,java平台标準版)

2、JavaEE(J2EE)(Java 2 Platform,Enterprise Edition,java平台企業版)

3、JavaME(J2ME)(Java 2 Platform Micro Edition,java平台微型版)。

2005年6月,JavaOne大會召開,SUN公司公開Java SE 6。此時,Java的各種版本已經更名以取消其中的數字"2":J2EE更名為Java EE, J2SE更名為Java SE,J2ME更名為Java ME。

二、Java的主要特性

1、Java語言是簡單的:Java語言的文法與C語言和C++語言很接近,使得大多數程式員很容易學習和使用。另一方面,Java丢棄了C++中很少使用的、很難了解的、令人迷惑的那些特性,如操作符重載、多繼承、自動的強制類型轉換。特别地,Java語言不使用指針,而是引用。并提供了自動的廢料收集,使得程式員不必為記憶體管理而擔憂。

2、Java語言是面向對象的:Java語言提供類、接口和繼承等面向對象的特性,為了簡單起見,隻支援類之間的單繼承,但支援接口之間的多繼承,并支援類與接口之間的實作機制(關鍵字為implements)。Java語言全面支援動态綁定,而C++語言隻對虛函數使用動态綁定。總之,Java語言是一個純的面向對象程式設計語言。

3、Java語言是分布式的:Java語言支援Internet應用的開發,在基本的Java應用程式設計接口中有一個網絡應用程式設計接口(java net),它提供了用于網絡應用程式設計的類庫,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(遠端方法激活)機制也是開發分布式應用的重要手段。

4、Java語言是健壯的:Java的強類型機制、異常處理、垃圾的自動收集等是Java程式健壯性的重要保證。對指針的丢棄是Java的明智選擇。Java的安全檢查機制使得Java更具健壯性。

5、Java語言是安全的:Java通常被用在網絡環境中,為此,Java提供了一個安全機制以防惡意代碼的攻擊。除了Java語言具有的許多安全特性以外,Java對通過網絡下載下傳的類具有一個安全防範機制(類ClassLoader),如配置設定不同的名字空間以防替代本地的同名類、位元組代碼檢查,并提供安全管理機制(類SecurityManager)讓Java應用設定安全哨兵。

6、Java語言是體系結構中立的:Java程式(字尾為java的檔案)在Java平台上被編譯為體系結構中立的位元組碼格式(字尾為class的檔案),然後可以在實作這個Java平台的任何系統中運作。這種途徑适合于異構的網絡環境和軟體的分發。

7、Java語言是可移植的:這種可移植性來源于體系結構中立性,另外,Java還嚴格規定了各個基本資料類型的長度。Java系統本身也具有很強的可移植性,Java編譯器是用Java實作的,Java的運作環境是用ANSI C實作的。

8、Java語言是解釋型的:如前所述,Java程式在Java平台上被編譯為位元組碼格式,然後可以在實作這個Java平台的任何系統中運作。在運作時,Java平台中的Java解釋器對這些位元組碼進行解釋執行,執行過程中需要的類在聯接階段被載入到運作環境中。

9、Java是高性能的:與那些解釋型的進階腳本語言相比,Java的确是高性能的。事實上,Java的運作速度随着JIT(Just-In-Time)編譯器技術的發展越來越接近于C++。

10、Java語言是多線程的:在Java語言中,線程是一種特殊的對象,它必須由Thread類或其子(孫)類來建立。通常有兩種方法來建立線程:其一,使用型構為Thread(Runnable)的構造子類将一個實作了Runnable接口的對象包裝成一個線程,其二,從Thread類派生出子類并重寫run方法,使用該子類建立的對象即為線程。值得注意的是Thread類已經實作了Runnable接口,是以,任何一個線程均有它的run方法,而run方法中包含了線程所要運作的代碼。線程的活動由一組方法來控制。Java語言支援多個線程的同時執行,并提供多線程之間的同步機制(關鍵字為synchronized)。

11、Java語言是動态的:Java語言的設計目标之一是适應于動态變化的環境。Java程式需要的類能夠動态地被載入到運作環境,也可以通過網絡來載入所需要的類。這也有利于軟體的更新。另外,Java中的類有一個運作時刻的表示,能進行運作時刻的類型檢查。

三、編譯語言與解釋型語言

Java既可以被編譯,也可以被解釋。通過編譯器,可以把Java程式翻譯成一種中間代碼-稱為位元組碼-可以被Java解釋器解釋的獨立于平台的代碼。通過解釋器,每條Java位元組指令被分析,然後在計算機上運作。隻需編譯一次,程式運作時解釋執行。

編譯型語言在程式執行之前,有一個單獨的編譯過程,将程式翻譯成機器語言就不用再進行翻譯了。解釋型語言,是在運作的時候将程式翻譯成機器語言,是以運作速度相對于編C/C++等都是編譯型語言,而Java,C#等都是解釋型語言。

雖然Java程式在運作之前也有一個編譯過程,但是并不是将程式編譯成機器語言,而是将它編譯成位元組碼(可以了解為一個中間語言)。在運作的時候,由JVM将位元組碼再翻譯成機器語言。

注:腳本語言一般都有相應的腳本引擎來解釋執行。 他們一般需要解釋器才能運作。JAVASCRIPT,ASP,PHP,PERL,Nuva都是腳本語言。C/C++編譯、連結後,可形成獨立執行的exe檔案。

Java的特點以及與C++、C、C#的聯系與差別
Java的特點以及與C++、C、C#的聯系與差別

編譯型語言:

1、編譯型語言最大的優勢之一就是其執行速度。用C/C++編寫的程式運作速度要比用Java編寫的相同程式快30%-70%。

2、編譯型程式比解釋型程式消耗的記憶體更少。

3、不利的一面——編譯器比解釋器要難寫得多。

4、編譯器在調試程式時提供不了多少幫助——有多少次在你的C語言代碼中遇到一個“空指針異常”時,需要花費好幾個小時來明确錯誤到底在代碼中的什麼位置。

5、可執行的編譯型代碼要比相同的解釋型代碼大許多。例如,C/C++的.exe檔案要比同樣功能的Java的.class檔案大很多。

6、編譯型程式是面向特定平台的因而是平台依賴的。

7、編譯型程式不支援代碼中實作安全性——例如,一個編譯型的程式可以通路記憶體的任何區域,并且可以對你的PC做它想做的任何事情(大部分病毒是使用編譯型語言編寫的)

8、由于松散的安全性和平台依賴性,編譯型語言不太适合開發網際網路或者基于Web的應用。

解釋型語言:

1、解釋型語言提供了極佳的調試支援。一名Java程式員隻需要幾分鐘就可以定位并修複一個“空指針異常”,因為Java運作環境不僅指明了異常的性質,而且給出了異常發生位置具體的行号和函數調用順序(著名的堆棧跟蹤資訊)。這樣的便利是編譯型語言所無法提供的;

2、另一個優勢是解釋器比編譯器容易實作。;

3、解釋型語言最大的優勢之一是其平台獨立性;

4、解釋型語言也可以保證高度的安全性——這是網際網路應用迫切需要的;

5、中間語言代碼的大小比編譯型可執行代碼小很多

6、平台獨立性,以及嚴密的安全性是使解釋型語言成為适合網際網路和Web應用的理想語言的2個最重要的因素;

7、解釋型語言存在一些嚴重的缺點。解釋型應用占用更多的記憶體和CPU資源。這是由于,為了運作解釋型語言編寫的程式,相關的解釋器必須首先運作。解釋器是複雜的,智能的,大量消耗資源的程式并且它們會占用很多CPU周期和記憶體;

8、由于解釋型應用的decode-fetch-execute(解碼-抓取-執行)的周期,它們比編譯型程式慢很多;

9、解釋器也會做很多代碼優化,運作時安全性檢查;這些額外的步驟占用了更多的資源并進一步降低了應用的運作速度。

四、Java與C++、C、C#的聯系與差別

(一)JAVA和C++的差別:

1、解釋對編譯:Java是一種解釋性語言,意味着其在執行時會被“翻譯”為二進制形式,也就是java跑得時候必須有人(jvm)去解釋它(現在的Java語言,其執行方式已經不僅僅是解釋執行方式了,即時編譯器(JITC、just-in-time compiler)技術和原型編譯技術的出現大大提高了JAVA的運作效率)。而C++則是編譯語言,意味着程式隻能在特定作業系統上編譯并在特定系統上運作,也就是說C++一步到位成機器語言的。

2、記憶體安全:Java是一種記憶體安全型語言,意味着大家可以為給定數組配置設定任意參數,即使超出範圍也隻會傳回錯誤提示。C++更為靈活,但代價是一旦配置設定的參數超出資源範圍,則會引起錯誤甚至嚴重崩潰。

3、性能:Java人氣極高,但其代碼由于需要在運作前進行解釋是以性能表現更差。C++會被編譯為二進制形式,是以其能夠立即運作且速度更快。如果你寫一個c++的程式和做同樣事情的java程式,可能你感覺兩者速度差不多。但如果這兩個程式都足夠大、而且c++的代碼經過過優化,兩者的速度差就會變得很顯著甚至很驚人,C++會比java快很多。

4、指針:指針是一種C++結構,允許您直接在記憶體空間中進行值管理。Java不支援指針,是以您可能使用值引用的方式進行值傳遞。

5、重載:重載是指對某種方法或者運算符的功能進行“重新定義”。Java允許方法重載,而C++則允許進行運算符重載。

6、應用場景:Java側重于大型企業級應用開發,C++側重于底層應用開發。Java是Android開發領域的王者,是以移動開發者無疑應該選擇它作為項目基礎。另外,Java也常見于Web及桌面乃至伺服器端應用。C++更接近機器語言,是以其軟體運作速度更快且能夠直接與計算機記憶體、磁盤、CPU或者其它裝置進行協作。另外,C++也能為遊戲提供良好的運作性能。

(二)Java語言與C語言的差別:

1、Java與C記憶體配置設定不同:

(1)Java中記憶體配置設定五個區,分别為棧區(存儲的是局部變量,使用完畢,立即回收),堆區(存儲的是new出來的東西,實體,對象,每一個對象都有位址值,每個對象的資料都有預設值,使用完畢後,會在垃圾回收器空閑的時候回收)方法區,本地方法區(和系統相關),寄存區(給cpu使用)。

(2)C中記憶體配置設定四個區,分别為棧區(存儲函數參數,局部變量的值),堆區(動态記憶體申請與釋放,若程式員不釋放記憶體,則程式結束後可能由作業系統釋放),全局區(靜态區),代碼區。

2、Java數組初始化分為動态初始化和靜态初始化

(1)動态初始化隻給出長度,由系統給出初始化值。它的形式為:int[]arr=new int[3],(3表示一維數組中有三個元素,此時的[]被預定義為檢查數組邊界,沒有指針運算,即不能通過a+1得到數組的下一個元素)

(2)靜态初始化給出初始化值,由系統決定長度。它的形式為:int[]arr={1,2,3}.

而C語言中定義一個動态數組形式為:int a=(int)malloc(sizeof(int)*3),定義一個靜态數組形式為:int a[3]。

3、求數組的元素的個數的方法不同:

(1)Java中用.length可以直接求數組的元素的個數,例如:a=arr.length,則a就等于數組arr[]中元素的個數,Java中允許長度為零。

(2)C中求數組元素的個數用操作符sizeof。

(三)Java與C#對比的好處:

(1)C#中有static constructor(靜态構造函數),而java中包含靜态塊。

(2)java中的main函數時必須是public static void main(String args[]){},否則JVM拒絕運;在C#中,main函數可以是private類型,protected也可以,可以沒有參數,傳回值int類型。

(3)java在繼承、多态方面比C#強,java預設多态,而C#要求加上virtual(在父類上)和override(在子類上),而且C#要求不能改變原來的通路修飾符。

(4)C#中防止一個類被繼承,要用到關鍵字sealed,而定義一個變量要用const;java則統一使用final。

(5)c#中要比較兩個引用變量是否指向同一個對象,不能用java中的==,而要用object裡的ReferenceEquals方法。如下:a1==a2;object.RefereceEquals(a1,a2)。

(6)C#中沒有原始類型的包裝類,但是C#提供了自動裝箱,拆箱需要強制轉換。而java在jdk1.5以後就完全是自動拆裝箱了。

總結:

Java的特點以及與C++、C、C#的聯系與差別

繼續閱讀