書名: Java高手真經·編程基礎卷:Java核心編程技術作者名: 劉中兵Java研究室編著本章字數: 12896字更新時間: 2019-01-01 07:13:12
第1課 Java快速上手
在學習Java之前,首先讓我們來解釋一個問題——Java是什么?Java是一種跨平臺的程序設計語言,用來開發運行于網絡上的各種應用程序,能夠在各種操作系統上運行。顯然這個解釋過于專業,難以讓初學者理解。
如果要用一個詞語來概括Java的真正內涵,那就是“海納百川,有容乃大”!海——代表Java資源平臺,百川——代表廣大的軟件開發者,容——代表Java的開放特性,即開源、跨平臺、跨網絡。Java的獨特魅力就是其開放性,正因為此:
● 它已經吸引了全球最大的開發者隊伍——500萬開發者,這是全球最大的、最具活力的開發團隊。
● 目前采用Java的設備也已超過45億,其中包括8億臺個人計算機、15億部移動電話及其他手持式設備、22億個智能卡,以及機頂盒、打印機、網絡照相機、游戲、汽車導航系統、彩票終端、醫療設備、收費站等。
Java可以說是無處不在,其市場占有率也在逐年上升。TIOBE是一個專業化的軟件評估公司,它每月都會根據工程師、培訓課程、技術公司數量,對各語言的市場占有率進行統計并發布報告(http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html),如表1-1所示。
表1-1 各語言占有率

Tips
其中,狀態中的A表示為主流開發語言,B為非主流開發語言,A-介于A和B之間。該報告不表示哪一種語言是最好的,但是能夠作為系統選型時的參考和市場趨勢的預測。該報告也被Google、MSN、Yahoo!和YouTube所引用參考。
表1-1列出了前20位的語言,除此之外還有上百種語言,常用的如Fortran、MATLAB、FoxPro、Transact-SQL、Awk、Groovy、Eiffel、PowerBuilder、VBScript、XSLT等。從表中可以看出,排名前十位的語言分別是:Java、C、C++、PHP、Visual Basic、Perl、Python、C#、JavaScript、Ruby,它們都是目前市場上的主流語言。其中,Java語言排在第一位,擁有1/5以上的市場占有率。
在以上的各種語言中,面向對象語言如Java、C++等占有率最高,其次是面向過程語言,如C、Pascal等,統計數據如表1-2所示。
表1-2 語言分類占有率

了解了Java在市場中的位置,下面就帶你邁入Java技術之門。這里是學習Java技術的第一站,在本章將介紹概括性的知識,了解Java的特性和機制,并開發第一個程序HelloWorld,共分為如下3部分。
● 開始了解Java:包括Java語言的11個特性、構成(JIT、JVM、JRE、JDK)、Java虛擬機JVM。
● 安裝Java開發環境:JDK的下載、安裝、配置和使用。
● 開發第一個Java程序——HelloWorld.java:包括開發、編譯、運行、打包和生成API文檔。
本課將通過了解、安裝、開發3步的講解,幫助你穩健、扎實、有效地邁進Java的精彩世界。
1.1 開始了解Java
Java是Sun公司推出的面向對象程序設計語言,特別適合于Internet應用程序開發,它的最大特點就是“一次編寫,到處運行”。下面我們就來了解Java語言的特性和運行機制。
1.1.1 Java語言的11個特性
Sun公司在1995年推出Java時發布了一個Java白皮書,并這樣定義Java語言:Java是一種簡單的(Simple)、面象對象的(Object-Oriented)、分布式的(Distributed)、解釋的(Interpreted)、健壯的(Robust)、安全的(Secure)、結構中立的(Architecture-neutral)、可移植的(Portable)、高性能的(High-Performance)、多線程的(Multi-Threaded)、動態的(Dynamic)語言。
通過這11個詞語來概括Java語言的特性,下面來看看每一個詞語所代表的含義。
(1)簡單的(Simple)
● 風格類似于C++,基本語法與C語言類似。
● 摒棄了C++中容易引發程序錯誤的地方,如指針和內存管理。
● 提供了豐富的類庫。
(2)面象對象的(Object-Oriented)
支持靜態和動態風格的代碼繼承及重用,是完全面向對象的,它不支持類似C語言那樣的面向過程的程序設計技術。
(3)分布式的(Distributed)
Java包括一個支持HTTP和FTP等基于TCP/IP協議的子庫。因此,Java應用程序可憑借URL打開并訪問網絡上的對象,其訪問方式與訪問本地文件系統幾乎完全相同。
(4)解釋的(Interpreted)
Java解釋器(運行系統)能直接運行目標代碼指令。
(5)健壯的(Robust)
● Java致力于檢查程序在編譯和運行時的錯誤。
● 類型檢查幫助檢查出許多開發早期出現的錯誤。
● Java自已操縱內存減少了內存出錯的可能性。
● Java還實現了真數組, 避免了覆蓋數據的可能。
(6)安全的(Secure)
Java的安全性可從兩個方面得到保證。一方面,在Java語言里,指針和釋放內存等C++功能被刪除,避免了非法內存操作;另一方面,當Java用來創建瀏覽器時,語言功能和一些瀏覽器本身提供的功能結合起來,使它更安全。
(7)結構中立的(Architecture-neutral)
Java源程序被編譯成一種高層次的與機器無關的byte-code格式語言,被設計在Java虛擬機上運行。
(8)可移植的(Portable)
Java應用程序可以在配備了Java解釋器和運行環境的任何計算機系統上運行,通過定義獨立于平臺的基本數據類型及其運算,Java數據得以在任何硬件平臺上保持一致。
(9)高性能的(High-Performance)
Java可以在運行時直接將目標代碼翻譯成機器指令,Sun用直接解釋器1秒鐘內可調用300000個過程,翻譯目標代碼的速度與C/C++的性能沒什么區別。
(10)多線程的(Multi-Threaded)
Java提供的多線程功能使得在一個程序里可同時執行多個小任務。多線程帶來的好處是可以有更好的交互性能和實時控制性能。
(11)動態的(Dynamic)
Java的動態特性是其面向對象設計方法的拓展,它允許程序動態地裝入運行過程中所需要的類。
1.1.2 Java語言的構成——JIT、JVM、JRE、JDK
下面我們來了解Java的構成。所謂Java的構成,是指Java運行環境的組成,從核心到外圍包括JIT、JVM、JRE、JDK,如圖1-1所示。

