- 零基礎(chǔ)學Java(第4版)
- 常建功 陳浩 黃淼等編著
- 1628字
- 2019-01-01 00:49:41
第一篇 Java語言語法基礎(chǔ)——面向過程知識
第1章 Java技術(shù)概覽
Java是一種出色的面向?qū)ο罂缙脚_編程語言。在當今的軟件領(lǐng)域幾乎無處不見Java語言活躍的身影,然而Java語言究竟是什么?本章將從兩個方面解釋Java的“身世”——Java既是一種編程語言,也是一個軟件平臺。本章還將從多個方面分析Java到底能為我們做什么。
本章重點:
□ Java語言的功能和特點。
□ 學習創(chuàng)建簡單的Java程序。
□ 學會處理常見的Java編譯錯誤。
1.1 Java技術(shù)
Java既是編程語言也是軟件平臺,作為編程語言的Java有一套自己的機制,實現(xiàn)源程序到處理器可執(zhí)行程序間的過渡與轉(zhuǎn)換;作為軟件平臺,Java為程序員提供了編程接口和Java虛擬機(Java Virtual Machine,JVM),下面將依次介紹。
1.1.1 認識Java語言
Java作為一種高級語言具有許多優(yōu)良特性,如跨平臺、面向?qū)ο蟆⒎植际健⒍嗑€程、安全性、健壯性、簡單性等;這些優(yōu)良的特性在讀者學習完本書后會深有體會。
在Java語言中所有源代碼都可以通過無格式的記事本編寫,并保存為.java文件,因為通過該擴展名,Java編譯器會知道該文件是自己可以處理的文件。經(jīng)過編譯后的文件為.class文件,該文件是字節(jié)碼文件,此時.class文件不能被處理器直接讀取執(zhí)行,必須通過虛擬機轉(zhuǎn)換成二進制文件后,才可以被處理器執(zhí)行。圖1-1是Java程序的開發(fā)過程,整個過程說明了上面敘述的內(nèi)容。

圖1-1 Java程序的開發(fā)過程
Java是跨平臺的高級編程語言,這里的平臺是指操作系統(tǒng)平臺,如Windows、UNIX、Mac、Linux等。使用Java語言編寫的程序一次編譯就可以在所有上述平臺上運行,就是因為有Java虛擬機的存在。Sun公司(已被Oracle公司收購)提供了在各種操作系統(tǒng)平臺上運行安裝的Java虛擬機,Java虛擬機可以執(zhí)行.class文件。這樣也就實現(xiàn)了眾所周知的“一次編譯,隨處運行”的理想。圖1-2演示了在不同平臺上通過Java虛擬機執(zhí)行Java程序的過程,從中可以清楚地理解Java虛擬機的作用。

圖1-2 不同平臺上通過JVM執(zhí)行Java程序
注意
圖1-2中的“HelloWorld.class”也代表一個應(yīng)用程序,應(yīng)用程序本身就是經(jīng)過打包的.class文件的集合。并且在不同的平臺上安裝的JVM是不同的,需要到官方網(wǎng)站上下載適合自己機器操作系統(tǒng)平臺的虛擬機。
1.1.2 認識Java平臺
Java語言也是一種軟件平臺。平臺可以理解為軟件運行所需的軟件或硬件環(huán)境,如操作系統(tǒng)可以看作軟件平臺,它提供了應(yīng)用程序運行的環(huán)境,如在Windows XP操作系統(tǒng)上運行Word字處理程序。當然如果從用戶的角度看,操作系統(tǒng)其實是軟件和硬件相結(jié)合的綜合平臺,因為操作系統(tǒng)對硬件的操作該用戶是看不見的,但是操作系統(tǒng)又確實管理并運行在硬件平臺上。
而Java語言作為軟件平臺,為Java源程序編寫和運行提供了完善的環(huán)境。但是該Java提供的軟件平臺不與硬件發(fā)生任何關(guān)系,該平臺是純軟件平臺,運行在操作系統(tǒng)上。不同的操作系統(tǒng)編寫了相應(yīng)的JVM。作為軟件平臺的Java由兩部分組成:
□ Java虛擬機(Java Virtual Machine,JVM):Java虛擬機是Java軟件平臺的基礎(chǔ),基于不同操作系統(tǒng)的平臺對應(yīng)不同的虛擬機。
□ Java應(yīng)用編程接口(Java API):API是一套編寫好的軟件組件的集合,這些API按照功能通過包(package)來提供,包就是一系列具有相似功能的類和接口的集合。圖1-3是Java虛擬機和應(yīng)用編程接口與各種操作系統(tǒng)的軟件層次關(guān)系。

