一、背景
最近一年多來,在Internet上出現的特別吸引人的事件就是Java語言和用Java編寫的瀏覽器HotJava。
1991年,SUNMicroSystem公司的JameGosling、BillJoe等人,為在電視、控制烤面包箱等家用消費類電子產品上進行交互式操作而開發(fā)了一個名為Oak的軟件(即一種橡樹的名字),但當時并沒有引起人們的注意,直到1994年下半年,Internet的迅猛發(fā)展,環(huán)球信息網WWW的快速增長,促進了Java語言研制的進展,使得它逐漸成為Internet上受歡迎的開發(fā)與編程語言,一些的計算機公司紛紛購買了Java語言的使用權,
如Mi-croSoft、IBM、Netscape、Novell、Apple、DEC、SGI等,因此,Java語言被美國的雜志PCMagazine評為1995年十大優(yōu)秀科技產品,(計算機類就此一項入選),隨之大量出現了用Java編寫的軟件產品,受到工業(yè)界的重視與好評,認為"Java是八十年代以來計算機界的一件大事",
微軟總裁比爾·蓋茨在悄悄地觀察了一段時間后,不無感慨地說:"Java是長時間以來最卓越的程序設計語言",并確定微軟整個軟件開發(fā)的戰(zhàn)略從PC單機時代向著以網絡為中心的計算時代轉移,而購買Java則是他的重大戰(zhàn)略決策的實施部署。因此,Java的誕生必將對整個計算機產業(yè)發(fā)生深遠的影響,對傳統(tǒng)的計算模型提出了新的挑戰(zhàn)。
SUNMicroSystem公司的總裁ScottMcNealy認為Java為Internet和WWW開辟了一個嶄新的時代.
環(huán)球信息網WWW的創(chuàng)始人Berners-Lee說:"計算機事業(yè)發(fā)展的下一個浪潮就是Java,并且將很快會發(fā)生的"??磥?使用Java已成大勢所趨!
MicroSoft和IBM兩大公司都計劃在Internet上銷售用Java編寫的軟件。
Apple、HP、IBM、MicroSoft、Novell、SGI、SCO、Tandem等公司均計劃將Java并入各自開發(fā)的操作系統(tǒng),而負責開發(fā)并推廣Java技術的SunSoft公司(這是SUN下屬的一個子公司),將通過頒發(fā)許可證的辦法來允許各家公司把Java虛擬機和Java的Applets類庫嵌入他們開發(fā)的操作系統(tǒng),這樣各類開發(fā)人員就能更容易地選擇多種平臺來使用Java語言編程,不同的用戶也就可以脫離Web瀏覽器來運行Java應用程序,這無疑是很受廣大用戶歡迎的,也為Java語言的應用開拓了極為廣闊的前景。(當然,各類JavaOS之間的兼容性必須得到重視,好在JavaSoft已保證將監(jiān)督這種兼容性)。
另外,由JavaSoft推出的完全用Java編寫的Internet上新型瀏覽器HotJava,比去年alpha版更為實用,不僅能編制動態(tài)的應用軟件,而且能編制完整的成套桌面應用軟件,將來還會提供更多的能幫助編制動態(tài)應用軟件的模塊,顯然,這也是為Java的應用提供了有力的例證。
今年6月7日,由SUN公司和臺灣經濟事務部信息發(fā)展局,臺灣信息技術研究所等單位牽頭,成立了一個"Java聯盟",參加的有22個在臺灣相當的計算機公司,并在臺北建立一個"Java開發(fā)中心",在新竹建立一個"Java語言實驗室",以掀起臺灣開發(fā)與應用Java語言的熱潮。
香港則在今年4月就舉行了全島的Java杯比賽,在計算機界掀起了學習Java的熱潮(尤其是在大學生們中,出現了一批Java迷)。
有人預言:Java將是網絡上的"世界語",今后所有的用其他語言編寫的軟件統(tǒng)統(tǒng)都要用Java語言來改寫。
Java是一個廣泛使用的網絡編程語言,它是一種新的計算概念。
首先,作為一種程序設計語言,它簡單、面向對象、不依賴于機器的結構、具有可移植性、魯棒性、安全性、并且提供了并發(fā)的機制、具有很高的性能。
其次,它限度地利用了網絡,Java的小應用程序(applet)可在網絡上傳輸而不受CPU和環(huán)境的限制。另外,Java還提供了豐富的類庫,使程序設計者可以很方便地建立自己的系統(tǒng)。
下面我們分別從這三個方面來討論Java的特點,然后通過把Java與C,C++相比進一步指出它所具有的優(yōu)點。
一、Java語言
Java語言有下面一些特點:簡單、面向對象、分布式、解釋執(zhí)行、魯棒、安全、體系結構中立、可移植、高性能、多線程以及動態(tài)性。
1.簡單性
Java語言是一種面向對象的語言,它通過提供最基本的方法來完成指定的任務,只需理解一些基本的概念,就可以用它編寫出適合于各種情況的應用程序。Java略去了運算符重載、多重繼承等模糊的概念,并且通過實現自動垃圾收集大大簡化了程序設計者的內存管理工作。另外,Java也適合于在小型機上運行,它的基本解釋器及類的支持只有40KB左右,加上標準類庫和線程的支持也只有215KB左右。庫和線程的支持也只有215KB左右。
2.面向對象
Java語言的設計集中于對象及其接口,它提供了簡單的類機制以及動態(tài)的接口模型。對象中封裝了它的狀態(tài)變量以及相應的方法,實現了模塊化和信息隱藏;而類則提供了一類對象的原型,并且通過繼承機制,子類可以使用父類所提供的方法,實現了代碼的復用。
3.分布性
Java是面向網絡的語言。通過它提供的類庫可以處理TCP/IP協議,用戶可以通過URL地址在網絡上很方便地訪問其它對象。
4.魯棒性
Java在編譯和運行程序時,都要對可能出現的問題進行檢查,以消除錯誤的產生。它提供自動垃圾收集來進行內存管理,防止程序員在管理內存時容易產生的錯誤。通過集成的面向對象的例外處理機制,在編譯時,Java提示出可能出現但未被處理的例外,幫助程序員正確地進行選擇以防止系統(tǒng)的崩潰。另外,Java在編譯時還可捕獲類型聲明中的許多常見錯誤,防止動態(tài)運行時不匹配問題的出現。
5.安全性
用于網絡、分布環(huán)境下的Java必須要防止病毒的入侵。Java不支持指針,一切對內存的訪問都必須通過對象的實例變量來實現,這樣就防止程序員使用"特洛伊"木馬等欺騙手段訪問對象的私有成員,同時也避免了指針操作中容易產生的錯誤。
6.體系結構中立
Java解釋器生成與體系結構無關的字節(jié)碼指令,只要安裝了Java運行時系統(tǒng),Java程序就可在任意的處理器上運行。這些字節(jié)碼指令對應于Java虛擬機中的表示,Java解釋器得到字節(jié)碼后,對它進行轉換,使之能夠在不同的平臺運行。
7.可移植性
與平臺無關的特性使Java程序可以方便地被移植到網絡上的不同機器。同時,Java的類庫中也實現了與不同平臺的接口,使這些類庫可以移植。另外,Java編譯器是由Java語言實現的,Java運行時系統(tǒng)由標準C實現,這使得Java系統(tǒng)本身也具有可移植性。
8.解釋執(zhí)行
Java解釋器直接對Java字節(jié)碼進行解釋執(zhí)行。字節(jié)碼本身攜帶了許多編譯時信息,使得連接過程更加簡單。
9.高性能
和其它解釋執(zhí)行的語言如BASIC、TCL不同,Java字節(jié)碼的設計使之能很容易地直接轉換成對應于特定CPU的機器碼,從而得到較高的性能。
10.多線程
多線程機制使應用程序能夠并行執(zhí)行,而且同步機制保證了對共享數據的正確操作。通過使用多線程,程序設計者可以分別用不同的線程完成特定的行為,而不需要采用全局的事件循環(huán)機制,這樣就很容易地實現網絡上的實時交互行為。
11.動態(tài)性
Java的設計使它適合于一個不斷發(fā)展的環(huán)境。在類庫中可以自由地加入新的方法和實例變量而不會影響用戶程序的執(zhí)行。并且Java通過接口來支持多重繼承,使之比嚴格的類繼承具有更靈活的方式和擴展性。
二、JavaApplet
Java語言的特性使它可以限度地利用網絡。Applet是Java的小應用程序,它是動態(tài)、安全、跨平臺的網絡應用程序。JavaApplet嵌入HTML語言,通過主頁發(fā)布到Internet。網絡用戶訪問服務器的Applet時,這些Applet從網絡上進行傳輸,然后在支持Java的瀏覽器中運行。由于Java語言的安全機制,用戶一旦載入Applet,就可以放心地來生成多媒體的用戶界面或完成復雜的計算而不必擔心病毒的入侵。雖然Applet可以和圖像、聲音、動畫等一樣從網絡上下載,但它并不同于這些多媒體的文件格式,它可以接收用戶的輸入,動態(tài)地進行改變,而不僅僅是動畫的顯示和聲音的播放。
三、豐富的類庫
Java提供了大量的類以滿足網絡化、多線程、面向對象系統(tǒng)的需要。
1.語言包提供的支持包括字符串處理、多線程處理、例外處理、數學函數處理等,可以用它簡單地實現Java程序的運行平臺。
2.實用程序包提供的支持包括哈希表、堆棧、可變數組、時間和日期等。
3.輸入輸出包用統(tǒng)一的"流"模型來實現所有格式的I/O,包括文件系統(tǒng)、網絡、輸入/出設備等。
4.低級網絡包用于實現Socket編程。
5.抽象圖形用戶接口包實現了不同平臺的計算機的圖形用戶接口部件,包括窗口、菜單、滾動條、對話框等,使得Java可以移植到不同平臺的機器。
6.網絡包支持Internet的TCP/IP協議,提供了與Internet的接口。它支持URL連接,WWW的即時訪問,并且簡化了用戶/服務器模型的程序設計。
四、Java和C、C++
對于變量聲明、參數傳遞、操作符、流控制等,Java使用了和C、C++相同的傳統(tǒng),使得熟悉C、C++的程序員能很方便地進行編程。同時,Java為了實現其簡單、魯棒、安全等特性,也摒棄了C和C++中許多不合理的內容。
1.全局變量
Java程序中,不能在所有類之外定義全局變量,只能通過在一個類中定義公用、靜態(tài)的變量來實現一個全局變量。例如:
ClassGlobalVar{
publicstaticglobal_var;
}
在類GlobalVar中定義變量global_var為publicstat-ic,使得其它類可以訪問和修改該變量。
Java對全局變量進行了更好的封裝。而在C和C++中,依賴于不加封裝的全局變量常常造成系統(tǒng)的崩潰。
2.Goto
Java不支持C、C++中的goto語句,而是通過例外處理語句try,Catch,final等來代替C、C++中用goto來處理遇到錯誤時跳轉的情況,使程序更可讀且更結構化。
3.指針
指針是C、C++中最靈活,也是最容易產生錯誤的數據類型。由指針所進行的內存地址操作常會造成不可預知的錯誤,同時通過指針對某個內存地址進行顯式類型轉換后,可以訪問一個C++中的私有成員,從而破壞安全性,造成系統(tǒng)的崩潰。而Java對指針進行完全的控制,程序員不能直接進行任何指針操作,例如把整數轉化為指針,或者通過指針釋放某一內存地址等。同時,數組作為類在Java中實現,良好地解決了數組訪問越界這一C、C++中不作檢查的錯誤。
4.內存管理
在C中,程序員通過庫函數malloc()和free()來分配和釋放內存,C++中則通過運算符new和delete來分配和釋放內存。再次釋放已釋放的內存塊或未被分配的內存塊,會造成系統(tǒng)的崩潰;同樣,忘記釋放不再使用的內存塊也會逐漸耗盡系統(tǒng)資源。而在Java中,所有的數據結構都是對象,通過運算符new為它們分配內存堆。通過new得到對象的處理權,而實際分配給對象的內存可能隨程序運行而改變,Java對此自動地進行管理并且進行垃圾收集,有效防止了由于程序員的誤操作而導致的錯誤,并且更好地利用了系統(tǒng)資源。
5.數據類型的支持
在C、C++中,對于不同的平臺,編譯器對于簡單數據類型如int,float等分別分配不同長度的字節(jié)數,例如:int在IBMPC中為16位,在VAX-11中為32位,這導致了代碼的不可移植性,但在Java中,對于這些數據類型總是分配固定長度的位數,如對int型,它總占32位,這就保證了Java的平臺無關性。
6.類型轉換
在C、C++中,可以通過指針進行任意的類型轉換,常常帶來不安全性,而Java中,運行時系統(tǒng)對對象的處理要進行類型相容性檢查,以防止不安全的轉換。
7.頭文件
C、C++中用頭文件來聲明類的原型以及全局變量、庫函數等,在大的系統(tǒng)中,維護這些頭文件是很困難的。而Java不支持頭文件,類成員的類型和訪問權限都封裝在一個類中,運行時系統(tǒng)對訪問進行控制,防止對私有成員的操作。同時,Java中用import語句來與其它類進行通訊,以便使用它們的方法。
8.結構和聯合
C、C++中的結構和聯合中所有成員均為公有,這就帶來了安全性問題。Java中不包含結構和聯合,所有的內容都封裝在類中。
9.預處理
C、C++中用宏定義來實現的代碼給程序的可讀性帶來了困難。在Java中,不支持宏,它通過關鍵字final來聲明一個常量,以實現宏定義中廣泛使用的常量定義。
§1.3簡單的Java程序
下面我們先介紹兩個簡單的Java程序,并對其進行分析。
例1.1.
publicclassHelloWorldApp{//anapplication
publicstaticvoidmain(Stringargs[]){
System.out.println("HelloWorld!");
}
}
本程序的作用是輸出下面一行信息:
HelloWorld!
程序中,首先用保留字class來聲明一個新的類,其類名為HelloWorldApp,它是一個公共類(public)。整個類定義由大括號{}括起來。在該類中定義了一個main()方法,其中public表示訪問權限,指明所有的類都可以使用這一方法;static指明該方法是一個類方法,它可以通過類名直接調用;void則指明main()方法不返回任何值。對于一個應用程序來說,main()方法是必需的,而且必須按照如上的格式來定義。Jave解釋器在沒有生成任何實例的情況下,以main()作為入口來執(zhí)行程序。Jave程序中可以定義多個類,每個類中可以定義多個方法,但是最多只能有一個公共類,main()方法也只能有一個,作為程序的入口。main()方法定義中,括號()中的Stringargs[]是傳遞給main()方法的參數,參數名為args,它是類String的一個實例,參數可以為0個或多個,每個參數用"類名參數名"來指定,多個參數間用逗號分隔。在main()方法的實現(大括號中),只有一條語句:
System.out.println("HelloWorld!");它用來實現字符串的輸出,這條語句實現與C語言中的printf語句和C++中cout<<語句相同的功能。另外,//后的內容為注釋。
現在我們可以運行該程序。首先把它放到一個名為HelloWorldApp.java的文件中,這里,文件名應和類名相同,因為Java解釋器要求公共類必須放在與其同名的文件中。然后對它進行編譯:
C:\>javacHelloWorldApp.java
編譯的結果是生成字節(jié)碼文件HelloWorldApp.class。最后用java解釋器來運行該字節(jié)碼文件:
C:\>javaHelloWorldApp
結果在屏幕上顯示HelloWorld!
我們再來看下面的一個例子:例1.2
importjava.awr.*;
importjava.applet.*;
publicclassHelloWorldAppletextendsApplet{//anapplet
publicvoidpaint(Graphicsg){
g.drawString("HelloWorld!",20,20);
}
}
這是一個簡單的Applet(小應用程序)。程序中,首先用import語句輸入java.awr和java.applet下所有的包,使得該程序可能使用這些包中所定義的類,它類似于C中的#include語句。然后聲明一個公共類HelloWorldApplet,用extends指明它是Applet的子類。在類中,我們重寫父類Ap-plet的paint()方法,其中參數g為Graphics類,它表明當前作畫的上下文。在paint()方法中,調用g的方法drawString(),在坐標(20,20)處輸出字符串""HelloWorld!",其中坐標是用象素點來表示的。
這個程序中沒有實現main()方法,這是Applet與應用程序Application(如例1)的區(qū)別之一。為了運行該程序,首先我們也要把它放在文件HelloWorldApplet.java中,然后對它進行編譯:
C:\>javacHelloWorldApplet.java
得到字節(jié)碼文件HelloWorldApplet.class。由于Applet中沒有main()方法作為Java解釋器的入口,我們必須編寫HTML文件,把該Applet嵌入其中,然后用appletviewer來運行,或在支持Java的瀏覽器上運行。它的<HTML>文件如下:
<HTML>
<HEAD>
<TITLE>AnApplet</TITLE>
</HEAD>
<BODY>
<appletcode="HelloWorldApplet.class"width=200height=40>
</applet>
</BODY>
</HTML>
其中用<applet>標記來啟動HelloWorldApplet,code指明字節(jié)碼所在的文件,width和height指明applet所占的大小,我們把這個HTML文件存入Example.html,然后運行:
C:\>appleviewerExample.html
這時屏幕上彈出一個窗口,其中顯示HelloWorld!,顯示結果如圖:
從上述例子中可以看出,Java程序是由類構成的,對于一個應用程序來說,必須有一個類中定義main()方法,而對applet來說,它必須作為Applet的一個子類。在類的定義中,應包含類變量的聲明和類中方法的實現。Java在基本數據類型、運算符、表達式、控制語句等方面與C、C++基本上是相同的,但它同時也增加了一些新的內容,在以后的各章中,我們會詳細介紹。本節(jié)中,只是使大家對Java程序有一個初步的了解。