圖1-1 Java構成圖
JDK、JRE、JVM、JIT四者的區別如下。
● JDK是Java Develop ToolKit的縮寫,它里面有很多用Java所編寫的開發工具(如javac.exe、jar.exe等),還包括一個JRE的調試環境。如果安裝了JDK,會有兩套JRE,一套位于\jre目錄下,另外一套位于C:\Program Files\Java目錄下,后面這套比前面那套少了Server端的Java虛擬機,不過,直接將前面那套的Server端Java虛擬機復制過來就行了。
● JRE是Java Runtime Environment的縮寫,是Java運行的基礎,它提供了Java運行的API,Java程序必須有JRE才能運行。
● JVM是Java Vitual Machine的縮寫,它是Java程序運行的虛擬機環境,JRE目錄下的Bin目錄有兩個目錄,即server與client,這就是真正的jvm.dll所在。jvm.dll無法單獨工作,當jvm.dll啟動后,會使用explicit的方法,而這些輔助用的動態鏈接庫(.dll)都必須位于jvm.dll所在目錄的父目錄之中。因此想使用哪個JVM,只需要設置PATH,指向JRE所在目錄下的jvm.dll。
● JIT是Java In Time的縮寫,即Java即時編譯器,是JVM的一部分,屬于內核部分。
其中的JVM是Java運行的虛擬機環境,它是Java運行環境的重要一環,JDK是Sun公司開發的Java開發工具包,在后文中我們都將逐步講解。
1.1.3 Java虛擬機JVM
JVM是Java虛擬機(Java Virtual Machine)的縮寫,它是一個虛構出來的計算機,是通過在實際的計算機上仿真模擬各種計算機功能來實現的。Java虛擬機有自己完善的硬件架構,具體如下。
● JVM指令系統。
● JVM寄存器。
● JVM棧結構。
● JVM碎片回收堆。
● JVM存儲區。
Java語言最突出的特點就是可以在任何操作系統中運行。使用Java虛擬機就是為了支持與操作系統無關,在任何系統中都可以運行。Java虛擬機屏蔽了與具體操作系統平臺相關的信息,使得Java語言編譯程序只需生成在Java虛擬機上運行的目標代碼(字節碼),就可以在多種平臺上不加修改地運行。Java虛擬機在執行字節碼時,實際上最終還是把字節碼解釋成具體平臺上的機器指令執行。
如圖1-2所示,展示了JVM在Java類文件(即字節碼文件class)和操作系統中間的作用。

圖1-2 JVM模擬圖
可以說,Java虛擬機是Java語言的基礎,它是Java技術的重要組成部分。
1.2 安裝Java開發環境
Java類文件的生成和在JVM里的運行,都是通過JDK開發工具來執行的,JDK提供了一系列的開發運行命令,下面我們就來講解JDK開發環境的安裝與使用。
1.2.1 下載JDK
JDK(Java Development Kit)即Java開發工具包,它是進行Java開發的必備工具包,包含了Java運行時環境JRE、Java虛擬機JVM和Java運行API,為我們進行Java的開發工作提供了必備的運行環境和API接口。
JDK的官方網站是http://java.sun.com/javase/downloads/index.jsp,如圖1-3所示。

圖1-3 JDK官方網站
該頁面提供了JDK各版本的下載,從該頁面中可以看到最新的版本為JDK 6,本書也使用當前最新的版本JDK 6進行開發。單擊“Download”按鈕即可進入到下載頁面,按照頁面提示最后會下載到安裝文件jdk-6u10-beta-windows-i586-p.exe,其中6u10表示JDK 6的第10次更新。
1.2.2 安裝JDK和JRE
剛才下載的安裝包jdk-6u10-beta-windows-i586-p.exe是JDK的安裝包,它包含了JDK和JRE的安裝程序,JDK是程序員開發時所需要的工具集,JRE是程序運行時環境,因此對于開發人員來說都需要安裝JDK和JRE,而對于部署機器來說可以下載專門的JRE包來安裝。由于我們要進行Java程序的開發,因此下載了該JDK包。
安裝該JDK包共需要如下的8個步驟。
(1)安裝歡迎頁面:雙擊下載的jdk-6u10-beta-windows-i586-p.exe文件,可進入安裝歡迎界面,如圖1-4所示。

圖1-4 安裝歡迎頁面
(2)接受許可證協議:歡迎頁面打開后會計算該安裝包的大小,然后會顯示“下一步”按鈕可用,此時單擊“下一步”按鈕彈出許可證協議界面,如圖1-5所示。

圖1-5 接受許可證協議
(3)選擇安裝的可選功能:要繼續安裝,必須單擊“接受”按鈕,即可進入功能選擇界面。該界面列出了安裝包所包含的功能組件,可以通過單擊某一個功能組件的下拉按鈕來決定是否安裝該組件,默認情況下我們都安裝這些組件,因此不需要進行選擇,如圖1-6所示。