圖1-3 Java API和Java虛擬機
說明
在操作系統(tǒng)上加一層Java虛擬機,使得Java實現(xiàn)了平臺的獨立性,但是這也使得Java程序比C或C++語言編寫的程序要慢一點,但是隨著編譯器的改進以及虛擬機技術(shù)的成熟,二者之間的差距會越來越小。
1.1.3 Java語言的功能
Java語言作為完善而強大的軟件平臺,每個版本的Java平臺都會提供如下的功能或組件。
1.開發(fā)工具
開發(fā)工具提供了諸如編譯、執(zhí)行、調(diào)試、文檔化等功能,使得開發(fā)人員可以使用這些工具來編譯、調(diào)試自己的程序。初學者經(jīng)常使用的Java工具有Javac源程序編譯工具、Java程序執(zhí)行工具和Javadoc源程序的文檔化工具等,具體的功能將在本章后面介紹。讀者將會了解如何使用Javac和其他Java工具。
說明
Javac編譯工具其實就是在DOS下運行的一個命令,而DOS命令不區(qū)分大小寫,所以本章有時候在DOS窗口中輸入命令的時候,也直接說是javac命令。
2.應(yīng)用編程接口(APⅠ)
Java API提供了Java語言的核心功能,開發(fā)人員可以直接調(diào)用這些方法或?qū)崿F(xiàn)其中的接口來滿足自己程序設(shè)計的需要,如需要對數(shù)據(jù)進行排序或搜索,Java提供了具體的類來實現(xiàn),開發(fā)人員只要了解這些類的基本功能和類中的方法就可以調(diào)用這些功能。讀者可以翻閱JDK的HTML文檔來搜索自己需要的功能。
3.用戶接口工具集
其實這個工具集就是提供如何編寫用戶接口程序(即GUI程序),為應(yīng)用程序提供一個友好的用戶界面,任何復雜的程序界面都可以通過該工具集中的類或接口實現(xiàn),具體請參看本書的第20章。
4.集成類庫
該類庫提供了集成工具來完成復雜的行為,如Java為訪問數(shù)據(jù)庫提供了JDBC API;為實現(xiàn)遠程方法提供了Java RMI,該方法實現(xiàn)了對網(wǎng)絡(luò)遠端的Java程序的調(diào)用,是Java實現(xiàn)分布式計算的重要基礎(chǔ)。
1.1.4 Java語言的優(yōu)點
Java語言與其他語言(如C++、Delphi、C#等語言)相比,有自己的優(yōu)勢,無論你學習Java的初衷如何,Java語言確實使你的程序更友好,并且減少了你的工作量。下面將介紹Java語言的優(yōu)點以證實上述說法。
1.入門更快
因為Java語言是一門強大的面向?qū)ο笳Z言,所以只要理解面向?qū)ο蠹夹g(shù)(符合人類處理事情時的思維方式),就很容易學習這門語言。如果讀者已經(jīng)學習過C++語言或C語言,將更容易進入Java世界。
2.代碼量少,開發(fā)速度更快
同C++語言比較,同樣的程序使用Java語言編寫只需要較少的類和方法。Java語言比C++語言簡單,相同功能的程序需要更少的代碼行。
3.編碼更容易
Java語言提供良好的編碼規(guī)范,使得Java語言編寫的程序具有統(tǒng)一的“外表”,并且Java支持垃圾回收機制(GC),所以不會像C++中那樣出現(xiàn)內(nèi)存泄漏的問題,這樣開發(fā)人員就可以集中精力編寫程序所需的類,而不用考慮何時、如何回收這些類對象了,只要在需要時創(chuàng)建對象即可,其他操作都由GC處理。Java的面向?qū)ο筇匦浴avaBeans組件架構(gòu)和功能強大的API,都使得開發(fā)人員可以容易地重用經(jīng)過嚴格測試的代碼,這些API的使用也減少了程序中Bug的數(shù)量。
4.避免平臺依賴,程序的平臺獨立性
Java語言編寫的類庫可以在其他平臺上的Java應(yīng)用程序中使用,而不像C++語言必須依賴于Windows平臺。Java源程序被編譯成字節(jié)碼,字節(jié)碼通過操作系統(tǒng)平臺上的JVM來解釋而獲得運行,這樣使用Java語言編寫的程序不依賴于特定的平臺,實現(xiàn)“一次編寫,隨處運行”。
1.1.5 Java分布式應(yīng)用和多線程的特點
本節(jié)講述Java程序的分布式和多線程的特點。分布式包括數(shù)據(jù)分布和操作分布。數(shù)據(jù)分布是指數(shù)據(jù)可以分散在網(wǎng)絡(luò)的不同主機上,操作分布是指把一個計算分散在不同的主機上處理。
Java支持客戶機/服務(wù)器計算模式,因此它支持這兩種分布。對于數(shù)據(jù)分布,Java提供了一個叫做URL的對象,利用這個對象,可以打開并且訪問具有相同URL的對象,訪問方式與訪問本地文件系統(tǒng)相同。對于操作分布,Java的Applet小程序可以從服務(wù)器下載到客戶端,即部分計算在客戶端進行,提高系統(tǒng)執(zhí)行效率。有關(guān)分布式的原理如圖1-4所示。

