Home Map Index Search News Archives Links About LF
[Top Bar]
[Bottom
Bar]
[Photo of the
Author]
Jose M. Fernández

與作者聯繫


內容目錄
簡介
起源
JAVA 之取得及安裝方法
發展環境
特徵
第一個用 JAVA 寫的程式
總結

Java. Part I

[Ilustration]

內容摘要 這是一系列有關 Java 程式設計的第一篇文章。 首先, 文中將介紹到, 以程式語言的角度來看, Java 有哪些一般性的特徵, 並提供相關資訊的出處所在。




簡介

本文是一系列文章中的第一篇, 將用來介紹 Java 程式設計語言, 與其開發環境。 首先, 我會嘗試避免討論有關此一程式語言的歷史、 微波、 或是洗衣機的相關議題 ( 如果有人真的對這些東西感興趣, 那麼可以從很多出版品中, 得到這些資訊, 甚至在典型的文學作品中, 也可以找到 )。 我也會跟 Duke 劃清界線 ( Java 的吉祥物 ), 他是一個有著巨大鼻子和三角形身體的傢伙, 它的手會隨著馬林巴琴 (marimba) 的節奏搖擺, 這讓我想起了老式的美國科幻片。

在這股 Java 狂潮中, 似乎帶動起一些流行, 市面上每一本電腦雜誌, 只要能沾上邊, 都會報導它, 也有許多軟體公司, 爭相地發表可以發展 Java applets 的產品, 甚至幾乎每個網站都會放上幾個 Java applet。

透過這一系列的文章, 我將儘可能地, 帶領大家深入研究, 並且完整學習這個程式語言。 對基本的東西來說, Java 倒是容易就做到了, 但在同時間內, 要精通它是很複雜, 而且很困難的, 因為 Java 目前還不斷在演進。

在系列文章的前幾篇裡, 我們的目標, 在於提供對程式語言的一般性介紹, 將來我們才能學習更深入的主題, 像是 applets、 與網路有關的研究、 JDBC、 Java bean 等。

我必須強調的是, Java 屬於一般性用途的程式語言, 雖然它最常被用來撰寫 applets, 但它絕不限於網頁撰寫的功能上。 我們不能將 Java 侷限於此, 因為還有許多其他用途, 可能都比撰寫 applets 來得更有趣。

在這個第一篇文章裡, 我們著重「描述性」多過於「實用性」。 在接下來的文章中, 我們將會深入探索程式語言的基本特徵, 還有程式語言的發展環境。 只有在最後的時候, 我們才會看到一個 java 程式的範例。

起源

Java 是在一九九一年時, 於 Sun 公司 (Sun Microsystem Inc.) 中, 由 James Gosling, Patrick Naughton, Chis Warth, Ed Frank 以及 Mike Sherindan 這些人所構想出來, 初期花了十八個月的時間來發展原型。 從一九九二年到一九九五年之間, Bill Joy, Arthur Van Hoff, Jonathan Payne, Frank Yellia, Tim Lindolm 加入, 合力改善這個初始原型的成熟度.

從這個時間可以清楚地看出, Java 的出現比 WWW 的出現更早, 至少可以說是同時, 因為 Tim Berners Lee 到一九九一年之前, 尚未發展出 HTML 語言。

Java 的語法上, 和 C 語言非常相似, 其物件導向的特性, 也與 C++ 相仿, 但 Java 是一個體系連貫完整, 而且邏輯性一致的程式語言。

Java 本身和 C 與 C++ 的相似程式, 讓人很容易聯想為 Internet 版的 C++ 語言, 不過, 它們在理論與實作上, 還是有許多重大的差異。 和 C ++ 相較, Java 特別改善與精簡了物件導向的基本架構。

Internet 讓 Java 聲名大噪, 使得它成為一種廣為人知的程式語言, 值此同時, Java 也對 Internet 有著極為深遠的影響, 因為它讓網路世界的物件, 能夠自由移動的空間範圍, 加大了許多 ( 指的是「能夠自我執行的動態程式」 )。

JAVA 之取得及安裝方法

有許多工具, 對 Java 程式設計來說, 都是非常重要的。 附帶地, 我所提到的狀況, 都是指在 GNU/Linux 的環境下 ( 怕有人會搞混了 ):

