王克宏 郁欣 孫元 王曦東
§ 1.1 Java語言出現的背景、影響及應用前景
一、背景
最近一年多來 ,在 Internet上出現的非凡吸引人的事件就是Java語言和用 Java編寫的浏覽器 HotJava。
1991年 ,SUN MicroSystem公司的 Jame Gosling、 Bill Joe等人 ,為在電 視、控制烤面包箱等家用消費類電子產品上進行交互式操作而開發了一個名為Oak 的軟件 (即一種橡樹的名字 ),但當時並沒有引起人們的注重 ,直到 1994年下半 年 ,Internet的迅猛發展 ,環球信息網 WWW的快速增長 ,促進了 Java語言研制的 進展 ,使得它逐漸成為 Int ernet上受歡迎的開發與編程語言 ,一些聞名的計算機 公司紛紛購買了 Java語言的使用權 ,如 Mi-croSoft、 IBM、 Netscape、 Novell、 Apple、 DEC、 SGI等 ,因此 ,Java語言被美國的聞名雜志 PC Magazine評為 1995 年十大優秀科技產品 ,(計算機類就此一項入選 ),隨之大量出現了用 Java編寫的 軟件產品 ,受到工業界的重視與好評 ,認為 "Java是八十年代以來計算機界的一件 大事 ",微軟總裁比爾?蓋茨在靜靜地觀察了一段時間後 ,不無感慨地說 :"Java是 長時間以來最卓越的程序設計語言 ",並確定微軟整個軟件開發的戰略從 PC單機時 代向著以網絡為中心的計算時代轉移 ,而購買 Java則是他的重大戰略決策的實施部 署。
因此 ,Java的誕生必將對整個計算機產業發生深遠的影響 ,對傳統的計算模型 提出了新的挑戰。
SUN MicroSystem公司的總裁 Scott McNealy認為 Java為 Internet和 WWW開 辟了一個嶄新的時代。
環球信息網 WWW的創始人 Berners-Lee說 :"計算機事業發展的下一個浪潮就 是 Java,並且將很快會發生的"。
看來 ,使用 Java已成大勢所趨 !
MicroSoft和 IBM兩大公司都計劃在 Internet上銷售用 Java編寫的軟件。
Apple、 HP、 IBM、 MicroSoft、 Novell、 SGI、 SCO、 Tandem等公司均 計劃將 Java並入各自開發的操作系統 ,而負責開發並推廣 Java技術的 SunSoft公 司 (這是 SUN下屬的一個子公司 ),將通過頒發許可證的辦法來答應各家公司把 Java虛擬機和 Jav a的 Applets類庫嵌入他們開發的操作系統 ,這樣各類開發人員 就能更輕易地選擇多種平台來使用 Java語言編程 ,不同的用戶也就可以脫離 Web 浏覽器來運行 Java應用程序 ,這無疑是很受廣大用戶歡迎的 ,也為 Java語言的應 用開拓了極為廣闊的前景。 (當然 ,各類 JavaOS之間的兼容性必須得到重視 ,好在 JavaSoft已保證將監督這種兼容性 )。
另外 ,由 JavaSoft推出的完全用 Java編寫的 Internet上新型浏覽器HotJava, 比去年 alpha版更為實用 ,不僅能編制動態的應用軟件 ,而且能編制完整的成套桌 面應用軟件 ,將來還會提供更多的能幫助編制動態應用軟件的模塊 ,顯然 ,這也是 為 Java的應用提供了有力的例證。
今年 6月 7日 ,由 SUN公司和台灣經濟事務部信息發展局、台灣信息技術研 究所等單位牽頭 ,成立了一個"Java聯盟 ",參加的有 22個在台灣相當聞名的計算 機公司 ,並在台北建立一個 "Java開發中心 ",在新竹建立一個"Java語言實驗室", 以掀起台灣開發與應用 Java語言的熱潮。
香港則在今年 4月就舉行了全島的 Java杯比賽 ,在計算機界掀起了學習 Java的熱潮 (尤其是在大學生們中 ,出現了一批 Java迷 )。
有人預言 :Java將是網絡上的 "世界語 ",今後所有的用其他語言編寫的軟 件統統都要用 Java語言來改寫。
二、 Java語言對軟件開發技術的影響
工業界不少人預言 :"Java語言的出現 ,將會引起一場軟件革命 ",這是因為 傳統的軟件往往都是與具體的實現環境有關 ,換了一個環境就需要作一番改動 ,耗 時費力 ,而 Java語言能在執行碼 (二進制碼 )上兼容 ,這樣以前所開發的軟件就 能運行在不同的機器上 ,只要所用的機器能提供 Java語言解釋器即可。
Java語言將對未來軟件的開發產生影響 ,可從如下幾個方面考慮 :
1軟件的需求分析 :可將用戶的需求進行動態的、可視化描述 ,以提供設計 者更加直觀的要求。而用戶的需求是各色各樣的 ,不受地區、行業、部門、愛好的 影響 ,都可以用 Java語言描述清楚。
2軟件的開發方法 :由於 Java語言的面向目標的特性 ,所以完全可以用 O-O 的技術與方法來開發 ,這是符合最新的軟件開發規范要求的。
3 Java語言的動畫效果遠比 GUI技術更加逼真 ,尤其是利用 WW W提供的巨大 動畫資源空間 ,可以共享全世界的動態畫面的資源。
4軟件最終產品 :用 Java語言 開發的軟件可以具有可視化、可聽化、可操 作化的效交互、動畫與動作 ",要它停就停 ,要它繼續就繼續 ,而這是在電影與電 視播放過程中難以做到的。
5其它 :使用 Java語言對開發效益、開發價值都有比較明顯的影響。
三、工業界對 Java語言的評價
1996年 5月 29~ 31日 ,在美國舊金山召開了一個全世界 Java語言開發者 大會 ,(JavaOne Developer Confer-ence),出席會議的多達 6500多人 ,來自工業 界的超過一半 ,有人評價說 :"這是近年來計算機界最 光輝的一次盛會 ",一些工 業界的老總們相當看好 Java語言 ,認為它的使用將會引起一場軟件革命。從軟件 的設計風格、設計方法、設計目標到設計過程 ,都會產生徹底的變革 ,"甚至會改 變此星球的生活方式 "。
在這次會上 ,Java的創始人之一 James Gosling說 :"Java不僅僅只是 applets,它能做任何事情 ",Dta咨詢公司的高級軟件工程師 Rich Kadel說 :"Java 不僅僅是一種程序設計語言 ,更是現代化軟件再實現的基礎 ;Java還是未來新型 OS的核心 ;將會出現 Java芯片 ;將構成各種應用軟件的開發平台與實現環境 ,是 人們必不可少的開發工具 ,…… "。
由於各界都看好它 ,因此 ,各大公司都紛紛表示支持 Java,Inte l、 Xerox 公司聲言將把 Java嵌入到他們的產品中去。就連華爾街金融界也在投入資金人力 用 Java開發電子貿易、金融軟件。
所以有人說 :"現在第三方的開發商都團結在 Java大旗四周了 !",紛紛推出 用 Java開發的各種軟件產品 ,以期盡快地占領市場。
四、 Java語言的應用前景
Java語言有著廣泛的應用前景 ,大體上可以從以下幾個方面來考慮其應用 :
1所有面向對象的應用開發 ,包括面向對象的事件描述、處理、綜合等 ;
2計算過程的可視化、可操作化的軟件的開發 ;
3動態畫面的設計 ,包括圖形圖像的調用 ;
4交互操作的設計 (選擇交互、定向交互、控制流程等 );
5 Internet的系統治理功能模塊的設計 ,包括 Web頁面的動態設計、治理 和交互操作設計等 ;
6 Intranet(企業內部網 )上的軟件開發 (直接面向企業內部用戶的軟件 );
7與各類數據庫連接查詢的 SQL語句實現 ;
8其它應用類型的程序。
§ 1.2 Java的特點
Java是一個廣泛使用的網絡編程語言 ,它是一種新的計算概念。
首先 ,作為一種程序設計語言 ,它簡單、面向對象、不依靠於機器的結構、 具有可移植性、魯棒性、安全性、並且提供了並發的機制、具有很高的性能。其 次 ,它最大限度地利用了網絡 ,Java的小應用程序 (applet)可在網絡上傳輸而 不受 CPU和環境的限制。另外 ,Java還提供了豐富的類庫 ,使程序設計者可以很 方便地建立自己的系統。
下面我們分別從這三個方面來討論 Java的特點 ,然後通過把 Java與 C, C++相比進一步指出它所具有的優點。
一、 Java語言
Java語言有下面一些特點 :簡單、面向對象、分布式、解釋執行、魯棒、 安全、體系結構中立、可移植、高性能、多線程以及動態性。
:1.簡單性
Java語言是一種面向對象的語言 ,它通過提供最基本的方法來完成指定的 任務 ,只需理解一些基本的概念 ,就可以用它編寫出適合於各種情況的應用程 序。 Java略去了運算符重載、多重繼續等模糊的概念 ,並且通過實現自動垃圾 收集大大簡化了程序設計者的內存治理工作。另外 ,Java也適合於在小型機上運 行 ,它的基本解釋器及類的支持只有 40KB左右 ,加上標准類庫和線程的支持也 只有 215KB左右。庫和線程的支持也只有 215KB左右。
2.面向對象
Java語言的設計集中於對象及其接口 ,它提供了簡單的類機制以及動態的 接口模型。對象中封裝了它的狀態變量以及相應的方法 ,實現了模塊化和信息 隱藏 ;而類則提供了一類對象的原型 ,並且通過繼續機制 ,子類可以使用父類 所提供的方法 ,實現了代碼的復用。
3.分布性
Java是面向網絡的語言。通過它提供的類庫可以處理 TCP/IP協議 ,用戶 可以通過 URL地址在網絡上很方便地訪問其它對象。
4.魯棒性
Java在編譯和運行程序時 ,都要對可能出現的問題進行檢查 ,以消除錯誤 的產生。它提供自動垃圾收集來進行內存治理 ,防止程序員在治理內存時輕易 產生的錯誤。通過集成的面向對象的例外處理機制 ,在編譯時,Java提示出可能 出現但未被處理的例外 ,幫助程序員正確地進行選擇以防止系統的崩潰。另外, Java在編譯時還可捕捉類型聲明中的許多常見錯誤 ,防止動態運行時不匹配問題 的出現。
5.安全性
用於網絡、分布環境下的 Java必須要防止病毒的入侵。 Java不支持指針, 一切對內存的訪問都必須通過對象的實例變量來實現 ,這樣就防止程序員使用 "特洛伊 "木馬等欺騙手段訪問對象的私有成員 ,同時也避免了指針操作中輕易 產生的錯誤。
6.體系結構中立
Java解釋器生成與體系結構無關的字節碼指令 ,只要安裝了 Java運行時 系統 ,Java程序就可在任意的處理器上運行。這些字節碼指令對應於 Java虛擬 機中的表示 ,Java解釋器得到字節碼後 ,對它進行轉換 ,使之能夠在不同的平 台運行。
7.可移植性
與平台無關的特性使 Java程序可以方便地被移植到網絡上的不同機器。 同時 ,Java的類庫中也實現了與不同平台的接口 ,使這些類庫可以移植。另外, Java編譯器是由 Java語言實現的 ,Java運行時系統由標准 C實現 ,這使得Java 系統本身也具有可移植性。
8.解釋執行
Java解釋器直接對 Java字節碼進行解釋執行。字節碼本身攜帶了許多 編譯時信息 ,使得連接過程更加簡單。
9.高性能
和其它解釋執行的語言如 BASIC、 TCL不同 ,Java字節碼的設計使之能 很輕易地直接轉換成對應於特定CPU的機器碼 ,從而得到較高的性能。
10.多線程
多線程機制使應用程序能夠並行執行 ,而且同步機制保證了對共享數據 的正確操作。通過使用 多線程 ,程序設計者可以分別用不同的線程完成特定 的行為 ,而不需要采用全局的事件循環機制 ,這樣就很輕易地實現網絡上的實 時交互行為。
11.動態性
Java的設計使它適合於一個不斷發展的環境。在類庫中可以自由地加入 新的方法和實例變量而不會影響用戶程序的執行。並且 Java通過接口來支持 多重繼續 ,使之比嚴格的類繼續具有更靈活的方式和擴展性。
二、 Java Applet
Java語言的特性使它可以最大限度地利用網絡。 Ap-plet是 Jav a的小應 用程序 ,它是動態、安全、跨平台的網絡應用程序。 Java Applet嵌入 Html語 言 ,通過主頁發布到 Internet。網絡用戶訪問服務器的 Applet時 ,這些Applet 從網絡上進行傳輸 ,然後在支持 Java的浏覽器中運行。由於 Java語言的安全機 制 ,用戶一旦載入 Applet,就可以放心地來生成多媒體的用戶界面或完成復雜的 計算而不必擔心病毒的入侵。雖然 Applet可以和圖像、聲音、動畫等一樣從網 絡上下載 ,但它並不同於這些多媒體的文件格式 ,它可以接收用戶的輸入 ,動態 地進行改變,而不僅僅是動畫的顯示和聲音的播放。
三、豐富的類庫
Java提供了大量的類以滿足網絡化、多線程、面向對象系統的需要。
1.語言包提供的支持包括字符串處理、多線程處理、例外處理、數學函 數處理等 ,可以用它簡單地實現Java程序的運行平台。
2.實用程序包提供的支持包括哈希表、堆棧、可變數組、時間和日期等。
3.輸入輸出包用統一的 "流 "模型來實現所有格式的 I/O,包括文件系統、 網絡、輸入
4.低級網絡包用於實現 Socket編程。
5.抽象圖形用戶接口包實現了不同平台的計算機的圖形用戶接口部件 , 包括窗口、菜單、滾動條、對話框等 ,使得 Java可以移植到不同平台的機器。
6.網絡包支持 Internet的 TCP/IP協議 ,提供了與 In-ternet的接口。 它支持 URL連接 ,WWW的即時訪問 ,並且簡化了用戶 /服務器模型的程序設計。
四、 Java和 C、 C++
對於變量聲明、參數傳遞、操作符、流控制等 ,Java使用了和 C、 C++ 相同的傳統 ,使得熟悉 C、 C++的程序員能很方便地進行編程。同時 ,Java為 了實現其簡單、魯棒、安全等特性 ,也摒棄了 C和 C++中許多不合理的內容。
1.全局變量
Java程序中 ,不能在所有類之外定義全局變量 ,只能通過在一個類中定 義公用、靜態的變量來實現一個全局變量。例如 :
Class GlobalVar{ public static global_var; }
在類 GlobalVar中定義變量 global_var為 public stat-ic,使得其它類 可以訪問和修改該變量。 Java對全局變量進行了更好的封裝。而在 C和 C++中 ,依靠於不加封裝 的全局變量經常造成系統的崩潰。
2.Goto
Java不支持 C、 C++中的 goto語句 ,而是通過例外處理語句 try, Catch, final等來代替 C、 C++中用 goto來處理碰到錯誤時跳轉的情況 ,使程序更可讀 且更結構化。
3.指針
指針是 C、 C++中最靈活 ,也是最輕易產生錯誤的數據類型。由指針所進行 的內存地址操作常會造成不可預知的錯誤 ,同時通過指針對某個內存地址進行顯 式類型轉換後 ,可以訪問一個 C++中的私有成員 ,從而破壞安全性 ,造成系統的 崩潰。而 Java對指針進行完全的控制 ,程序員不能直接進行任何指針操作 ,例如 把整數轉化為指針 ,或者通過指針釋放某一內存地址等。同時 ,數組作為類在Java 中實現 ,良好地解決了數組訪問越界這一C、 C++中不作檢查的錯誤。
4.內存治理
在 C中 ,程序員通過庫函數 malloc()和 free()來分配和釋放內存 , C++ 中則通過運算符 new和 delete來分配和釋放內存。再次釋放已釋放的內存塊或 未被分配的內存塊 ,會造成系統的崩潰 ;同樣 ,忘記釋放不再使用的內存塊也 會逐漸耗盡系統資源。而在 Java中 ,所有的數據結構都是對象 ,通過運算符new 為它們分配內存堆。通過new得到對象的處理權 ,而實際分配給對象的內存可能 隨程序運行而改變 ,Java對此自動地進行治理並且進行垃圾收集 ,有效防止了由 於程序員的誤操作而導致的錯誤 ,並且更好地利用了系統資源。
5.數據類型的支持
在 C、 C++中 ,對於不同的平台 ,編譯器對於簡單數據類型如 in t,float 等分別分配不同長度的字節數 ,例如:int在 IBM PC中為 16位 ,在 VAX-11中為 32位 ,這導致了代碼的不可移植性 ,但在 Java中 ,對於這些數據類型總是分 配固定長度的位數 ,如對 int型 ,它總占 32位 ,這就保證了 Java的平台無關性。
6.類型轉換
在 C、 C++中 ,可以通過指針進行任意的類型轉換 ,經常帶來不安全性 , 而 Java中 ,運行時系統對對象的處理要進行類型相容性檢查 ,以防止不安全的 轉換。
7.頭文件
C、 C++中用頭文件來聲明類的原型以及全局變量、庫函數等 ,在大的系 統中 ,維護這些頭文件是很困難的。而 Java不支持頭文件 ,類成員的類型和訪 問權限都封裝在一個類中 ,運行時系統對訪問進行控制 ,防止對私有成員的操 作。同時 ,Java中用 import語句來與其它類進行通訊 ,以便使用它們的方法。
8.結構和聯合
C、 C++中的結構和聯合中所有成員均為公有 ,這就帶來了安全性問題。 Java中不包含結構和聯合 ,所有的內容都封裝在類中。
9.預處理
C、 C++中用宏定義來實現的代碼給程序的可讀性帶來了困難。在 Java 中 ,不支持宏 ,它通過要害字 final來聲明一個常量 ,以實現宏定義中廣泛使 用的常量定義。
§ 1.3.簡 單 的 Java程 序
下 面 我 們 先 介 紹 兩 個 簡 單 的 Java程 序 ,並 對 其 進 行 分 析 。 例 1.1.
public class HelloWorldApp { //an application public static void main (String args[ ]){ System.out.println("Hello World!"); } }
本 程 序 的 作 用 是 輸 出 下 面 一 行 信 息 : Hello World!
程 序 中 ,首 先 用 保 留 字 class來 聲 明 一 個 新 的 類 ,其 類 名 為 Hell oWorldApp,它 是 一 個 公 共 類 (public)。 整 個 類 定 義 由 大 括 號 {} 括 起 來 。 在 該 類 中 定 義 了 一 個 main ()方 法 ,其 中 public表 示 訪 問 權 限 ,指 明 所 有 的 類 都 可 以 使 用 這 一 方 法; static指 明 該 方 法 是 一 個 類 方 法 ,它 可 以 通 過 類 名 直 接 調 用 ;void則 指 明 main()方 法 不 返 回 任 何 值 。 對 於 一 個 應 用 程 序 來 說 ,main()方 法 是 必 需 的 ,而 且 必 須 按 照 如 上 的 格 式 來 定 義 。 Jave解 釋 器 在 沒 有 生 成 任 何 實 例 的 情 況 下 ,以 main()作 為 入 口 來 執 行 程 序 。 Jave程 序 中 可 以 定 義 多 個 類 ,每 個 類 中 可 以 定 義 多 個 方 法 ,但 是 最 多 只 能 有 一 個 公 共 類, main()方 法 也 只 能 有 一 個, 作 為 程 序 的 入 口 。 main()方 法 定 義 中 ,括 號 ()中 的 String args[ ]是 傳 遞 給 main()方 法 的 參 數,參 數 名 為 args,它 是 類 String的 一 個 實 例 ,參 數 可 以 為 0個 或 多 個,每 個 參 數 用 "類 名 參 數 名 "來 指 定 , 多 個 參 數 間 用 逗 號 分 隔 。 在 main()方 法 的 實 現 (大 括 號 中 ),只 有 一 條 語 句 : System.out.println ("Hello World!");
它 用 來 實 現 字 符 串 的 輸 出 ,這 條 語 句 實 現 與 C語 言 中 的 printf 語 句 和 C++中 cout<<語 句 相 同 的 功 能 。 另 外 ,//後 的 內 容 為 注 釋 。
現 在 我 們 可 以 運 行 該 程 序 。 首 先 把 它 放 到 一 個 名 為 HelloWor ldApp.java的 文 件 中 , 這 裡 ,文 件 名 應 和 類 名 相 同 ,因 為 Java解 釋 器 要 求 公 共 類 必 須 放 在 與 其 同 名 的 文 件 中。 然 後 對 它 進 行 編 譯 : C:>javac HelloWorldApp.java
編 譯 的 結 果 是 生 成 字 節 碼 文 件 HelloWorldApp.class。 最 後 用 java 解 釋 器 來 運 行 該 字 節 碼 文 件 : C:>java HelloWorldApp
結 果 在 屏 幕 上 顯 示 Hello World!
我 們 再 來 看 下 面 的 一 個 例 子 : 例 1.2
import java.awr.*; import java.applet.*; public class HelloWorldApplet extends Applet { //an applet public void paint(Graphics g){ g.drawString ("Hello World!",20,20); } }
這 是 一 個 簡 單 的 Applet(小 應 用 程 序 )。 程 序 中 ,首 先 用 import語 句 輸 入 java.awr和java.applet下 所 有 的 包 ,使 得 該 程 序 可 能 使 用 這 些 包 中 所 定 義 的 類 , 它 類 似 於 C中 的 #include語 句 。 然 後 聲 明 一 個 公 共 類 HelloWorldApplet,用 extends指 明 它 是 Applet的 子 類 。 在 類 中 ,我 們 重 寫 父 類 Ap-plet的 paint()方 法 ,其 中 參 數 g為 Graphics 類 ,它 表 明 當 前 作 畫 的 上 下 文 。 在 paint()方 法 中 ,調 用 g的 方 法 drawString(),在 坐 標 (20,20)處 輸 出 字 符 串 ""Hello World!", 其 中 坐 標 是 用 象 素 點 來 表 示 的 。
這 個 程 序 中 沒 有 實 現 main()方 法 ,這 是 Applet與 應 用 程 序 Applica tion(如 例 1)的 區 別 之 一 。 為 了 運 行 該 程 序 ,首 先 我 們 也 要 把 它 放 在 文 件 HelloWorldAppl et.java中 ,然 後 對 它 進 行 編 譯 : C:>javac HelloWorldApplet.java
得 到 字 節 碼 文 件 HelloWorldApplet.class。 由 於 Applet中 沒 有 main()方 法 作 為 Java解 釋 器 的 入 口 ,我 們 必 須 編 寫 HTML文 件 ,把 該 Applet嵌 入 其 中 ,然 後 用 appletviewer來 運 行 ,或 在 支 持 Java的 浏 覽 器 上 運 行 。 它 的 <HTML>文 件 如 下 :
<HTML> <HEAD> <TITLE> An Applet </TITLE> </HEAD>
<BODY> <applet code="HelloWorldApplet.class" width=200 height=40> </applet> </BODY> </HTML>
其 中 用 <applet>標 記 來 啟 動 HelloWorldApplet,code指 明 字 節 碼 所 在 的 文 件 ,width和height指 明 applet所 占 的 大 小 ,我 們 把 這 個 HTML 文 件 存 入 Example.html,然 後 運 行 : C:>appleviewer Example.html
這 時 屏 幕 上 彈 出 一 個 窗 口 ,其 中 顯 示 Hello World!,顯 示 結 果 如 圖 :
從 上 述 例 子 中 可 以 看 出 ,Java程 序 是 由 類 構 成 的 ,對 於 一 個 應 用 程 序 來 說 ,必 須 有 一 個 類 中 定 義 main()方 法 ,而 對 applet來 說 , 它 必 須 作 為 Applet的 一 個 子 類 。 在 類 的 定 義 中 ,應 包 含 類 變 量 的 聲 明 和 類 中 方 法 的 實 現 。 Java在 基 本 數 據 類 型 、 運 算 符 、 表 達 式 、 控 制 語 句 等 方 面 與 C、 C++基 本 上 是 相 同 的 ,但 它 同 時 也 增 加 了 一 些 新 的 內 容 ,在 以 後 的 各 章 中 ,我 們 會 詳 細 介 紹 。 本 節 中 ,只 是 使 大 家 對 Java程 序 有 一 個 初 步 的 了 解 。 (未完待續)