圖1-4 分布式示意圖
Java提供了一整套網(wǎng)絡(luò)類庫,開發(fā)人員可以利用這些類庫進行網(wǎng)絡(luò)程序設(shè)計,方便地實現(xiàn)Java的分布式特性。
線程是操作系統(tǒng)的一種新概念,線程又被稱作輕量進程,是比傳統(tǒng)進程更加小的,并且可以并發(fā)執(zhí)行的單位。C和C++采用單線程系統(tǒng)結(jié)構(gòu),而Java提供了多線程的支持。
Java在兩方面支持多線程。一方面,Java環(huán)境本身就是多線程的。若干個系統(tǒng)線程運行,負責必要的無用單元回收、系統(tǒng)維護等系統(tǒng)級操作;另一方面,Java語言內(nèi)置多線程控制,可以大大簡化多線程應(yīng)用程序的開發(fā)。
Java提供了一個Thread類,由它負責啟動、運行、終止線程,并且可以檢查線程狀態(tài)。Java線程還包括一組同步原語,這些原語負責對線程實行并發(fā)控制。利用Java的多線程編程接口,開發(fā)人員可以方便地寫出支持多線程的應(yīng)用程序,從而提供程序執(zhí)行的效率。Java的多線程在一定程度上受運行時所在平臺的限制,如果操作系統(tǒng)不支持多線程,那么Java程序的多線程特性就不能表現(xiàn)出來。
1.1.6 Java程序的可靠性、安全性
本節(jié)將詳細講述Java的可靠性和安全性。Java最初的設(shè)計目的是針對電子類消費品中的應(yīng)用,因此要求較高的可靠性。Java雖然源于C++,但它消除了許多C++不可靠的因素,可以防止許多編程錯誤。
它的可靠性和安全性表現(xiàn)在如下幾點:
□ Java是強類型的語言,要求顯式的方法聲明。這保證了編譯器可以發(fā)現(xiàn)方法調(diào)用錯誤,保證程序更加可靠。
□ Java不支持指針,這杜絕了內(nèi)存的非法訪問。
□ Java的自動單元收集功能,可以防止內(nèi)存“丟失”等動態(tài)內(nèi)存分配導致的問題。
□ Java解釋器運行時實施檢查,可以發(fā)現(xiàn)數(shù)組和字符串訪問的越界問題。
□ Java提供了異常處理機制。
由于Java主要用于網(wǎng)絡(luò)應(yīng)用程序開發(fā),因此對安全性有較高的要求。如果沒有安全保證,用戶從網(wǎng)絡(luò)下載執(zhí)行程序就非常危險。Java通過自己的安全機制,防止了病毒程序的產(chǎn)生,以及下載程序?qū)Ρ镜叵到y(tǒng)的威脅破壞。
當Java字節(jié)碼進入解釋器時,首先必須經(jīng)過字節(jié)碼校驗器的檢查,然后Java解釋器將決定程序中類的內(nèi)存布局。隨后,類裝載器負責把來自網(wǎng)絡(luò)的類裝載到單獨的內(nèi)存區(qū)域,避免應(yīng)用程序之間相互干擾破壞。最后,客戶端用戶還可以限制從網(wǎng)絡(luò)上裝載的類只能訪問某些文件系統(tǒng)。上述幾種機制結(jié)合起來,使得Java成為安全的編程語言。
1.1.7 Java小程序和應(yīng)用程序
用Java可以寫兩種類型的程序:小程序和應(yīng)用程序。小程序就是嵌入在網(wǎng)頁文檔中的Java程序,而應(yīng)用程序就是在命令行中運行的程序。對Java而言,對小程序的大小和復雜性都沒有限制。事實上,Java小程序有些方面比Java應(yīng)用程序更加強大。目前,由于Internet的通信速度有限,因此大多數(shù)小程序規(guī)模較小。小程序和應(yīng)用程序之間的技術(shù)差別就在于運行環(huán)境。
Java應(yīng)用程序運行在最簡單的環(huán)境中,它的唯一外部輸入就是命令行參數(shù)。而Java小程序需要來自Web瀏覽器的大量信息,它需要知道何時啟動、何時放入瀏覽器窗口、何處和何時激活與關(guān)閉等。由于這兩種不同的執(zhí)行環(huán)境,小程序和應(yīng)用程序的最低要求不同。
1.2 Windows下的“HelloWorld”應(yīng)用程序
到本節(jié)為止,筆者還沒有介紹如何編寫Java程序。當然程序的編寫、編譯和執(zhí)行都需要一定的軟件環(huán)境或編輯工具,所以在寫Java程序前需要做些準備工作,最基本的即需要兩個軟件,一個是JDK(Java開發(fā)工具集),另一個是文本編輯工具。在1.2.1節(jié)將介紹這兩個軟件,在1.2.2節(jié)將介紹創(chuàng)建一個Java應(yīng)用程序的步驟。
1.2.1 創(chuàng)建應(yīng)用程序的軟件環(huán)境
JDK即Java開發(fā)工具集,就是為開發(fā)Java程序提供了一套工具,包括源程序的編譯、調(diào)試、運行等工具,并提供了一些API接口工具。讀者可以到Oracle網(wǎng)站下載JDK并安裝使用,這部分內(nèi)容在本章的后面會有更詳細的介紹,這里讀者只需要知道開發(fā)Java程序需要安裝JDK即可。
對于初學者而言,編寫Java源代碼的工具最好選擇無格式的文本編輯器,Windows自帶的記事本就是很好的Java源程序編寫工具。可以打開Windows平臺的記事本,如圖1-5所示。單擊“開始”|“運行”命令,在彈出的“運行”對話框內(nèi)輸入“notepad”命令,然后單擊“確定”按鈕就會打開記事本。