目前 ELF 版本的程式, 需要使用到 1.2.13 版本或之後的核心程式。

我將會使用 JDK (Java Developement Kit) 工作環境, 2.0.14 版本或之後的 Netscape, 以及一個類似 Xemacs 的文字編輯器。 我們打算在 Xwindows 環境下進行, 雖然未必一定都要如此, 但發展 Applet 與應用圖形介面的程式時, 就必須使用到它。

JDK 相關程式, 可由下列的網址下載取得:

http://www.blackdown.org/java-linux.html

從這個網址, 您可以選擇出一個較方便的映射站台, 以快速下載這些檔案。 幾個月前, 最新的版本是 JDK-1.1.3 ( 這也是本文所使用的版本 ), 不過, 我上次已在站上看到 1.19 版出來了。 值得注意的是, 假如我們下載了所有的程式, 大概會有 24 Mb! 就算是只下載最精簡的部份, 也要大概 12 Mb 的容量 ( 所以耐心點吧! )。

以 gunzip 解開壓縮檔之後, 應該不會遇到什麼障礙, 接下來就可以工作了。

通常我們會將程式都安裝在 /usr/local 目錄下, 然後建立一個 /JDK1.1.3 子目錄, 而裡面會有下列的內容:

/doc 以 HTML 格式寫成的正式文件

/demo Java 示範程式

/lib 函式庫

/bin 放的是 JDK 主要的工具程式

在 /lib 目錄裡, 我們可以找到 "classes.zip" 檔案 ( 不要把這個檔解開 ), 它包含了所有已編譯好的類別檔案, JDK 會用到它們。

在根目錄裡, 我們可以找到 "src.zip" 檔案, 當中包含了 classes.zip 裡的原始檔案, 不過它們不能被拿來編譯, 它們只做為提供程式的參考之用。

發展環境

如同前面所提到的, 發展 JAVA 程式所會用到的工具程式, 都放在 /bin 目錄之下:

javac : Java 的編譯器, 可以把 Java 語言寫的原始檔編譯成 bytecode 的形式。

Java : Java 解譯器, 可以執行 bytecode 形式的 Java 程式碼。

jre : 另一種跟 Java 相似的解譯器, 不同點在於, jre 可以跟著您寫好的程式一起散佈給每個人, 那些不需要所有功能的使用者, 就能方便地執行。

appletviewer : 用來測試與執行 applets。

jdb : 除錯器。

javap : Java 反組譯器, 可以將 Java 編譯而成的 bytecode, 還原成原來文字檔形式的程式碼。

javadoc : 文件產生器, 可以產生許多 HTML 形式的文件, 用以描述公開類別 (public classes) 或是私有類別 (protected classes)、 界面 (interfaces)、 建構子 (constructors)、 方法 (methods)、 欄位 (fields)。 這個工具也可以產生類別之間的階層架構, 以及其所有成員的索引。

javah : 可以將原生方法 ( 由 C 語言所撰寫成 ) 加入 Java 程式中的工具程式。

jar : 用來將 java 之類別與原始碼程式, 壓縮為 Jar 檔案的程式。

javakey : 用來維護數位簽章的工具程式。

updateAWT : 應用程式裡, 使用了 AWT1.02 的方法, 要使用此程式來更新那些已改變的名稱。

To work without glitches with the current directory structure I advise you to add /usr/local/JDK1.1.3/bin to the environment variable PATH. If you wish to make the development environment available system wide then fix the PATH variable in the /etc/profile file.

特徵

讓我們先暫停一下, 向自己問個問題: 什麼是 Java ? 依照 JDK 使用說明所述, 我們可以這樣回答: Java 包含兩種意義, 它一方面是一種程式語言, 另一方面也是一種平台環境。

以程式語言的角度來看, Java 是一種高階語言, 具有下列特色 ( 某些程度上, 我們會解說其細節 ) :

  • 簡單
  • 物件導向式
  • 分散式
  • 直譯式
  • 強固
  • 安全
  • 與系統架構保持中立
  • 可攜性高
  • 多執行緒
  • 動態式
  • 高解析

首先吸引我們注意力的是, Java 以直譯方式運作, 雖然說 Java 原始碼必須預先經過編譯過程, 以產生 bytecode 型式之物件, 但此物件已是低階的程式碼了, 可以在多種平台上被直譯執行了。

