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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

圖1-18 運(yùn)行效果
【提示】關(guān)鍵代碼如下:
public static void main(String[] args) { /*從控制臺(tái)輸出信息*/ System.out.println("************************************\n"); System.out.println("1. 登錄系統(tǒng)"); System.out.println("2. 退出\n"); System.out.println("************************************"); }
- 數(shù)據(jù)庫(kù)系統(tǒng)原理及MySQL應(yīng)用教程(第2版)
- PHP動(dòng)態(tài)網(wǎng)站程序設(shè)計(jì)
- SQL Server 2012數(shù)據(jù)庫(kù)技術(shù)及應(yīng)用(微課版·第5版)
- 程序員面試算法寶典
- TypeScript項(xiàng)目開(kāi)發(fā)實(shí)戰(zhàn)
- The Complete Coding Interview Guide in Java
- Learning ArcGIS for Desktop
- 深度學(xué)習(xí):Java語(yǔ)言實(shí)現(xiàn)
- 微服務(wù)架構(gòu)深度解析:原理、實(shí)踐與進(jìn)階
- 零基礎(chǔ)Java學(xué)習(xí)筆記
- 并行編程方法與優(yōu)化實(shí)踐
- CodeIgniter Web Application Blueprints
- Maven for Eclipse
- Clojure Data Structures and Algorithms Cookbook
- 趣味掌控板編程