圖1-5 打開Windows平臺的記事本工具
1.2.2 創(chuàng)建“HelloWorld”應(yīng)用程序的步驟
【實例1-1】本節(jié)通過一個實例介紹開發(fā)Java應(yīng)用程序的步驟,該實例程序為HelloWorld.java,它的功能很簡單,就是在標準輸出端打印字符串“HelloWorld!”。下面演示創(chuàng)建步驟。
說明
本例只是介紹Java程序創(chuàng)建、編譯、運行的整個流程,并不需要讀者親自動手,讀者可以在看完第2章的JDK安裝和設(shè)置后再來創(chuàng)建本例練習。
1.創(chuàng)建源程序文件
該文件包含使用Java語言編寫的代碼,當然這些代碼要符合Java規(guī)范。可以使用任意的文本編輯器來創(chuàng)建Java源程序文件。實例程序如下所示。
01 /** 02 HelloWorld類的功能是在標準輸出端 03 打印一行輸出“HelloWorld!” 04 */ 05 public class HelloWorld{{ //定義類 06 public static void main(String[] args){{ //主方法 07 System.out.println(“HelloWorld!”); //調(diào)用標準輸出打印字符串 08 } 09 }
【代碼說明】
□ 第1~4行是Java的注釋語句,這里實現(xiàn)了多行注釋的效果。
□ 第5行是類的標識class。
□ 第7行是輸出語句。語句后面又使用了“//”表示Java的單行注釋。
把在文本編輯器(筆者使用Windows的記事本)中編寫的程序另存為“HelloWorld.java”文件,保存源文件為.java文件的過程如圖1-6所示。

圖1-6 保存源文件為.java文件
注意
保存的文件名一定為“HelloWorld.java”,保存類型選擇“文本文檔(*.txt)”,而編碼選擇ANSI,單擊“保存”按鈕,然后退出記事本編輯器。記住保存目錄,在編譯時需要該目錄來指定源文件所在的位置。
2.編譯源程序
首先選擇“開始”|“運行”命令,然后在彈出的“運行”對話框內(nèi)輸入“cmd”命令,則打開一個DOS窗口。該窗口的目錄提示為當前目錄,該目錄通常是Windows XP的主目錄,如圖1-7所示。

圖1-7 DOS窗口
為了編譯文件,需要改變當前目錄到源文件存放的目錄下,如源文件在C盤的javacode目錄下,則需要在當前DOS提示符下輸入“cd C:\javacode”,再按Enter鍵,則當前的DOS提示符會變?yōu)镃:\javacode。但是如果源文件目錄與當前DOS目錄不在同一個磁盤上,如在D盤,則需要首先輸入“D:”,再按Enter鍵,則DOS提示符會進入D盤,再輸入源文件的路徑,按Enter鍵則進入源文件目錄。圖1-8是切換到源文件目錄的狀態(tài)。

圖1-8 切換到源文件目錄
為了檢驗是否進入了源文件所在目錄,在圖1-7所示的目錄下輸入“dir”命令,發(fā)現(xiàn)了剛才保存的HelloWorld.java文件。圖1-9是查看當前目錄下的文件。

圖1-9 查看當前目錄下的文件
現(xiàn)在可以編譯源程序了,在圖1-7所示的當前目錄下輸入命令“javac HelloWorld.java”來編譯源文件,一旦編譯成功,則在當前目錄下會生成HelloWorld.class文件,在DOS提示符下輸入“dir”命令查看,會發(fā)現(xiàn)新生成的.class文件。圖1-10是查看.class文件的效果。

圖1-10 查看.class文件
說明
調(diào)用javac命令的前提是已經(jīng)安裝了JDK并且設(shè)置了環(huán)境變量,將JDK提供的工具命令告知Windows系統(tǒng)。直到Windows系統(tǒng)知道到哪里尋找用戶輸入的javac命令。JDK環(huán)境變量的設(shè)置請參考第2章中的設(shè)置,為了節(jié)約篇幅這里不再贅述。
3.運行源程序
在編譯完程序后需要運行程序,運行程序很簡單,在當前目錄下輸入“java HelloWorld”命令,這里的HelloWorld就是剛才編寫的類的名字。執(zhí)行結(jié)果如圖1-11所示。

圖1-11 HelloWorld程序執(zhí)行結(jié)果
讀者如果看到如圖1-11所示的執(zhí)行結(jié)果,說明HelloWorld程序執(zhí)行成功了。在本例的源程序中,讀者或許有很多疑惑,如main()函數(shù)起什么作用?該函數(shù)的參數(shù)又如何使用?為什么可以直接調(diào)用System.out.println(“HelloWorld”)?等,這些疑惑將在下一節(jié)詳細解釋。
1.3 深入探討“HelloWorld”應(yīng)用程序
本節(jié)將詳細介紹HelloWorld源程序,在1.2節(jié)讀者已經(jīng)看到如何編寫、編譯和執(zhí)行Java源程序。但是讀者或許想知道源程序到底是如何運行的。為了更好地說明,這里再次列出該代碼程序。
01 /**
02 HelloWorld類的功能是在標準輸出端
03 打印一行輸出“HelloWorld!”
04 */
05 public class HelloWorld{
06 public static void main(String[] args){
07 System.out.println("HelloWorld!"); //調(diào)用標準輸出打印字符串
08 }
09 }
該源程序包括三個部分:程序注釋、類定義和main()方法。通過對這三部分的說明,讀者應(yīng)該理解程序HelloWorld的基本執(zhí)行過程。至于更細節(jié)的內(nèi)容,后面的章節(jié)會繼續(xù)講解。
1.3.1 注釋源代碼
在程序中有這樣的注釋部分,如以下代碼所示:
01 /** 02 HelloWorld類的功能是在標準輸出端 03 打印一行輸出“HelloWorld!” 04 */
這是Java的注釋部分,其格式是“/**注釋*/”,程序會忽略注釋的內(nèi)容。
良好的注釋可以增強程序的可讀性和可維護性,讀者應(yīng)該養(yǎng)成注釋的習慣。Java支持三種注釋方式。
1)雙斜線“//”在程序中表示注釋,注釋的字句不會編譯,即編譯器會略過該行。如:
System.out.println("Hello Java!!!"); //在DOS窗口打印一行字符:Hello Java!!!
“//”表示單行注釋,一般用在代碼行的后面。
2)另一種注釋方式實現(xiàn)多行注釋,使用“/*多行注釋內(nèi)容*/”這種方式。如:
01 /*定義一個類 02 該類是示例程序,程序提供了一個入口,執(zhí)行結(jié)果是在DOS窗口打印一行字符串 03 “Hello Java!!!” 04 */
3)內(nèi)嵌式文檔注釋。該類注釋多用在集成開發(fā)環(huán)境下,如JBuilder、Eclipse等,其方式如下:
01 /** 02 注釋內(nèi)容 03 */
該注釋可以出現(xiàn)在類和接口的聲明前、各種方法(函數(shù))的定義前。在集成開發(fā)環(huán)境中,只要輸入“/**”,再按回車鍵,就會自動形成注釋的樣式。
1.3.2 實現(xiàn)類定義
下面代碼的粗體字部分是類定義部分,其語法格式是class classname{code},其中關(guān)鍵字class聲明這是一個類,后面緊跟類名HelloWorld,用兩個大括號括起來的部分是類定義的主體部分。
01 /** 02 HelloWorld類的功能是在標準輸出端 03 打印一行輸出“HelloWorld!” 04 */ 05 public class HelloWorld{ //定義類 06 public static void main(String[] args){ //主方法 07 System.out.println("HelloWorld!"); //調(diào)用標準輸出打印字符串 08 } 09 }
【代碼說明】上述代碼中第1~4行為注釋代碼,第5行定義了一個名為HelloWorld的類,在第6~8行定義類的主方法,該方法于第7行實現(xiàn)打印字符串“HelloWorld!”。
具體的類介紹可以參考第7章,這里讀者只需要理解該應(yīng)用程序從一個類定義開始即可。
1.3.3 詳解main()方法
使用Java語言編寫的應(yīng)用程序必須包含一個main()方法,它的格式如下所示:
public static void main(String[] args)
修飾符public和static的順序可以互換,但是根據(jù)Java慣例把public放在前面,參數(shù)名args不是固定的,開發(fā)者可以任意命名,但是習慣上選擇使用args或argv。
main()方法是應(yīng)用程序的入口,一個程序執(zhí)行時會首先從類的main()方法開始,再啟動程序所需要的其他資源。main()方法接收一個字符串數(shù)據(jù)參數(shù),實際上該參數(shù)提供了運行時系統(tǒng)向應(yīng)用程序提供參數(shù)的途徑。當然也可以不傳遞任何參數(shù)。如果一個應(yīng)用程序可以讀取一系列文件,則需要把這些文件的絕對路徑告訴該程序。該參數(shù)是命令行參數(shù),即在調(diào)用java ClassName時使用,方式為java ClassName args。
筆者在編譯HelloWorld程序時沒有輸入?yún)?shù),該應(yīng)用程序忽視了該參數(shù)。但是讀者一定要注意確實存在這樣的參數(shù),也允許調(diào)用這樣的參數(shù)為應(yīng)用程序所用。
1.4 常見疑難解答
對于初學者而言,在Java程序的開發(fā)、編譯和執(zhí)行過程中,都會或多或少遇到問題,如環(huán)境變量設(shè)置不正確,源程序的語法錯誤、語義錯誤,或在程序編譯、運行期發(fā)生錯誤等。如果這些錯誤或問題不能得到適當?shù)奶幚恚敲磿Τ鯇W者造成很大的障礙。本節(jié)將介紹幾種常見的錯誤,以使讀者在學習過程中少走彎路。
1.4.1 環(huán)境變量設(shè)置錯誤
在編譯并運行Java應(yīng)用程序之前,需要設(shè)置環(huán)境變量,其目的是使Windows系統(tǒng)可以知道DOS窗口中運行的Java工具可執(zhí)行程序,如Javac源程序編譯工具等。圖1-12說明Windows操作系統(tǒng)無法發(fā)現(xiàn)Javac編譯程序。

