國立屏東大學 資訊工程學系 Java物件導向程式設計
Java是Sun公司在1995年所推出的物件導向程式語言。由於切合網際網路的需要,以及具有跨平台等優越性,Java在短短的幾年間,就躍升為主流的程式語言。本章將為您說明Java語言發展的緣由、相關的技術與應用等主題。以便在您開始學習之前,能夠Java能有多一點認識。
本節將就Java語言的發展背景與延革做一介紹。主要內容參考自Java Technology An Early History一文。
Sun於1991年4月8日,由Patrick Naughton、Mike Sheridan與James Gosling組成了名為『Green Team』的工作團隊。Green Team主要的工作是,發展能在不同的作業平台上執行的分散式技術。其重點在於將發展出的技術,應用在消費性電子產品上。簡單來說,其目的是要發展出一種小型的裝置,該裝置上能以無線方式進行資料的傳輸,並且具有多媒體的處理能力。其實,他們的目標就是要開發類似今日平板電腦的裝置,不過在20多年前,那是非常先進的想法。
開發這樣一個裝置,牽涉到了硬體的設計、作業系統的配合以及系統開發工具等複雜的環節。Green Team並不是要自行開發所有的技術或工具,採用了『Hammer Technology』做為研發的策略,所以在很短的時間內就獲得了成果。
何謂Hammer Technology? 所謂的『Hammer Technology』指得是﹕將現有的各項技術組合起來,成為新的產品的方式。 採用此種專案開發時,不需要自行開發所需的技術或工具,而是在現有的技術或工具中,找尋適合者加以應用。 此種技術,強調的是系統整合的能力。
首先在硬體方面,他們直接採用了Sun當時已相當成熟的SPARC為基礎,稍加修改後,便有了一個相當穩固的硬體平台。而在作業系統方面,則是以UNIX為基礎,設計出符合該特定硬體的作業系統。至於系統開發工具方面,則是以C/C++語言為基礎。這樣一來,所有關鍵的技術都已齊備,新產品就很順利地誕生了。
在1992年9月3日,Green Team正式發表了其研發的成果,一台名為『Star Seven』的手持式產品。『Star Seven』,也就是一個星號再加上一個數字7,可寫做『*7』。*7的發表,並不僅是硬體的部份,還包括了以UNIX相關技術為基礎所設計而成,名為『Green OS』的作業系統。此外,Green Team也設計了名為『Oak』的程式語言,以及Green OS的SDK(系統開發工具)。
為何叫做*7? *7這個名稱的由來,相當的有趣。因為當時在研發期間,Green Team是被隔絕於公司之外,一處安靜的場所中進行研發。同時,為了讓研發人員能專心,他們對外的聯繫唯一管道,就只有一個可撥回公司的電話而已。而該支電話,必須先按『*』號,再按數字『7』,才能撥回公司。所以Green Team最後就以『*7』做為新產品的名稱。
*7在外觀上就如同今日我們所熟悉的PDA(個人數位助理)一樣,只不過還稍微地大了一點。它配備有一個5吋大小的彩色觸控螢幕,可顯示16位元的顏色。配合了友善的人機介面,相當易於操作。它採用PCMCIA的介面,並支援Flash Ram的檔案系統。更讓您激賞的是,它還支援無線的網路傳輸。從許多角度來看,*7甚至在今日都還可算是相當成熟的產品。
Duke的誕生 在*7的人機介面設計上,有一個虛擬的人物做為使用者與系統間的介面。您可以透過該個虛擬人物,來下達工作指令,或是查詢資訊。當時的這個虛擬人物,後來也成為了Java的識別圖示之一。這個虛擬的人物就是『Duke』圖1-1: 虛擬人物—Duke
由於Green Team成員中的James Gosling,開發了一個新的程式語言—『Oak』,而Oak就是後來Java語言的前身。所以有不少人將Oak視為Java語言之父。事實上,James Gosling是一位相當活耀的資訊界前輩,在網路上也流傳了許多關於他的軼事,有興趣的讀者可以參考James Gosling。
前面我們提到了*7的發展過程,其中使用了以整合為基礎的『Hammer Technology』;Green Team以SPARC的硬體架構為基礎,以UNIX為藍圖設計出『Green OS』,再搭配上以C/C++為參考,所設計出的全新程式語言—Oak,使得*7成為一項可算是相當成功的產品。本節將為您簡介這個後來成為Java語言的Oak語言,其設計的考量與特色。
為何叫做Oak? Oak就是『橡樹』。之所以將這個程式語言命名為Oak,其原因也是相當的有趣。前面已經提過,在*7的研發期間,Green Team是被隔絕於公司之外,一處安靜的場所中進行研發。在這段形同閉關的日子中,研發人員稍微得以放鬆的就只有窗外的風景而已。而在他們的窗外看出去,就是一棵高聳的橡樹,所以這就是這個程式語言命名的由來了。
Oak的設計被要求要能滿足以下幾點﹕
成功研發了『*7』後,Green Team於1992年10月1日,改制為獨立的FirstPerson公司。其主要目標是與有線電視的結合,曾經與時代華納公司洽談共同開發互動有線電視,可惜最後並未有具體的結果。
在開發有線電視市場失利後,FirstPerson公司便積極尋找可能的市場契機。在1993年時,隨著Mosaic的發表,全新的World Wide Web時代已揭開序幕。一時之間結合文字、影像等全新的網路資源存取,立刻吸引了無數人們的眼光。許多人,爭先恐後地投入WWW的懷抱。FirstPerson公司也相當看好這個市場,並且他們認為當時純粹以HTML來製作的網頁,還有很大的改善空間,例如即時性的互動多媒體內容還無法在網路上傳送、應用程式也不能在網路上傳送與執行。所以FirstPerson決定以推出一個更好的『WWW Browser』(Browser,瀏覽器),來解決上述的問題。
FirstPerson公司的成果就是一個全新的瀏覽器,名為『WebRunner』。在當時(1995年)市場上已有了Mosaic與著名的Netscape這兩套瀏覽器。它們將『WebRunner』視為一個更好的瀏覽器,因為它能與Mosaic、Netscape相容,並且還提供了互動式的全新操作模式。這一切都是因為他們引入了一個新的元素—『可在網路上透過HTTP傳輸,將應用程式下載到瀏覽器上加以執行』。此一技術的背後,就是以Oak為基礎所設計的Java技術。
為何叫做Java? 以Oak語言為前身的Java語言,為何要命名為Java? 其實當初最優先的名稱就是維持Oak的名稱,無奈該名稱已被註冊。其後選用的一些名字,如Café、Coffee等,也都遇到同樣的問題。最後只好在許多備用的名字當中,選擇了當時尚未被註冊的『Java』,做為新的名稱。
當初推出WebRunner時,所內建的Java是1.0a版。隨後,WebRunner被更名為『HotJava』,並且Sun公司推出了http://java.sun.com網站,成為Java技術的官方入口網站。在1995年5月23日,Java的JDK(開發工具套件) 1.0a2開始在java.sun.com上免費供人下載,在短時間內就獲得許多領導廠商的承諾,願意共同推動Java成為開放式的標準。
2009年4月,Oracle公司併購了Sun,所以Java相關技術也就併入了Oracle公司旗下。Java官方網站(圖1-2)已經成為所有Java開發人員,最常拜訪的網站之一了。不論您需要的是什麼(下載開發工具、疑難排除、瞭解最新的資訊、甚至是想找份與Java有關的工作),都可以在此找到答案!
本節將為您簡單介紹Java語言的特性。其中有一些好的特性是承襲自結構化語言,有的則是源自於物件導向語言。當然,Java語言也有其獨創的功能,使它能成為廣受歡迎的語言。以下是其特性的介紹:
您應該已經知道Java是一種物件導向的程式語言。物件導向有許多優於結構化程式語言之處,例如資料的抽象與封裝性、物件的繼承性等。
早期結構化語言的代表,如Pascal與C語言,隨著物件導向的風潮,也都陸續被Object Pascal與C++等語言所取代。Java語言做為一個新的語言,當然也不能例外地是物件導向的程式語言;同時以筆者個人的觀點來看,Java的設計上可說是十分吻合物件導向的精神(至少比那些宣稱符合物件導向精神的程式語言好的太多了)。關於物件導向,本書第<???????>章,會有深入的說明。
一個程式從開始撰寫到可以執行,中間會經過許多的步驟。通常的情況是,先使用文書編輯軟體或開發工具,進行原始程式的編寫;然後透過編譯器(Compiler)將原始程式進行編譯(也就是將原始程式轉換成機器語言)。經過上述過程,就產生了可在電腦上執行的程式。請參考圖1-3。
圖1-3:傳統程式開發流程圖。
上述的開發流程,對於一些可能會在不同平台(通常指的是不同的硬體或作業系統)上執行的程式來說,這就會比較另人討厭了。如果一個程式,必須要在一個以上的平台上面執行的話,這種程式就稱為跨平台(Cross Platform)程式。因為在不同平台上的原始程式都需要經過修改,並且在不同平台上重新編譯後才能執行。如果原本所採用的開發工具、程式語言,在新的平台上並沒有對應的工具或語言,那麼就可能需要重新加以撰寫了。圖1-4就是這種情況的一個典型的例子。
圖1-4:傳統跨平台程式開發流程圖。
在圖1-4中,原本寫好的程式要拿到不同的平台上執行時,必須先各別在不同的平台上進行修改與編譯的動作,然後才能得到在該平台上的可執行檔。這樣的過程不但麻煩,同時也有肇因於不同平台的不同功能,使得同一個程式在不同平台上的功能有不竟相同的現象。關於此問題,由於Java在實作上採用了新的設計,因此順利地解決了跨平台的問題。以下我們將為您說明相關的細節。
使用Java所設計的程式,並不能直接在作業平台上執行;而是要透過一個建立在各個平台之上的軟體來加以執行。圖1-5簡單地為您說明了這個概念。
圖1-5:虛擬機器示意圖。
在圖1-5中,一個以Java所撰寫的程式,會先透過編譯器(Compiler)轉譯成Byte-Code。所謂的Byte-Code並不能直接執行,而是要透過一個名為Java Virtual Machine(Java虛擬機器,簡稱JVM)的軟體才能加以執行。
您可以將JVM視為一個軟體,它接受Byte Code的格式(也就是以Java所撰寫的程式,並經由編譯器編譯過所產生的格式),然後將Byte Code中所要執行的操作加以執行。所謂的Byte-Code與機器語言十分類似,唯一的差別是它只能在虛擬的JVM上執行而已。
假設原本的程式中有一行print的指令,用來將『Hello!』印在螢幕上。編譯器就會將這行程式碼,轉變成JVM可以閱讀的格式。然後在執行時,是先啟動JVM,再由JVM來完成這個印出字串的動作。
JVM內部包含了以下四個部份:
圖1-6:Java虛擬機器內部機制。
目前幾乎所有的平台上,都有專屬的Java虛擬機器。凡是使用Java所撰寫的程式,不論在那一個平台上的虛擬機器,都可以得到一樣地執行效果。換句話說,所有使用Java開發的程式,都可以享有『Write Once,Run Anywhere!(寫一次,到處都可以執行)』的好處。
由於不同平台間的差異頗大,所以事先針對不同的平台所撰寫的虛擬機器,其目的並不是在於要讓特定平台上的JVM能發揮最大的功效;相反地,JVM可能僅能使用到原本作業平台的部份功能。因為不論作業平台有多少功能,JVM的目的是要在不同平台間,建立一個獨立的虛擬平台。對所有的Java程式來說,不論在哪一個平台上的JVM執行,其結果都是一樣的。所以JVM的設計參考了大多數平台所共同擁有的功能、架構,所設計出的結果就有可能使得JVM僅具有原本平台上的部份功能。但為了確保不同平台上的JVM能提供一樣的功能,這點是不得不為的措施。此外,JVM在設計上,也採用了許多技巧,使得不同平台上的JVM都能有一樣的功能。舉例來說,Java語言提供32位元的整數,在那些無法提供32位元整數運算的平台上,JVM就可能以兩個16位元的整數來模擬一個32位元的整數。
JVM除了出現在不同的平台外,在網際網路的瀏覽器上也嵌有JVM。我們可以透過網際網路,在瀏覽器上來執行Java的程式。這點也是讓Java廣受歡迎的原因之一。
Java的設計有兩項很重要的考量因素:簡單學習、簡單使用。所以,Java被設計成與C/C++類似,但卻沒有刪除了一些C/C++中,容易讓人困惑或是難以理解的部份。例如Java並沒有和C/C++相同的struct、union,同時Java也沒有goto等敘述。除了上述幾點外,以下兩點是Java語言之所以簡單的主要理由。
本節將以最簡單的方式,為您說明什麼是Java語言的動態與分散特性。
當然,一些常用的類別,就可以事先寫好一份放在網路上,供多個程式使用。
Java語言最吸引人注意的就是其網際網路的運作能力。這方面除了有完整的Socket API外,不論在Web的Client端或Server端,Java都有適當的技術可供運作(例如Cleint端的Applet、Server端的Servlet等)。詳細的內容請參考後續的說明。
以下將為您簡單介紹不同的Java技術及其應用:
Applet是『小型應用程式』的意思。以Java語言所撰寫的Applet,是放置於Web Server上,當使用者要執行時,先透過瀏覽器連接上Server端,並且下載Applet的類別檔案(這些動作是自動完成的)到使用者的電腦上,最後再由瀏覽器上內嵌的JVM加以執行。
因為Applet是在Web架構下,讓Client端的瀏覽器能擁有多媒體、即時、互動等特性的技術,所以被廣泛地使用在許許多多的網站上。
但也由於Applet是在網路上傳送、執行,所以在檔案大小與安全性等方面要求格外嚴格。在Java的開發工具中,已包含Applet類別,我們只要繼承該類別加以設計新的功能,便能很快地完成小而美的Applet。至於安全性方面,Java也限制了一些操作是不能在Applet中進行的(例如,I/O的存取),以避免執行了來自網路上,具危害性的Applet。
Application就是指一般的應用程式。您當然可以像使用C/C++等語言一樣,以Java來設計一般的應用程式。目前已有許多廠商看好Java的跨平台等特性,積極投入開發Java的應用程式。舉凡商務應用、教育研究甚至是電玩遊戲等領域,都已經有了Java的產品。
JavaScript是另一種可應用在網頁設計的程式語言。許多人都以為它是Java技術的分支之一,但它並不是!它與Java語言並沒有什麼太大的關係!只是名稱上有些類似而已。
它是由Netscape公司所開發的LiveScript所衍生而來的,是寫在網頁上並可在瀏覽器上執行的Scripting語言。目前在主要的瀏覽器(Netscape與Microsoft的IE)中,分別支援了JavaScript與相容的Jscript。
基本上JavaScript的程式碼是內嵌於HTML的檔案中的,當瀏覽器將Server上的HTML檔案載入後,再由內建於瀏覽器的JavaScript(或JScript)的解譯器,來將程式碼加以執行。類似的技術還有VBScript、PerlScript等。
Servlet是Java與Web架構結合的好例子。所謂的Servlet是由Java所撰寫的程式,經編譯成Byte-Code後,放置於Web Server上。當有使用者從網路連結到此Servlet時,支援Servlet的Web Server就會將類別檔案載入,並且加以執行,最後將結果傳回給使用者的瀏覽器。其後,如果有其他的使用者再次連結此一Servlet時,就不需要再次載入,可以直接執行。
這種方式的執行效率或安全性等,都比其它相關的Web技術好上許多,也是目前重要的網站相關技術之一。
Java Server Page又可簡稱為JSP。同樣是內嵌在網頁中的程式語言,不過它是在Server端執行的。避免了JavaScript等程式,因為要在瀏覽器上執行,所以自然可以在瀏覽器上看到原始程式的缺點。
此外,JSP的執行會將程式碼,轉成Servlet形式的Byte-Code,然後再以Servlet的方式來運作。因此,除了初次啟動時須等待一段時間外,其執行效率也相當地好。
事實上,與Java相關的技術絕不只本章所介紹的幾項而已。包含EJB(Enterprise Java Beans)、JINI、JMS(Java Message Service)、JTA(Java Transaction)、JTS(Java Transaction Service)等,現在有太多、難以計數的Java相關技術存在。本書也不可能將所有的技術都加以介紹,不過希望本書能做為初學Java的一個好的指引。
在Java的開發與執行上,JDK與JRE無疑扮演了重要的角色。JDK是Java Development Kit的縮寫,JRE則是Java Runtime Environment的縮寫。以下我們將為您簡單地介紹它們的用途。
不論是JDK或是JRE,您都可以在http://www.oracle.com/technetwork/java上取得最新的版本。在過去尚未有足夠好的開發工具時(筆者指的是像Netbeans這種絕佳的開發工具),我們都是直接使用JDK來進行開發的工作,雖然有時比較麻煩,但卻是近距離觀察Java的好方法。如果有興趣的話,建議您也可以說一點時間去瞭解更多關於JDK的細節。