由於 Java 的 bytecode, 我們可以做到「編寫一次, 到處執行」的境界。 我們可以將 Java 程式於某一平台上編譯, 並在另一個完全不同架構的平台上執行, 只要該平台上具有 Java Virtual Machine (JVM) 功能。 舉例來說, Java 程式可以在 Windows NT 平台上編譯, 然後在 Sun Ultra Solaris 上執行無誤 ( 至少理論上是如此 )。

一般而言, 所謂「平台」指的是, 某種應用程式可以在上面執行的軟硬體環境。 然而, 對 Java 而言, 平台只是程式執行的軟體環境, 每個 Java 平台必須執行於某個硬體平台之上。

Java 平台具有下列兩項內容:

  • Java Virtual Machine (JVM)
  • Application Programming Interface (API)

JVM 是一種抽象化的電腦, 我們可以在上頭執行 Java 預先編譯過的程式。 它本身的設計原則是「小而簡單」, 因為其目的, 是為了儘可能在所有機器上都能安裝。 這樣的精簡原則, 使得它機會能夠在現有的平台上都可以順利執行, 有助於提供給所有人一個共通的軟體介面, 針對異質網路的環境 (諸如 Internet), 它可以解決不少可攜性的問題。 由此可知, 這項科技之所以能夠不斷推陳出新, 其主要原因應該在此。 僅管「虛擬機器」的概念, 不該只被視為是軟體介面, 但如其名稱所示, 目前它已逐步邁向完整之電腦系統, 沒過多久, 我們可以看到市面上會有 Java 晶片出現, 用來支援真正的 Java 機器、 信用卡、 電視解碼器等。

Java 之 API 是一個大型的軟體元件集合, 其提供許多種工具, 諸如使用者圖形介面 (GUI) 即為一例。 它們是以函式庫方式組成 ( 依 Java 之說法, 即為 Java 包裹 ), 藉由這些函式庫, 可以來產生許多種 Java 的應用程式, 而不限於眾所皆知的網頁 Applet, 舉例來說, 諸如網頁伺服機、 快取代理伺服機、 郵件伺服機、 IRC 伺服機、 甚至所有我們可以想像得到, 與 Internet 有關的東西。

我們可以將「API 包裹」分類成下列幾種:

  • 基本類: objects, matrixes, numbers, input and output, data structures, properties of the system, date, time, etc.
  • Applets : set of functions and utilities used to craft Java applets.
  • 網路類: URLs, TCP, UDP, sockets, IP addressing.
  • 與多國語文支援相關: Helps to write code that can be easily adapted to local specifications and can be visualized in a native language.
  • 與系統安全相關: low and high level, including digital signature, public and private keys, access control and certificates.
  • 與軟體元件相關: known as JavaBeans.
  • 與資料庫相關: provides uniform access to a large number of relational databases.

除了這些基本的 API 核心外, 另外還有諸如 3D 延伸功能, 行動通訊 (mobile communications), 動畫等。

在本章節的開頭, 我們已經提過 Java 有一系列的特色, 以下我們將更詳細地介紹它們:

簡單:

在 Java 裡面, 我們總可以由幾個定義好的格式, 來完成某一項工作。 一般功能強大的程式語言, 其所有的功能都能由 Java 來提供, 但 Java 卻把那些不常使用, 或是容易造成混淆的功能, 都給拿掉了。 Java 繼承了 C/C++ 的語法, 以及許多 C++ 物件導向的特色, 任何一位熟悉 C/C++ 的程式設計師, 都能輕鬆地學習 Java。 僅管它們之間有這些相似處, Java 還是去除了一些 C/C++ 的特色, 包括有:

  • 指標運算
  • Registers (struct)
  • 型態定義 (typedef)
  • 巨集 (#define)
  • 需要釋放記憶體 (free)
  • 沒有多重繼承
  • 沒有運算元的重載
  • 在 unions 裡沒有 structures
物件導向式: Java 由完全沒有的情況下開始設計, 因此對於物件導向, 它所使用的的方式非常的清楚實用。 Java 的物件模型十分簡單, 而且容易使用。
分散式: Java 在設計上, 可以很容易 TCP/IP 進行溝通, 事實上, Java 允許程式發展者在存取網路上的資料時, 就好像存取自己電腦上的檔案一樣簡單。
強固: Java 是一種非常注重形態轉換的語言, 所以在編譯時期 (compile-time) 就會做形態轉換檢查, 在執行時期 (run-time), Java 也會做一些形態上的檢查。 由於 Java 直譯器實作了自動垃圾蒐集器 (automatic garbage collector), 在這裡垃圾指的是一些不會再被使用的物件, 所以不必程式設計者費心, 記憶體也會被自動地管理。 Java 本身提供了許多物件導向的例外處理常式, 所以一個撰寫良好的應用程式, 在執行時期所發生的錯誤, 都可以由程式自己來處理.
與機器架構無關: Java 的設計者設計 Java 的主要目的, 就是希望程式可以做到, 「只寫一次, 就可以隨時隨地在任何地方執行」。 Java 寫成的程式碼, 會被編譯成高階的 byte code, 它們與機器架構無關, 這種 byte code 被設計用來在任何執行環境 ( Java 直譯器 ) 上執行, 然而這些執行環境是與機器相關的。
安全:

當需要分散式資訊時, 需要客戶端作業系統有很高階的安全機制, 由於 Java 在其執行時期環境的一些特色, 使得 Java 提供了安全機制:

  • bytecode 驗證器
  • 執行時期系統記憶體的取得方式
  • 檔案存取限制

即使經過編譯器產生了正確的 byte code, 解譯器在執行這些 byte code 時, 會再做一次雙重確認, 以確保這些 byte code 自從編譯過後, 沒有被更改過 ( 不管是不是故意的 )。 Java 直譯器更進一步決定各個類別所能取得的記憶體, Java 被認為是在任何系統上最安全的應用程式之一。

可攜性: 撇開 Java 基本的可攜性來說, 為了達到真正與機器架構無關, Java 實作了可攜性標準: 整數永遠是整數, GUI 包括了抽象的視窗系統 (AWT), 因此它是與機器架構 (UNIX, PC, MAC) 無關的。
It is interpreted: To achieve one of the basic goals of Java, platform independence, the java compiler generates an intermediate code (bytecode). It can be executed on any system with the proper interpreter. This paradigm may let us wonder on the possible performance problems of java applications. Nevertheless, and because of this performance concern, Java creators have tried to keep the bytecode design as simple and as easy to translate into machine code as possible in order to keep the highest performance possible.
It is multithreaded: It is simple to write Java applications that can execute several tasks at the same time in a robust way.
It is dynamic: Java does not try to link all the modules that form an application until run-time. This feature helps to link the code dynamically safely and conveniently.

After this long "speech" (much of which can be found in the official Java documentation) one can wonder about the status of Java in the GNU/Linux world. We mentioned earlier the availability of JDK for Linux, which is nothing but a commercial implementation developed by Sun Microsystems (although freely distributable).

There are tools like the compiler GUAVAC under GPL license, that let us compile any Java source without problems. We should also mention a virtual machine called KAFFE under Berkeley license. The last two projects are in a very advanced stage although still need of the Java class libraries from Sun (of free distribution at the moment) in order to have a complete development system.

Several recent projects, still in an early stage, aim at providing development environments to fast and visual applications.

Finally I would like to state that there is a great movement on the net concerning Java and GNU technologies, especially concerning the development of the complete tool box of free-distribution for Java and independent from Sun. We can already understand the importance of Java, and when the fashion is over I am sure that something is going to remain of it (I venture to say a lot of it is here to stay).

第一個用 JAVA 寫的程式

After seeing some of the general characteristics of the language let us take a look at a real program. As I mentioned in the introduction, I would like as much as possible to stay away from typical stuff, like the hello world example, instead let us start with a program that draws a square of any dimension we like (a bit complicated but not too much):

File Cuadro.Java
class Cuadro {
public static void main (String args[]) {
        int l ,a;
        if (args.length == 2) {
            l = Integer.valueOf(args[0]).intValue();
            a = Integer.valueOf(args[1]).intValue();
         }
         else {
          l= 20;
          a= 15;
         }
          for (int i=l; i>0; i--){
            System.out.print("*");
            }
            System.out.print("\n");
            for (int i= a-2; i>0; i--){
             System.out.print("*");
               for(int j=l-2; j>0; j--) {
                  System.out.print(" ");
                  }
                  System.out.print("*\n");
                  }
                for (int i=l; i>0; i--){
                System.out.print("*");
                }
              System.out.print("\n");
           }
}

In Java the name given to the source file is very important because it defines a "compilation unit". The file may contain one or more definitions of classes. The compiler expects the source file to have the extension .Java (4 characters) consequently some systems do not support it (DOS or Windows 3.1)

In the example given the name of the class defined coincides with the name of the source file. This is not by chance, in Java all code must be in a class. By convention the name of the class has to coincide with the name of the source file containing the class.. Moreover Java is case sensitive (upper or lower case).

To compile the example from the command line type:

> javac Cuadro.java

The Java compiler (if everything went OK) will generate the file Cuadro.class that naturally contains the binary (bytecode) form and it can be immediately executed by the interpreter as:

> java Cuadro

When java source code is compiled, each class in individually placed in an archive with the same name as the class. It is then a good habit to give the source files the same name as the class contained in them so that the source filename will coincide with the archive.class file.

Despite the simplicity of our example Cuadro.java it helps us understand the fundamentals of Java and in particular the structure of a typical java program.

First take into account that this example is not an applet that can be included in a HTML file but an independent program to be executed by the java interpreter on the command line.

The first line of the program is:

class Cuadro {

The first word is a reserved token of the language, it indicates the definition of a new class named in this case "Cuadro" -- Square in spanish -- The exact definition of the class including all its members follow in between two curly brackets {}. Note that in Java all the activity of a program resides inside a class.

In the following line:

public static void main (String args[]) {

it declares a method named main(). All Java applications start their execution with a method called main() (similar to C/C++). Next let me comment a few details necessary to understand the example (in later articles we will explained them in more depth).

The keyword public control the scope of the member methods of the class. When a class is declared public, then the class can be used by code defined outside the class. The keyword static forces the main() method to be invoked without needing to instigate the class. Void indicates that this method does not return any value. To pass parameters to a function or method one uses the parenthesis written after the name of the function, in our example main takes as parameter a matrix of instances from the class String.

Obviously all the code belonging to the method is also enclosed between curly brackets. Next, in the line:

 int l, a ;

we declare two integer variables. In Java every variable must be declared before it can be used. Notice each instruction in the code ends with a semi-colon ";".

The remains of the code implement a small algorithm that :

  1. Test whether the right number of arguments have been provided
    If (args.length==2)
    
  2. If parameters are provided, then they are assigned to the integer variables:
      l = Integer.valueOf(args[0]).intValue();
      a = Integer.valueOf(args[1]).intValue();
    
  3. Otherwise the variables are initialized to default values:
      l = 20;
      a = 15;
    
  4. The rest of the program is nothing more than the instructions needed to draw a square on the screen. We can point specially to:
    System.out.print()
    

    where print() prints the string passed as argument. System is a predefined class that gives access to the system and out is the output stream connected to the console. Also,

    for (int i=l; i>0; i--)
    

    As expected it behaves as our experience with C/C++ and other languages tells.

A nice piece of homework the reader can do using this little code is to test how to compile it and execute it, but also to test the portability of the code by running the compiled object Cuadro.class under various platforms: Linux, windows 95 (but don't take this as a present!) and see that it runs the same on any platform.

總結

我們已經由程式語言的角度, 分析了一些 Java 的特色, 至此, 我們才準備好開始可以寫程式, 往後還有很長的一段路要走, 接下來的文件中, 將提供更深入的說明。 預告下一篇的內容, 我們將研究變數的定義方式與其類型, 基本指令, 以及類別等, 這些都是 Java 最主要的獨特點。

每篇文件當中, 我都會附上參考資料、 出版書籍、 網路資源等, 這些是我撰寫此一系列文件的基礎。

  • JAVA Reference Manual. Patrick Naughton Herbert Schildt. McGraw-Hill.
  • Programming with JAVA. Tim Ritchey. Prentice Hall.
  • Tutorial de Java . Spanish manual in HTML format that can be obtained at www.fie.us.es/info/internet/JAVA. Agustín Froufe.
  • The Java Tutorial. English manual in HTML www.javasoft.com. Sun.
  • Tutorial from the JDK distribution.

本文由 Penelope Marr 所翻譯


主網站由 Miguel Angel Sepulveda 維護
© Jose M. Fernandez 1998
LinuxFocus 1998