圖1-12 無法找到Javac可執(zhí)行程序
當然如果已經(jīng)安裝了JDK,則可以在DOS提示符下輸入Javac的絕對路徑,通過絕對路徑來識別該命令的位置。如果采用JBuilder 9自帶的JDK,那么目錄為C:\JBuilder9\jdk1.5\bin。也可以在源文件的當前路徑下輸入“C:\JBuilder9\jdk1.5\bin\Javac HelloWorld.java”。顯然這種方式很煩瑣,因為每次編譯源文件都要輸入一串路徑和命令信息。讀者可以通過2.1節(jié)掌握如何設(shè)置JDK環(huán)境變量。
1.4.2 語法錯誤
Java語言規(guī)范設(shè)計了語法規(guī)則,但是如果疏漏了部分內(nèi)容,違反了Java的語法規(guī)則,編譯器會發(fā)出語法錯誤消息,該消息包含錯誤類型、發(fā)生錯誤的代碼在程序中的位置(以該錯誤代碼行號為標識)等,并且在錯誤處標識一個“^”。出現(xiàn)語法錯誤如圖1-13所示。

圖1-13 語法錯誤
在HelloWorld.java源程序中將語句System.out.println(“HelloWorld!”)后的分號去掉,使得程序語句缺少結(jié)束標志,這就違反了Java語法規(guī)則。在編譯期發(fā)生任何類型的錯誤都會導致無法生成.class文件。所以此時需要讀者仔細分析錯誤類型,細致檢查程序中的錯誤,直到源程序順利通過編譯。
1.4.3 語義錯誤
編譯器也會發(fā)現(xiàn)語義錯誤。編譯器無法識別一個標識的語義,如發(fā)現(xiàn)一個未定義的變量、錯誤輸入了系統(tǒng)類庫的類名等。圖1-14演示了一個語義錯誤,筆者故意將語句System的首字母改為小寫,使編譯器無法識別,從而輸出語義錯誤。