圖1-6 選擇安裝的可選功能
(4)更改JDK安裝目錄:默認情況下JDK的安裝目錄為C:\Program Files\Java,通常我們為了方便找到JDK目錄,可以自己指定JDK安裝目錄。單擊圖1-6中的“更改”按鈕,即可彈出選擇安裝目錄的界面。我們更改目錄為D:\jdk1.6.0-10\,如圖1-7所示。

圖1-7 更改JDK安裝目錄
(5)開始安裝進程:單擊圖1-7中的“確定“按鈕,即可進入如圖1-8所示的安裝進程界面。

圖1-8 開始安裝進程
(6)選擇JRE安裝目錄:在該安裝過程中會進行下載、解壓縮等一系列操作,完成后會顯示如圖1-9所示的JRE安裝界面。在該界面中同樣包含一個“更改“按鈕,用來選擇JRE的安裝目錄。由于JRE屬于系統運行時環境,所以我們使用默認的參數C:\Program Files\Java\jre6\即可。

圖1-9 選擇JRE安裝目錄
(7)開始安裝JRE:單擊圖1-9中的“下一步“按鈕,即可進入如圖1-10所示的安裝JRE進程界面。

圖1-10 開始安裝JRE
(8)安裝完成:該過程結束后即完成了JDK和JRE的安裝,此時會顯示如圖1-11所示的安裝完成界面。

圖1-11 安裝完成
到此,JDK和JRE的安裝就結束了,JDK安裝后的目錄結構如圖1-12所示。這些目錄分別對應JDK以下部分的組成。

圖1-12 JDK安裝后的目錄
● bin——開發工具:位于bin子目錄中。指工具和實用程序,可幫助你開發、執行、調試和保存以Java編程語言編寫的程序。
● demo——演示applet和應用程序:位于demo子目錄中。帶有源代碼的Java平臺編程示例,包括使用Swing和其他Java基類,以及Java平臺調試器體系結構的示例。
● include——C頭文件:位于include子目錄中。支持使用Java本機界面、JVMTM工具界面,以及Java 2平臺的其他功能進行本機代碼編程的頭文件。
● jre——運行時環境:位于jre子目錄中。Java運行時環境的實現,由JDK使用。該運行時環境包含Java虛擬機、類庫及其他文件,可支持執行以Java編程語言編寫的程序。
● lib——附加庫:位于lib子目錄中。開發工具需要的附加類庫和支持文件。
● sample——樣例代碼:位于sample子目錄中。包含某些Java API的編程樣例(帶源代碼)。
● src.zip——源代碼:位于src.zip中。組成Java 2核心API的所有類的Java編程語言源文件(即java.*、javax.*和某些org.*包的源文件,但不包括com.sun.*包的源文件)。此源代碼僅用于提供信息,以便幫助開發者學習和使用Java編程語言。這些文件不包含特定于平臺的實現代碼,且不能用于重新生成類庫。要對這些文件進行解壓,請使用任一常用的zip實用程序;或者也可以使用JDK的bin目錄中的Jar實用程序:
jar xvf src.zip
1.2.3 設置環境變量
在“我的電腦”上單擊鼠標右鍵,在彈出的快捷菜單中選擇“屬性”命令,在彈出的對話框中選擇“高級”選項卡,單擊“環境變量”按鈕,顯示“環境變量”窗口,如圖1-13所示。

圖1-13 “環境變量”窗口
然后單擊“新建”按鈕添加如下的環境變量。
① 設置JAVA_HOME變量為Java的主目錄C:\j2sdk1.6.0:
$JAVA_HOME=C:\j2sdk1.6.0;
如圖1-14所示為設置JAVA_HOME變量。

圖1-14 設置JAVA_HOME變量
Tips
設置JAVA_HOME的目的是,許多其他的軟件都以該變量來查找Java的安裝路徑,例如Tomcat,設置了該環境變量,Tomcat就能夠自動查找到Java安裝路徑了。
② 把Java的bin目錄路徑C:\j2sdk1.6.0\bin添加到Path環境變量中:
$Path=C:\j2sdk1.6.0\bin;
如圖1-15所示為設置PATH變量。

圖1-15 設置PATH變量
Tips
設置Path的目的是,可以在任意位置下執行JDK的相關命令,如編譯javac、運行Java等。
測試Java環境:進入命令提示符(選擇“開始”→“運行”命令,在打開對話框中輸入“cmd”),然后輸入命令“javac -version”或“java -version”,查看版本是否正確,正常情況下會顯示如圖1-16所示的信息。

圖1-16 查看版本號
輸入“javac -help”查看是不是正確的提示,如果提示“不是內部或外部命令,也不是可運行的程序或批處理文件”,則說明沒有把Path路徑設置好。正常情況下應該顯示如圖1-17所示的窗口。

圖1-17 查看幫助
1.2.4 學會查找Java幫助和API文檔
Sun在其官方網站上提供了一系列的幫助文檔,包括核心和非核心API文檔、開發手冊等,網址為http://java.sun.com/javase/reference/api.jsp,如圖1-18所示。

圖1-18 Sun網站上幫助文檔列表
從該頁面上可以看到各個版本的API幫助文檔和開發手冊,包括1.3.0、1.3.1、1.4.0、1.4.2、5.0、6.0。從JDK 5.0開始,就提供了3個語言版本的API文檔,包括英文、中文、日文。中文API地址為http://gceclub.sun.com.cn/Java_Docs/jdk6/html/zh_CN/api/index.html,如圖1-19所示。

