知道了 java(TM) 的class和method的語法之后,我們就能設(shè)計(jì)一個Java 程序了。Java 應(yīng)用程序由一個或多個定義了數(shù)據(jù)和行為的class組成。Java編譯器將源程序轉(zhuǎn)換成為一種凈化處理過的格式。該格式只不過是操作-操作數(shù)對(Operation-operand(s))的一個線性排列: ... ... ... ... 這種數(shù)據(jù)流叫做字節(jié)碼流(bytecode stream),或簡稱 Java 字節(jié)碼(Java bytecodes)。字節(jié)碼流中的操作實(shí)現(xiàn)所謂的虛擬機(jī)(基于軟件的指令處理器)的指令集,此虛擬機(jī)通常稱作 Java 虛擬機(jī)(JVM)。實(shí)現(xiàn) JVM 的程序用作簡單地處理Java的class文件,有時為特定的環(huán)境設(shè)計(jì)。例如,支持Java的Web瀏覽器如 Netscape Navigator 和 Internet EXPlorer,都包含一個 JVM 的實(shí)現(xiàn)。實(shí)現(xiàn) JVM 的獨(dú)立程序被稱作Java解釋器(interPReters)。 Java 編譯器將字節(jié)碼流存到一個以 .class 為文件名后綴的文件即通常所說的 class 文件中。任何 Java 解釋器都能讀或者說處理這個流--“解釋”每一個操作和相應(yīng)的數(shù)據(jù)(即操作數(shù))。解釋過程分為: (1) 進(jìn)一步將凈化的字節(jié)碼翻譯成宿主計(jì)算機(jī)的機(jī)器指令; (2) 治理程序的執(zhí)行。 下面的流程圖說明了編譯和執(zhí)行的過程: Java的class文件是可跨平臺移植的,而Java編譯器和解釋器則是不可移植的,他們通常是用C語言編寫并被編譯成各計(jì)算機(jī)平臺固有的機(jī)器語言。因?yàn)镴ava編譯器產(chǎn)生的字節(jié)碼文件都遵循一種預(yù)先定義好的格式而且與機(jī)器無關(guān),同時任何Java解釋器能讀懂字節(jié)碼并進(jìn)一步將之翻譯成機(jī)器指令,因此一個Java程序無需重新編譯就可以隨處運(yùn)行。 通常將一個class的定義存為一個相應(yīng)文件名的Java源文件。如上例中的Dog,就被存為文件 Dog.java。Java 編譯器對源文件進(jìn)行處理生成字節(jié)碼的class文件,上例中為Dog.class,但在 Dog示例中,Dog.class 并不是一個 Java 程序。 一個 Java 程序由一個或者多個class文件構(gòu)成, 其中必須有一個定義了程序運(yùn)行的起始點(diǎn)--Dog.class 則沒有。從另一個角度說,起始點(diǎn)正是Dog這樣的class和實(shí)現(xiàn)程序的class的不同之處。Java中,程序的起始點(diǎn)用main()方法定義。同樣,一個程序必須有一個設(shè)計(jì)良好的終止點(diǎn)。Java中,停止程序運(yùn)行的一個辦法是調(diào)用或者說執(zhí)行系統(tǒng)(system)方法exit()。 因此,在我們能做任何令人興奮的事情前,我們應(yīng)該有一個具有明確起始點(diǎn)和終止點(diǎn)的程序。用一個隨意的用戶定義的數(shù)據(jù)類型即可達(dá)到目的。該類型提供了main()和exit()行為,以及用于確認(rèn)實(shí)際執(zhí)行的簡單輸出操作: public class SimpleProgram { public static void main(String[] args) { System.out.println("This is a simple program."); System.exit(0); } } main() 的方法標(biāo)記是不可以改變的。至此,你可仿照上例簡單地定義一個程序的入口--用 public 和 static 限制符以及 void返回類型。System ( java.lang.System) 是每一種 Java 環(huán)境中都提供的一個標(biāo)準(zhǔn)的 class ,它定義了許多實(shí)用的操作。
上例中用到了兩個操作: (1) 將數(shù)據(jù)顯示到標(biāo)準(zhǔn)輸出設(shè)備(通常為一個 IDE 窗口或者是操作系統(tǒng)的命令窗口)上; (2) 讓程序退出(exit)。 注重調(diào)用 exit() 時用 0 做參數(shù)是為了告訴調(diào)用程序和 Java 解釋器運(yùn)行沒有出錯,也就是說,程序是正常退出的。 到此為止,我們已經(jīng)有兩個class了:一個是真實(shí)世界的,用戶定義的數(shù)據(jù)類型Dog,另一個 class 則相當(dāng)神奇:它將特定應(yīng)用行為與開始和終止程序的機(jī)制聯(lián)系起來了。 現(xiàn)在該熟悉一下Java開發(fā)環(huán)境了。假如你有一個集成開發(fā)環(huán)境(IDE),它可能是也可能不是 file-oriented 的。在大多數(shù)的開發(fā)環(huán)境中,Java 源代碼存放在文件里。一個比較有名的例外是 IBM 的 VisualAge for Java,它將 class 的定義存在工作區(qū)(workspace area)中。 當(dāng)使用 file-oriented 的 IDE 時,需要注重文件名與 class 名相匹配;尤其要注重 class 的名字和文件的名字都是大小寫敏感的。當(dāng)然,你還需遵循因考慮系統(tǒng)環(huán)境變量設(shè)置等而為 Java 環(huán)境所設(shè)定的那些規(guī)則。