圖1-14 語義錯誤
注意
Java程序區(qū)分大小寫。
1.4.4 運行時錯誤
運行時錯誤指在執(zhí)行程序過程中發(fā)生的錯誤,如某個類沒有實例化而造成空指針、無法找到指定的類文件等。下面介紹三種初學者常見的運行時錯誤。
1.無法發(fā)現(xiàn)類文件
在用戶編譯或執(zhí)行Java程序時,由于種種原因可能輸入了不正確的類名,使得編譯器或虛擬機無法發(fā)現(xiàn)該文件所在位置。類文件名輸入錯誤如圖1-15所示。

圖1-15 類文件名輸入錯誤
在圖1-15中,筆者想運行HelloWorld程序,但是輸入了錯誤的類名HelloWorldd,所以執(zhí)行系統(tǒng)拋出Java.lang.NoClassDefFoundError錯誤。
使用Java工具會啟動Java虛擬機,此時系統(tǒng)會首先在當前目錄下尋找類文件,如果沒有則默認到操作系統(tǒng)的系統(tǒng)環(huán)境變量ClassPath中搜索,所以讀者也可以在該變量中設(shè)置需要編譯的類文件所在的目錄。
注意
變量的設(shè)置方式可以參考2.1.2節(jié)設(shè)置ClassPath環(huán)境變量。
2.類名輸入錯誤
對于初學者而言,很容易出現(xiàn)的一個錯誤是使用Java執(zhí)行程序時,往往會輸入類文件名如HelloWorld.class,這是不允許的,此時會拋出異常,類名輸入錯誤如圖1-16所示。