圖1-19 API文檔
該頁面提供了Java核心API的幫助文檔,使用JDK開發Java應用程序時,通常需要引用一些核心的API類,此時都需要在這里查找類的方法列表和使用說明。它共包含3部分:
● 左上角是類包列表。
● 左下角是類列表,選擇左上角的類包,在下方就會顯示該包下的類列表。
● 右側是類的函數列表,選擇左下角的某一個類后就會顯示類的函數列表。
Tips
Java API文檔相當于微軟的MSDN,是Java程序員的必備手冊。因此,你必須學會使用該API文檔來查找Java類的函數。
1.3 開發第一個Java程序——HelloWorld.java
Java是一門很容易上手的語言,本節我們將通過一個入門實例HelloWorld.java,來講解一個Java類的編寫、編譯、運行、打包和生成API文檔的方法。
Tips
使用命令行編譯、運行、打包和生成API文檔,是學習Java編程的基本功,掌握了這些方法,以后無論是在使用Eclipse、Ant等什么工具,或者在Linux系統下的使用,都是基于這些命令的。
1.3.1 編寫Java入門實例HelloWorld.java
首先我們需要建立一個工作目錄D:\demo,接下來的工作都將在該目錄下進行。在該目錄下新建一個子目錄mypackage,它將被用為類的包目錄。
然后在mypackage目錄下新建第一個Java類文件HelloWorld.java,作用是往控制臺輸出一個字符串“Hello World!”。先來看看該類的完整代碼,如程序1-1所示。
程序1-1 HelloWorld.java完整版
11 package mypackage; 2 3 /** 4 *@author liuzhongbing lzb_box@163.com 5 */ 62 public class HelloWorld{ 7 8 /** 9 * 變量 10 */ 113private String world="World"; 12 13 /** 14 * 函數 15 */ 164 public void say(){ 175 System.out.println("Hello"+world+"!"); 186 } 19 20 /** 21 * 執行入口函數 22 *@param args 23 */ 247 public static void main(String args[]){ 25 //創建類的實例 268 HelloWorld inst=new HelloWorld(); 27 28 //調用函數 299 inst.say(); 2010 } 3111 }
該類共包含31行代碼,去掉注釋和空行后只有11行代碼,也就是說只有11行有效代碼,如程序1-2所示。
程序1-2 HelloWorld.java精華版
1 package mypackage; 2 public class HelloWorld{ 3 private String world="World"; 4 public void say(){ 5 System.out.println("Hello"+world+"!"); 6 } 7 public static void main(String args[]){ 8 HelloWorld inst=new HelloWorld(); 9 inst.say(); 10 } 11}
為了提高代碼的可讀性,我們增加了很多注釋和空行,這也是編寫Java代碼所需要遵守的編碼規范(在第4章中我們將會詳細講解Java編碼規范)。
另外,該類是一個簡單、涵蓋比較全的Java類。簡單,是因為它的語法類似于C++;全面,是因為該類基本上覆蓋了Java類的大部分元素,包括如下。
● 包元素:第1行的“package mypackage”,指示該類的包為mypackage,所以該類應該放在當前目錄的mypackage子目錄(即包)中。
Tips
當前目錄是Java中運行程序的根目錄,任何一個程序、應用都有一個根目錄,相對該根目錄可以放置多個包。另外,包里還可以有子包,即包的繼承。例如,可以定義第二層包mypackage.childpackage。
● 類元素:第2行的“public class HelloWorld”定義了一個共用的(public)類(class)HelloWorld,類文件的命名需要與該類名相同。
● 變量:第3行的“private String world = "World";”定義了一個私有的(private)字符串類型(String)的變量world,該變量將會被下一個函數引用。
● 函數:第4行的“public void say()”定義了一個共有的(public)的無返回參數(void)的函數say(),該函數中調用了系統類(System)的輸出命令,往控制臺輸出一個字符串,并且引用了第3行定義的變量world。
● 入口函數:第7行的“public static void main(String args[])”定義了該類的執行入口函數,該入口函數類似于C代碼中的入口函數main(),是程序執行的入口點。入口函數的修飾符必須是“public static void”,在后文中將會深入講解。函數中我們創建了類HelloWorld的一個實例inst,然后調用該實例的函數say()來執行輸出。
Tips
對于未學習過Java的人來說,也許以上的有些元素類型不太熟悉,先不用深究每一個元素是怎么使用的,在后面的章節中將會分專題講解,我們先理解這個類的5個元素及各自的關系和作用就可以了,然后來學習如何編譯和運行這個類。
1.3.2 編譯類文件——javac命令
前文中我們講到Java是“一次編寫,到處運行”的,即跨平臺運行的特性,這是由于它能夠通過JVM來運行二進制代碼文件,即.class文件。在一個類能夠運行之前,都必須進行編譯,被編譯后的類文件為同名的文件,且以.class為文件擴展名。如HelloWorld.java會被編譯為HelloWorld.class,類的編譯和命名都是由編譯命令javac自動完成的。
下面分4個方面來講解javac命令的使用。
(1)javac命令的語法結構
javac命令的語法結構如下所示:
javac [options] [sourcefiles] [@files]
其中的參數可按任意次序排列。
● options:命令行選項。
● sourcefiles:一個或多個要編譯的源文件(例如HelloWorld.java)。
● @files:一個或多個對源文件進行列表的文件。
(2)傳遞源文件名的兩種方法
以上編譯命令的第二個和第三個參數分別對應了兩種使用方法,用于將源代碼文件名傳遞給javac。
● 使用sourcefiles:如果源文件數量少,在命令行上列出文件名即可。例如,對于MyClass1.java和MyClass2.java,可以使用“javac MyClass1.java MyClass2.java”進行編譯,也可以使用通配符“javac MyClass*.java”。
● 使用@files:如果源文件數量多,則將源文件名列在一個文件中,名稱間用空格或回車行來進行分隔。然后在javac命令行中使用該列表文件名,文件名前冠以@字符。例如我們可以命名一個文件@list.txt,然后執行“javac @list.txt”即可,此時的文件列表可以如下所示:
MyClass1.java MyClass2.java MyClass3.java
(3)傳遞帶包名的源文件的方法
對于有包路徑的類,可以使用相對路徑表示,比如包mypackage下的HelloWorld.java,可以使用“javac mypackage\HelloWorld.java”來編譯,如圖1-20所示。此時就會在包mypackage下產生編譯后的文件HelloWorld.class。

圖1-20 編譯類文件
(4)命令選項
編譯器有一批標準選項,目前的開發環境支持這些標準選項,將來的版本也將支持它。還有一批附加的非標準選項是目前的虛擬機實現所特有的,將來可能要有變化。非標準選項以-X打頭。
以下3個是設置路徑的選項。
● -classpath類路徑:設置用戶類路徑,它將覆蓋CLASSPATH環境變量中的用戶類路徑。若既未指定CLASSPATH又未指定-classpath,則用戶類路徑由當前目錄構成。
● -d目錄:設置類文件的目標目錄。如果某個類是一個包的組成部分,則javac將把該類文
件放入反映包名的子目錄中,必要時創建目錄。例如,如果指定-dc:\demo并且該類名叫mypackage.HelloWorld,那么類文件就叫D:\demo\mypackage\ HelloWorld.class。若未指定-d選項,則javac將把類文件放到與源文件相同的目錄中。
Tips
-d選項指定的目錄不會被自動添加到用戶類路徑中。
● -sourcepath源路徑:指定用以查找類或接口定義的源代碼路徑。與用戶類路徑一樣,源路徑項用分號(;)進行分隔,它們可以是目錄、JAR歸檔文件或ZIP歸檔文件。如果使用包,那么目錄或歸檔文件中的本地路徑名必須反映包名。
Tips
通過類路徑查找的類,如果找到了其源文件,則可能會自動被重新編譯。
例如,我們可以使用這3個屬性來將源代碼、classpath和目標路徑分開:
javac -sourcepath src -classpath classes:lib\Banners.jar \src\farewells\GoodBye.java -d classes
這樣,就會把src目錄下的代碼編譯到classes目錄下,并引用classpath中的類。
以下5個是設置編譯屬性和性能的選項。
● -deprecation:顯示每種不鼓勵使用的成員或類的使用或覆蓋的說明。如果沒有給出-deprecation選項的話,javac將顯示這類源文件的名稱,這些源文件使用或覆蓋不鼓勵使用的成員或類。
● -encoding:設置源文件編碼名稱,例如EUCJIS/SJIS。若未指定-encoding選項,則使用平臺默認的轉換器。
● -g:生成所有的調試信息,包括局部變量。在默認情況下,只生成行號和源文件信息。
● -nowarn:禁用警告信息。
● -verbose:冗長輸出。它包括了每個所加載的類和每個所編譯的源文件的有關信息。
除了以上幾個常用的選項之外,還有一些聯編選項和非標準選項(以-X開頭的選項),這些選項不太常用,需要的讀者可以查閱Java文檔。
1.3.3 運行類文件——java命令
上面使用javac命令編譯生成的*.class文件,需要使用java命令來運行它。使用java命令運行某一個類的條件是,該類必須包含有一個入口函數main(),如HelloWorld.java中的入口函數。java命令一次只可以執行一個類文件,找到該類文件的main()入口函數后即會開始執行代碼。
下面分5個方面來講解java命令的使用。
(1)java命令的語法結構
java命令的語法結構如下所示:
java [options] class [argument] java [options] -jar file.jar [argument]
其中的參數意義如下。
● options:命令行選項。
● class:要調用的類名。
● file.jar:要調用的JAR文件名,只與-jar一起使用。
● argument:傳給main函數的參數。
(2)執行一個類文件
執行類文件時,只需要指定類文件的全名即可,全名中包含包名,包路徑使用點號“.”表示。例如,我們來編譯前文中的mypackage\HelloWorld.class類,執行的命令如圖1-21所示。

圖1-21 運行類文件
此時就會調用HelloWorld.java的say()函數,往控制臺輸出一個字符串“Hello World!”。
(3)執行一個JAR包
執行JAR包時,該包中的MENIFEST.MF文件中必須指定當前包中那個類是主類,即指定執行入口類,使用屬性為Main-Class(創建方法見下一節例4)。
執行的方式如圖1-22所示。

圖1-22 運行JAR包
(4)命令選項
java命令有一組標準選項,當前的運行時環境支持這些選項并且將來的版本也將支持它們。還有一組其他的非標準選項是特定于目前的虛擬機實現的,將來可能要有變化。非標準選項以-X打頭。
● -classpath類路徑:指定類的環境變量,同javac中的-classpath選項。
● -cp類路徑:指定一個用于查找類文件的列表,它由目錄、JAR歸檔文件和ZIP歸檔文件組成。類路徑項用分號(;)分隔。指定-classpath或-cp將覆蓋CLASSPATH環境變量的所有設置。
Tips
如果不使用-classpath和-cp,且沒有設定CLASSPATH,則用戶類路徑由當前目錄(.)構成。
● -D屬性=值:設置系統屬性的值。例如“-Dmyname=liuzhongbing”,這樣在Java類中就可以取得系統屬性myname的值liuzhongbing。
● -jar:執行封裝在JAR歸檔文件中的程序。第一個參數是JAR歸檔文件的名稱而不是啟動類名。啟動類由Main-Class清單頭指定。JAR文件是所有用戶類的源,其他的用戶類路徑設置將被忽略。
除了以上的幾個常用選項外,還有一些以“-X”開頭的非標準選項,用以對執行時的環境進行設置。最常用的是對Java虛擬機的堆大小進行設置,以提高Java運行的內存和運行效率。例如“-Xms256m -Xmx256m -XX:NewSize=128m -XX:MaxNewSize=128m”,Xms代表默認啟動大小,Xmx代表最大大小,NewSize是新建對象的大小,MaxNewSize是新建堆運行增長的最大值,它決定了何時將新的對象置為舊的對象。其中m代表MB,g代表GB。
Tips
在進行Tomcat系統部署時,默認的內存大小為56MB,而通常我們可能需要更多的內存,此時就可以在Tomcat的啟動命令后使用該參數。Tomcat也是通過java命令來執行一個Java類來啟動的,因此此時可以添加“java … -Xms256M -Xmx128M”來加大內存,提高效率。
(5)給類傳遞參數
在Java的命令中還有一個變量argument,該變量用于向目標類main()函數傳遞輸入參數,多個參數使用空格分隔。例如我們可以執行如下的傳遞參數的命令:
java mypackage.HelloWorld AAA BBB
那么我們在入口函數中,就可以通過args變量來取得該參數:
public static void main(String args[]) { String str1 = args[0]; String str2 = args[1]; }
1.3.4 類文件打包——jar命令
上文中我們講到了運行JAR文件,下面我們就來講解如何生成JAR包。
JAR包可以使用jar命令來創建。JAR工具是個Java應用程序,可將多個文件合并為單個JAR歸檔文件。JAR是個多用途的存檔及壓縮工具,它基于ZIP和ZLIB壓縮格式。然而,設計JAR的主要目的是便于將Java Applet或應用程序打包成單個歸檔文件。將Applet或應用程序的組件(.class文件、圖像和聲音)合并成單個歸檔文件時,可以用Java代理(如瀏覽器)在一次HTTP事務處理過程中對它們進行下載,而不是對每個組件都要求一個新連接,這大大縮短了下載時間。JAR還能壓縮文件,從而進一步提高了下載速度。此外,它允許Applet的作者對文件中的各個項進行簽名,因而可認證其來源。
下面分4個方面來講解jar命令的使用。
(1)jar命令的語法結構
jar命令的語法結構如下所示:
jar{ctxu}[vfm0M][jar-文件][manifest-文件][-C目錄] 文件名
(2){ctxu}屬性
其中{ctxu}是jar命令的子命令,每次jar命令只能包含ctxu中的一個,它們分別表示如下。
● -c:創建新的JAR文件包。
● -t:列出JAR文件包的內容列表。
● -x:展開JAR文件包的指定文件或者所有文件。
● -u:更新已存在的JAR文件包(添加文件到JAR文件包中)。
(3)[vfm0M]選項
[vfm0M]中的選項可以任選,也可以不選,它們是jar命令的選項參數。
● -v:生成詳細報告并打印到標準輸出。
● -f:指定JAR文件名,通常這個參數是必需的。
● -m:指定需要包含的MANIFEST清單文件。
● -0:只存儲,不壓縮,這樣產生的JAR文件包會比不用該參數產生的體積大,但速度更快。
● -M:不產生所有項的清單(MANIFEST)文件,此參數會忽略-m參數。
(4)參數
其他的參數意義如下。
● [JAR文件]:即需要生成、查看、更新或者解開的JAR文件包,它是-f參數的附屬參數。
● [manifest文件]:即MANIFEST清單文件,它是-m參數的附屬參數。
● [-C目錄]:表示轉到指定目錄下去執行jar命令的操作。它相當于先使用cd命令轉該目錄下再執行不帶-C參數的jar命令,它只能在創建和更新JAR文件包的時候可用。
● 文件名:指定一個文件/目錄列表,這些文件/目錄就是要添加到JAR文件包中的文件/目錄。如果指定了目錄,那么使用jar命令打包的時候會自動把該目錄中的所有文件和子目錄打入包中。
下面舉一些例子來說明jar命令的用法。
例1:jar cf HelloWorld.jar mypackage
該命令將包mypackage中的文件打包,沒有執行過程的顯示,執行結果是在當前目錄生成了HelloWorld.jar文件。如果當前目錄已經存在HelloWorld.jar,那么該文件將被覆蓋,如圖1-23所示。

圖1-23 例1
例2:jar cvf HelloWorld.jar mypackage
該命令與上例中的結果相同,但是由于v參數的作用,顯示出了打包過程,如圖1-24所示。

圖1-24 例2
例3:jar cvfM HelloWorld.jar mypackage
該命令與例2結果類似,但在生成的HelloWorld.jar中沒有包含META-INF/MANIFEST文件,打包過程的信息也略有差別,如圖1-25所示。

圖1-25 例3
例4:jar cvfm HelloWorld.jar manifest.mf mypackage
運行結果與例2相似,顯示信息也相同,只是生成JAR包中的META-INF/MANIFEST內容不同,包含了manifest.mf的內容,如圖1-26所示。

圖1-26 例4
其中,manifest.mf的內容如下:
Main-Class: mypackage.HelloWorld //注意:最后一行要有一個空行
例5:jar tf HelloWorld.jar
在HelloWorld.jar已經存在的情況下,可以查看HelloWorld.jar中的內容,如對于例4生成的HelloWorld.jar執行此命令,結果如圖1-27所示。

圖1-27 例5
例6:jar tvf HelloWorld.jar
除例5中顯示的內容外,還可以顯示包內文件的詳細信息,如圖1-28所示。

圖1-28 例6
例7:jar xvf HelloWorld.jar
解開HelloWorld.jar到當前目錄,不顯示任何信息。如果要顯示解壓縮的詳細信息,可以使用如下命令:
jar xvf HelloWorld.jar
此時會顯示如圖1-29所示的信息。

圖1-29 例7
1.3.5 生成API文檔——javadoc命令
前文中我們已經講到該如何充分利用Java的幫助文檔,其中最重要的文檔是Java的API文檔。這些API文檔是Sun開發的JDK核心Java類的API文檔。
既然Sun能夠為它的類生成API文檔,那我們也可以為自己開發的類生成API文檔。在稍微大型的項目中,生成API文檔不僅有利于開發人員之間的溝通,還能夠為項目留下一份參考的API,便于代碼的維護和傳播。
JDK為我們提供了一個命令用于生成API文檔,即javadoc。javadoc解析Java源文件中的聲明和文檔注釋,并產生相應的HTML默認頁,描述公有類、保護類、內部類、接口、構造函數、方法和域。在實現時,javadoc要求且依賴于Java編譯器完成其工作。javadoc調用部分javac編譯聲明部分,忽略成員實現。它建立類的內容,包括類層次和“使用”關系,然后從中生成HTML。javadoc還從源代碼的文檔注釋中獲得用戶提供的文檔。當javadoc建立其內部文檔結構時,它將加載所有引用的類。由于這一點,javadoc必須能查找到所有引用的類,包括引導類、擴展類和用戶類。
下面分兩個方面來講解javadoc命令的使用。
(1)javadoc命令的語法結構
javadoc的語法格式如下:
javadoc [命令選項] [包名] [源文件名] [ @files ]
其中:
● [包名]為用空格分隔的一系列包的名字,包名不允許使用通配符,如“*”。
● [源文件名]為用空格分隔的一系列的源文件名,源文件名可包括路徑和通配符,如“*”。
● [ @files ]是以任何次序包含包名和源文件的一個或多個文件。
(2)命令選項
javadoc命令選項包括如下幾種可選屬性。
● -overview <文件>:讀取HTML文件的概述文檔。
● -public:僅顯示公共類和成員。
● -protected:顯示受保護/公共類和成員(默認)。
● -package:顯示軟件包/受保護/公共類和成員。
● -private:顯示所有類和成員。
● -help:顯示命令行選項并退出。
● -doclet <類>:通過替代doclet生成輸出。
● -docletpath <路徑>:指定查找doclet類文件的位置。
● -sourcepath <路徑列表>:指定查找源文件的位置。
● -classpath <路徑列表>:指定查找用戶類文件的位置。
● -exclude <軟件包列表>:指定要排除的軟件包的列表。
● -subpackages <子軟件包列表>:指定要遞歸裝入的子軟件包。
● -breakiterator:使用BreakIterator計算第1句。
● -bootclasspath:<路徑列表> 覆蓋引導類加載器所裝入的類文件的位置。
● -source <版本>:提供與指定版本的源兼容性。
● -extdirs <目錄列表>:覆蓋安裝的擴展目錄的位置。
● -verbose:輸出有關Javadoc正在執行的操作的消息。
● -locale <名稱>:要使用的語言環境,例如en_US或en_US_WIN。
● -encoding <名稱>:源文件編碼名稱。
● -quiet:不顯示狀態消息。
● -J<標志>:直接將 <標志> 傳遞給運行時系統。
例如,我們來為HelloWorld.java生成API文檔,執行如下命令:
javacdoc mypackage\*.jara -d javadoc
該命令用于為mypackage包下的類生成API,輸出目錄為javadoc。執行該命令后會輸出一系列的執行記錄,如圖1-30所示。

圖1-30 生成API文檔
此時在D:\demo下就會產生一個目錄javadoc,即為剛生成的API文檔目錄。查看D:\demo\javadoc目錄,會顯示固定文件名稱(主要是API的框架文件,如首頁面index.html)的文件目錄,如圖1-31所示。

圖1-31 API生成目錄
查看該API文檔的方法是,雙擊“index.html”文件,即可彈出如圖1-32所示的API頁面。

圖1-32 查看API文檔
通過與1.2.4節的圖1-19對比可知,我們創建的API文檔與Sun的API文檔結構完全相同,這就是javadoc的作用,它統一了生成API的模板。如果你創建了很多Java類,那么就可以發揮實際的方便作用了。
1.4 本課小結
到這里我們就完成了本課內容的講解,我們將本課的實例代碼打包為HelloWorld.zip,其包含的目錄和文件如下:
HelloWorld.zip ├—HelloWorld.jar 生成的JAR包 ├—manifest.mf 生成JAR包時的manifest文件 | ├—javadoc 生成的Java API文檔 | | allclasses-frame.html | | allclasses-noframe.html | | constant-values.html | | deprecated-list.html | | help-doc.html | | index-all.html | | index.html | | overview-tree.html | | package-list | | stylesheet.css | | | ├—mypackage | | HelloWorld.html | | package-frame.html | | package-summary.html | | package-tree.html | | | └—resources | inherit.gif | └—mypackage java和class包目錄 HelloWorld.class class文件 HelloWorld.java java源文件
該文件放在光盤中\source目錄下,讀者可以查閱該代碼。
1.4.1 總結本課的知識點
本節課首先講解了Java語言的市場地位,然后分3個大節逐層深入進行講解,并將理論與實踐相結合。每一個大節分多個小節,每一個小節都對應了一個知識點,共包含13個知識點,如表1-3所示。
表1-3 本課知識點列表

培訓講師可以參照表中最后一列的參考時間控制講解進度,即75分鐘講完本課內容。參加培訓的學生在聽完講課后,最好再回顧一遍。對于自學者來說,相對要花費差不多2倍的時間來學習這些知識點。
對于本章知識點的學習,除了要學習理論知識點以外,還應該注重實踐操作。下面的兩個小節分別從理論和實踐兩個方面來為你提出學習的要求。
1.4.2 要掌握的關鍵點
對于本節課的內容,我們應該掌握如下的關鍵點。
● Java語言排名第一,且市場占有率超過了1/5。
● Java語言的定義為:Java是一種簡單的(Simple)、面象對象的(Object-Oriented)、分布式的(Distributed)、解釋的(Interpreted)、健壯的(Robust)、安全的(Secure)、結構中立的(Architecture-neutral)、可移植的(Portable)、高性能的(High-Performance)、多線程的(Multi-Threaded)、動態的(Dynamic)語言。
● Java語言的構成為JIT、JVM、JRE、JDK,其中JIT用來執行即時編譯,JVM是Java虛擬機,JRE是Java運行時環境,JDK是Java開發工具包。
● Java的開發環境應該包括JDK和JRE,需要設置如下兩個環境變量:
$JAVA_HOME=C:\j2sdk1.6.0; $PATH=C:\j2sdk1.6.0\bin;
● Java API文檔是Java程序員的必備手冊。
● 一個簡單的Java類包括:包名、類名、變量、函數、入口函數。
● 關于HelloWorld.java的4種執行命令。
編譯:javac mypackage\HelloWorld.java。
運行:java mypackage.HelloWorld。
打包:jar cvfm HelloWorld.jar manifest.mf mypackage。
生成API:javadoc mypackage\*.java -d javadoc。
Tips
這些知識點是本節課的精華語錄,不僅要記住,還應該轉化為自己的東西。
1.4.3 課后上機作業
本節課是Java語言的第一課,重在講解Java語言的入門知識,Java開發環境的搭建,以及Java類的開發。下面我們根據本節的知識點,來布置上機作業任務,共3道題(150分鐘)。
1.安裝和配置Java開發環境(時間:60分鐘)
在http://java.sun.com/javase/downloads/index.jsp上下載JDK 6的安裝包軟件,然后執行安裝過程。要求:
● 將JDK安裝到D:盤下。
● 將JRE安裝到默認目錄C:\Program Files\Java下。
● 設置如下兩個環境變量。
$JAVA_HOME=C:\j2sdk1.6.0; $PATH=C:\j2sdk1.6.0\bin;
● 在命令行分別執行如下命令,查看配置情況。
javac -version java -version javac -help
2.學會查找Java API文檔(時間:30分鐘)
在中文API地址http://gceclub.sun.com.cn/Java_Docs/jdk6/html/zh_CN/api/index.html上查找一個類java.lang.String,顯示的界面將會如圖1-33所示。

圖1-33 查找java.lang.String的API界面
3.開發第一個Java程序(時間:60分鐘)
開發一個以你的名字命名的類,例如Liuzhongbing,包名為mypackage。該類的作用是往控制臺輸出一個字符串“Hello Liuzhongbing!”。例如下例所示:
package mypackage; /** * @author liuzhongbing lzb_box@163.com */ public class Liuzhongbing { /** * 變量 */ private String name = "Liuzhongbing"; /** * 函數 */ public void say() { System.out.println("Hello " + name + "!"); } /** * 執行入口函數 * @param args */ public static void main(String args[]) { //創建類的實例 Liuzhongbing inst = new Liuzhongbing(); //調用函數 inst.say(); } }
然后分別執行如下的4個命令來操作該類。
(1)編譯:javac mypackage\Liuzhongbing.java。
此時,將會在mypackage目錄下產生一個以你的名字命名的class文件,如Liuzhongbing.class。
(2)運行:java mypackage.Liuzhongbing。
此時,將會在控制臺輸出一個包含你名字的字符串,例如“Hello Liuzhongbing!”。
(3)打包:jar cvfm Liuzhongbing.jar manifest.mf mypackage。
Tips
manifest.mf中的主類名應該改為你新建的類名,如mypackage.Liuzhongbing。
(4)生成API:javadoc mypackage\*.java -d javadoc。
此時,打開javadoc下的index.html文件,將會在類列表中看到以你的名字命名的類,如圖1-34所示。

圖1-34 你生成的API的樣子
1.4.4 繼續下一課:JVM內存結構及其調優
回顧一下本節課的內容,共講解了13個知識點,并總結了7個關鍵點要求掌握,最后給出了3個上機任務,旨在讓讀者能夠搭建起Java的開發環境,會利用Java API文檔來查找類,并學會普通Java類的開發、編譯、運行、打包和生成API的方法。掌握了這里所提及的內容,即標志著你真正邁入Java的門檻了。
本節課使用命令行來編譯和運行類的方式是最原始的方式,但也是最基礎的方式,其他的一切高級方式都是以命令行為基礎的。一旦你掌握了命令行的方法,就可以過渡到高級開發工具來進行Java開發了。下一課我們將深入到JVM內部,講解JVM的內存結構,并進一步實戰JVM性能調優。