圖1-16 類名輸入錯誤
注意
在調(diào)用Java工具執(zhí)行程序時,需要在其后輸入類名而不是類文件名,如輸入Java HelloWorld才是正確的方式。
3.無法發(fā)現(xiàn)main()方法
在1.3節(jié)已經(jīng)知道,任何Java應(yīng)用程序執(zhí)行的類中必須有main()方法,該方法是程序的入口,以后才可以繼續(xù)調(diào)用程序所需的各種其他資源。如果在類中沒有定義main()方法或該方法書寫錯誤,都會導致如圖1-17所示的缺少main()方法錯誤。

圖1-17 缺少main()方法錯誤
筆者在HelloWorld.java源程序中修改了main()方法的名字,繼續(xù)編譯并執(zhí)行該程序,虛擬機將無法裝載該類,因為無法發(fā)現(xiàn)類HelloWorld的程序入口。
1.4.5 初學者如何選擇Java參考書
一個程序員如果沒有半米多高的技術(shù)書堆,就沒有人會認為他是真正的程序員。如何從眼花繚亂的開發(fā)叢書中找到適合自己的書,也是一門學問。
書評:比較成功的書籍在上市的前后,都會有名家撰寫的書評,這些書評包括對該書積極一面的評價,也有對書中內(nèi)容的指摘,通過正反兩面的對照,相信可以幫助初學者做出購買的選擇。
道聽途說:口碑的重要性在現(xiàn)代社會中日益突出,如果真是一本好書,可能會在不同場合,聽到不同的人對它給予相同的贊許,這就是該書的價值了。
不要忘記舊書攤:這不是在鼓勵懷舊,而事實是老書的質(zhì)量和作者的寫書態(tài)度實在是嚴謹又端正得多,這就是老書的好處。對于多次印刷的書,也是值得考慮購買的對象,多版本說明作者對該書的精益求精和新技術(shù)的更新,同時也反映了該書在市場的受歡迎程度。
預先閱覽:最好的當然是自己能夠預先瀏覽,從朋友那里借也好,在網(wǎng)上看看電子版也好,覺得自己喜歡,或是覺得有收藏的價值,再進行購買。
1.5 小結(jié)
相信本章的學習不會耗費初學者多少腦力,但是作為學習一門語言的起步階段,讀者僅僅是看到Java語言的冰山一角,所以希望讀者在輕松理解本章內(nèi)容后能建立學習Java語言的信心,并保持這樣的狀態(tài)繼續(xù)下面章節(jié)的學習。
本章要求讀者初步理解Java語言作為編程語言和作為軟件平臺的特性。對于1.3節(jié)深入探討“HelloWorld”應(yīng)用程序要用心體會,掌握一個應(yīng)用程序的基本結(jié)構(gòu)。因為本章還沒有講解環(huán)境配置等關(guān)鍵設(shè)置,所以并不建議讀者動手學習,只需要了解Java程序從創(chuàng)建到執(zhí)行的流程,以及Java程序中一些小的關(guān)鍵代碼等即可。
1.6 習題
一、填空題
1.Java虛擬機的英文全稱是______________,簡稱是______________。
2.常見的Java注釋格式有3種:______________________、______________________和______________。
3.使用Java語言編寫的應(yīng)用程序必須包含一個______________方法。
二、上機實踐
1.創(chuàng)建一個名為WelcomeJava的類,在該類中輸出“歡迎進入學習Java之門”的字符串,并對代碼每一行進行注釋。
【提示】關(guān)鍵代碼如下:
public static void main(String[] args) { /* 從控制臺輸出信息 */ System.out.println("歡迎進入學習Java之門"); }
2.創(chuàng)建一個名為LoginOut的類,在該類中實現(xiàn)輸出如圖1-18所示的效果。

圖1-18 運行效果
【提示】關(guān)鍵代碼如下:
public static void main(String[] args) { /*從控制臺輸出信息*/ System.out.println("************************************\n"); System.out.println("1. 登錄系統(tǒng)"); System.out.println("2. 退出\n"); System.out.println("************************************"); }
- Java 開發(fā)從入門到精通(第2版)
- C語言程序設(shè)計立體化案例教程
- Getting Started with NativeScript
- iOS開發(fā)實戰(zhàn):從入門到上架App Store(第2版) (移動開發(fā)叢書)
- Java程序設(shè)計與項目案例教程
- OpenMP核心技術(shù)指南
- 單片機原理及應(yīng)用技術(shù)
- Natural Language Processing with Python Quick Start Guide
- 監(jiān)控的藝術(shù):云原生時代的監(jiān)控框架
- 計算機應(yīng)用基礎(chǔ)(第二版)
- LabVIEW入門與實戰(zhàn)開發(fā)100例(第4版)
- C語言程序設(shè)計實驗指導與習題精解
- 前端程序員面試算法寶典
- Visual FoxPro數(shù)據(jù)庫程序設(shè)計
- Swift 2 Blueprints