Java語言入門教程
引言
您有沒有想過計(jì)算機(jī)程序是怎樣工作的?您是否曾經(jīng)想學(xué)習(xí)編寫自己的計(jì)算機(jī)程序?無論您是想自己寫出游戲程序的14歲孩子,還是對計(jì)算機(jī)編程已經(jīng)好奇了20年的70歲老人,這篇文章都適合您。在本文中,我將通過教您用Java程序設(shè)計(jì)語言編程使您了解計(jì)算機(jī)程序的原理。
在講授計(jì)算機(jī)編程的知識之前,我首先做如下假設(shè):
- 我假設(shè)您目前對計(jì)算機(jī)編程一無所知。如果您已經(jīng)懂一些編程知識的話那么本文的開始部分對您來說就會顯得十分簡單。盡可放心跳過這些章節(jié),從新知識處開始學(xué)習(xí)。
- 我假設(shè)您對計(jì)算機(jī)的使用有一些了解。具體說就是我假設(shè)您已經(jīng)知道如何編輯、復(fù)制、刪除和重命名文件,以及如何獲取有關(guān)您的系統(tǒng)的信息等等。
- 為簡單起見,我假設(shè)您的機(jī)器運(yùn)行Windows95、98、2000、NT或XP操作系統(tǒng)。使用其他操作系統(tǒng)的用戶將這里學(xué)到的概念運(yùn)用到自己的系統(tǒng)中應(yīng)該也是比較容易的。
- 我假設(shè)您有學(xué)習(xí)的欲望。
進(jìn)行Java編程需要的所有工具都可以輕松在網(wǎng)上免費(fèi)獲得。網(wǎng)上還有大量的Java學(xué)習(xí)資料,所以學(xué)完本文以后您可以很容易去學(xué)習(xí)更多內(nèi)容以繼續(xù)提高水平。在這里學(xué)習(xí)的Java編程在編譯器、開發(fā)環(huán)境、閱讀材料等等上沒有任何花銷。學(xué)會了Java再學(xué)習(xí)其他的語言就變得容易了,所以這里是個(gè)不錯(cuò)的起點(diǎn)。
交待完這些事情,我們就準(zhǔn)備好了。讓我們開始吧!
編程術(shù)語
記住,我假定您不懂編程。下面是一些術(shù)語,它們將有助于您的理解:
- 計(jì)算機(jī)程序——計(jì)算機(jī)程序是一組指令,告訴計(jì)算機(jī)應(yīng)該怎么做。指令可以告訴計(jì)算機(jī)將幾個(gè)數(shù)相加,或比較兩個(gè)數(shù)字并根據(jù)比較的結(jié)果作出決定,如此之類。計(jì)算機(jī)程序只是面向計(jì)算機(jī)的一組指令而已,正如菜譜是廚師的指令,樂譜是樂師的指令一樣。計(jì)算機(jī)準(zhǔn)確地執(zhí)行這些指令的同時(shí)也就完成了有用的工作,如計(jì)算支票簿收支,或者在屏幕上顯示一個(gè)游戲,或運(yùn)行一個(gè)字處理程序。
- 編程語言——為了能使計(jì)算機(jī)辨識您給它的指令,這些指令需要以一種計(jì)算機(jī)能夠理解的語言書寫,即編程語言。有很多計(jì)算機(jī)編程語言:Fortran、Cobol、Basic、Pascal、C、C++、Java、Perl,正如有很多人類語言一樣。它們都是用不同的方式來表達(dá)類似的概念。
- 編譯器——使用人可以閱讀的編程語言(如Java)寫好程序后,還要用編譯器將其翻譯成計(jì)算機(jī)可執(zhí)行的形式。您很可能在您的計(jì)算機(jī)上見到過EXE文件。這些EXE文件就是編譯器輸出的結(jié)果。它們是可執(zhí)行文件——從人可讀的程序翻譯而成的機(jī)器可讀的程序。
使用Java語言編程就需要一個(gè)Java編譯器。下一節(jié)將指導(dǎo)您下載并安裝一個(gè)編譯器。一旦有了編譯器我們就可以開始學(xué)習(xí)編程了。下載和安裝過程將會持續(xù)幾個(gè)小時(shí),大部分時(shí)間用來下載幾個(gè)很大的文件。您還需要有大約40兆字節(jié)的空閑磁盤空間(開始前請確定有足夠的空間)。
下載Java編譯器
為了在您的機(jī)器上配置起一個(gè)Java開發(fā)環(huán)境——您將使用一個(gè)“開發(fā)環(huán)境”來“開發(fā)”(編寫)程序——您需要完成以下這些步驟:
- 下載一個(gè)包含Java開發(fā)環(huán)境(編譯器和其他工具)的大文件。
- 下載一個(gè)包含Java文檔的大文件。
- 如果您的機(jī)器上還沒有安裝WinZip(或可執(zhí)行相同功能的程序),那么您需要下載一個(gè)包含WinZip的大文件并安裝之。
- 安裝Java開發(fā)環(huán)境。
- 安裝文檔。
- 調(diào)整環(huán)境變量。
- 全面測試。
為了方便,開始前最好在您的臨時(shí)目錄中創(chuàng)建一個(gè)新目錄用于保存將要下載的文件。我們將它稱為下載目錄。
步驟1——下載Java開發(fā)環(huán)境
進(jìn)入網(wǎng)頁http://java.sun.com/j2se/1.4.2/download.html。點(diǎn)擊“下載J2SE SDK”鏈接下載SDK(軟件開發(fā)工具包)軟件。網(wǎng)頁會顯示一個(gè)許可協(xié)議。點(diǎn)擊“接受”。選擇您的操作系統(tǒng),然后將文件保存到下載目錄中。這是一個(gè)巨大的文件,用電話調(diào)制解調(diào)器下載需要好幾個(gè)小時(shí)。接下來的兩個(gè)文件也很大。
步驟2——下載Java文檔
選擇操作系統(tǒng)后點(diǎn)擊SDK1.4.1文檔的鏈接。
步驟3——下載并安裝WinZip
如果您的機(jī)器上沒有安裝某個(gè)的版本的WinZip或其他解壓縮軟件,請到網(wǎng)頁http://www.winzip.com/上下載WinZip的試用版。運(yùn)行EXE文件安裝。很快我們將使用它來安裝文檔。
步驟4——安裝開發(fā)工具包
運(yùn)行第一步下載的j2sdk-1_4_1-*.exe文件。他將自動(dòng)解壓并安裝開發(fā)工具包。
步驟5——安裝文檔
閱讀安裝說明文檔。它會要求您將文檔文件移至剛才開發(fā)工具包的安裝目錄。將文檔解壓縮,文件就會被安排到適當(dāng)?shù)奈恢谩?/P>
步驟6——調(diào)整環(huán)境變量
按照此頁的要求,您需要改變路徑變量。最簡單的辦法是打開一個(gè)MS-DOS窗口鍵入PATH看看當(dāng)前的路徑變量是什么,然后用記事本打開autoexec.bat按要求修改PATH環(huán)境變量。
步驟7——測試
現(xiàn)在您應(yīng)該可以打開另一個(gè)MS-DOS窗口并鍵入javac了。如果一切設(shè)置妥當(dāng),那么您將看到屏幕將輸出兩行文字告訴您如何使用javac。這意味著一切已經(jīng)準(zhǔn)備就緒了。如果您看到“錯(cuò)誤的命令或文件名”這條消息,則說明還沒有準(zhǔn)備好。請重新閱讀安裝說明檢查哪里出了問題。確定PATH被正確設(shè)置并可用?;仡^重新閱讀上面的步驟,問題不解決不要輕易放棄。
現(xiàn)在您已自豪地?fù)碛幸慌_能夠編譯Java程序的機(jī)器了。您已經(jīng)準(zhǔn)備好開始編寫軟件了!
順便指出,剛才您解壓縮的內(nèi)容包括一個(gè)demo(演示)目錄,其中包含許多精致的例子。所有的例子都可以立即執(zhí)行,所以您不妨找到這個(gè)目錄試運(yùn)行一下其中的某些例子。許多例子都會發(fā)聲,所以請打開揚(yáng)聲器。要運(yùn)行例子,找到名如example1.html的網(wǎng)頁文件并使用您常用的瀏覽器打開即可。
示例:創(chuàng)建一則簡單java程序
您的第一個(gè)程序?qū)⑹切∏煽蓯鄣?。它將建立一個(gè)繪圖區(qū)域并在其上繪制一條對角線。創(chuàng)建此程序您需要:
- 打開記事本鍵入(或復(fù)制粘貼)程序
- 保存程序
- 使用Java編譯器編譯程序生成一個(gè)Java程序
- 排除問題
- 建立一個(gè)HTML網(wǎng)頁“包含”剛創(chuàng)建的Java程序
- 運(yùn)行Java程序
這里是本節(jié)的示范程序:
import java.awt.Graphics;
public class FirstApplet extends java.applet.Applet
{
public void paint(Graphics g)
{
g.drawLine(0, 0, 200, 200);
}
}
步驟1——錄入程序
建立一個(gè)新目錄以保存程序。打開記事本(或其他可以創(chuàng)建TXT文件的文本編輯器)。將范例程序錄入或復(fù)制粘貼到記事本窗口中。切記:輸入程序的大小寫敏感。因此必須按照范例程序中字母的大小寫輸入。重審以上編程步驟。如果錄入內(nèi)容和范例程序不是完全一致,則程序?qū)o法正常運(yùn)行。
步驟2——保存文件
將文件在第一步創(chuàng)建的路徑下保存,文件名為FirstApplet.java。文件名大小寫敏感。請確保字母“F”和“A”大寫,其他字母小寫,如前所示。
步驟3——編譯程序
打開一個(gè)MS-DOS窗口。改變至包含F(xiàn)irstApplet.java的路徑下(cd),鍵入:
javac FirstApplet.java
記住大小寫敏感!或者編譯成功,這時(shí)屏幕不輸出任何信息,或者有錯(cuò)誤發(fā)生。若沒有錯(cuò)誤,則會在目錄里生成一個(gè)名為FirstApplet.class的文件與FirstApplet.java并列。
(請確保程序保存的文件名為FirstApplet.java而不是FirstApplet.java.txt。最簡單的辦法就是在MS-DOS窗口下鍵入dir然后查看文件名。若擴(kuò)展名是.txt 則請重命名文件去掉此擴(kuò)展名。也可以運(yùn)行Windows資源管理器在“查看”菜單下點(diǎn)擊“選項(xiàng)”。確?!半[藏已注冊的MS-DOS文件擴(kuò)展名”選項(xiàng)處于未選中狀態(tài),然后在資源管理器中查看文件名。若需要?jiǎng)t將文件改名。)
步驟4——排除問題
若有問題產(chǎn)生則想辦法解決。將您的程序與上面的范例程序?qū)Ρ?,使之完全相同。修改過程中不斷編譯程序,直到?jīng)]有錯(cuò)誤發(fā)生。若javac似乎不能工作,請回頭參照上節(jié)內(nèi)容檢修安裝的問題。
步驟5——建立HTML頁面
創(chuàng)建一個(gè)HTML頁面來包含小程序。另開一個(gè)記事本窗口。錄入下面的內(nèi)容:
將此文件存于同一目錄中,文件名為applet.htm。
步驟6——運(yùn)行程序
在您的MS-DOS窗口中鍵入:
appletviewer applet.htm
應(yīng)該可以看見一條從左上角到右下角的對角線:
|
將小程序查看器的窗口拉大一些以查看整條對角線。您也可以將此HTML網(wǎng)頁裝載到任何現(xiàn)用的瀏覽器中,如Netscape Navigator或微軟IE,看到的結(jié)果是大致相同的。
至此您已經(jīng)成功創(chuàng)建了您的第一個(gè)程序!
Java程序解析
那么剛才您到底都做了些什么呢?首先,您編寫了一個(gè)極其簡單的Java程序。該程序是能在網(wǎng)絡(luò)瀏覽器中運(yùn)行的Java程序,它和能在您的機(jī)器上獨(dú)立運(yùn)行的Java應(yīng)用程序不同。(Java應(yīng)用程序稍微復(fù)雜一些,而且也不如小程序流行,所以我們從小程序開始。)然后我們使用javac編譯了這個(gè)小程序。接著我們創(chuàng)建了一個(gè)極其簡單的網(wǎng)頁來“包含”這個(gè)小程序。最后我們用appletviewer運(yùn)行了小程序,當(dāng)然您也可以方便地使用瀏覽器運(yùn)行。
程序本身約有10行:
import java.awt.Graphics;
public class FirstApplet extends java.applet.Applet
{
public void paint(Graphics g)
{
g.drawLine(0, 0, 200, 200);
}
}
這大概是您能創(chuàng)建的最簡單的Java小程序了。要完全理解此程序您需要學(xué)習(xí)很多知識,尤其是在面向?qū)ο缶幊碳夹g(shù)的方面。既然我假定您毫無編程經(jīng)驗(yàn),因此我請您將注意力暫時(shí)集中到程序中的一行上:
g.drawLine(0, 0, 200, 200);
本程序的工作就是這一行完成的。它畫出對角線。程序的其他部分都是為這行而做的準(zhǔn)備工作,我們可以暫時(shí)忽略這些準(zhǔn)備工作。這行代碼告訴計(jì)算機(jī)從左上角(0,0)到右下角(200, 200)畫一條線。然后計(jì)算機(jī)就按照我們的指令畫線。這就是計(jì)算機(jī)編程的基本要素了!
(還要注意的是,在上面的第五步我們將HTML頁面中小程序的窗口設(shè)置為寬200高200。)
本程序中我們調(diào)用了一個(gè)drawLine方法(或稱函數(shù)),并且傳入了四個(gè)參數(shù)(0, 0, 200, 200)。該行以一個(gè)分號結(jié)束。分號的作用相當(dāng)于句子結(jié)尾的句號。該行開始處的g.說明我們調(diào)用的是特定對象g的方法drawLine(該行再上面一行表明g是屬于Graphics類的對象——我們將在本文后面具體介紹類和類的方法)。
方法就是一條命令,它告訴計(jì)算機(jī)完成某件事情。本例中的drawLine告訴計(jì)算機(jī)在指定的兩點(diǎn)(0, 0)和(200, 200)之間畫一條線。您可以認(rèn)為窗口的原點(diǎn)(0,0)位于左上角,X和Y軸的正向分別指向原點(diǎn)右側(cè)和下側(cè)。屏幕上一個(gè)點(diǎn)(像素)就是數(shù)軸上的一個(gè)單位。
|
試著用不同數(shù)字代替四個(gè)參數(shù)。改變一兩個(gè)參數(shù),保存修改,然后用javac重新編譯并用appletviewer重新運(yùn)行每次修改的結(jié)果。看看您能發(fā)現(xiàn)什么。
除了drawLine還有什么其他函數(shù)呢?可以通過查閱Graphics類的文檔來獲得信息。在您安裝Java開發(fā)工具包并將文檔文件解壓縮的過程中,一個(gè)名為java.awt.Graphics.html的文件就被安裝到了您的機(jī)器上。此文件即是Graphics類的說明文檔。這個(gè)文件在我的機(jī)器上的具體路徑是D:jdk1.1.7docsapijava.awt.Graphics.html。在您機(jī)器上這個(gè)路徑很可能會略有不同,但基本相似,這取決于您安裝的具體位置。找到此文件并打開。文件的開始部分有一節(jié)叫做“方法索引”。它列出了這個(gè)類支持的所有方法。drawLine方法是其中之一,但是還有許多別的方法。您可以畫出的內(nèi)容包括但不限于:
- 直線
- 圓弧
- 橢圓
- 多邊形
- 矩形
- 字符串
- 字符
請閱讀這些不同方法的說明并加以試驗(yàn),從中發(fā)現(xiàn)您可以用它們做什么。例如,試試下面的代碼:
g.drawLine(0, 0, 200, 200);
g.drawRect(0, 0, 200, 200);
g.drawLine(200, 0, 0, 200);
它將畫出一個(gè)有兩條對角線的方框(別忘將窗口拉大以查看全圖)。試著畫一些其他圖形。閱讀文檔并嘗試使用setColor方法改變顏色。例如:
import java.awt.Graphics;
import java.awt.Color;
public class FirstApplet extends java.applet.Applet
{
public void paint(Graphics g)
{
g.setColor(Color.red);
g.fillRect(0, 0, 200, 200);
g.setColor(Color.black);
g.drawLine(0, 0, 200, 200);
g.drawLine(200, 0, 0, 200);
}
}
注意程序的第二行增添了import語句。程序運(yùn)行的結(jié)果如下:
|
現(xiàn)在您可能在想:“他怎么知道要用Color.red而不是簡單的red,他又是怎么知道要增添第二個(gè)import行的呢?”這是通過例子學(xué)來的。因?yàn)槲覄傁蚰故玖艘粋€(gè)調(diào)用setColor方法的例子,所以您現(xiàn)在知道了要改變顏色就用Color.后接顏色的名字作為setColor方法的參數(shù),并且要在程序開始處添加適當(dāng)?shù)膇mport語句。如果您查閱setColor的文檔,可以通過一個(gè)鏈接查詢到Color類的信息,其中包括一個(gè)所有可用顏色名字的列表,還有關(guān)于創(chuàng)建新(無名)的顏色的技巧的說明。您閱讀到這些信息,將它們記在腦子里,就知道如何用Java改變顏色了。這是作為程序員的關(guān)鍵:學(xué)習(xí)技巧并記住為寫下一個(gè)程序使用。您或者通過例子(如本文中的)學(xué)習(xí)這些技巧,或者通過閱讀說明文檔,或者通過察看示例代碼(如在demo路徑下的那些)。如果您有一個(gè)喜歡發(fā)現(xiàn)、學(xué)習(xí)和記憶的大腦,那么您一定會愛上編程的!
本節(jié)中,您學(xué)習(xí)了如何編寫線性、順序執(zhí)行的代碼:從開始直到結(jié)束都由方法調(diào)用組成的代碼快。(試試在畫紅色矩形之前畫出直線——它會被矩形覆蓋掉成為不可見的。代碼行的順序很重要。)順序代碼構(gòu)成了所有計(jì)算機(jī)程序的基本核心。嘗試一下所有不同的繪制方法,看看您有什么發(fā)現(xiàn)。
程序缺陷及調(diào)試
學(xué)習(xí)編程的過程中您會注意到自己總是會犯許多錯(cuò)誤,或者想當(dāng)然做出一些錯(cuò)誤的假定,這都會使程序:1)無法通過編譯,或者2)執(zhí)行時(shí)得出奇怪的結(jié)果。程序的這些問題稱為程序缺陷(我們常說的bug),而排除它們的過程稱為調(diào)試。任何程序員約有一半的時(shí)間都花在調(diào)試程序上。
您有的是時(shí)間和機(jī)會制造自己的程序缺陷,但為了使我們對可能出現(xiàn)的各種錯(cuò)誤更加熟悉一些,現(xiàn)在讓我們?nèi)藶橹圃煲恍┏绦蛉毕?。試著刪除您的程序中某行結(jié)尾的分號,然后用javac編譯。編譯器會給出一條錯(cuò)誤消息。這叫做編譯錯(cuò)誤。您必須排除所有的編譯錯(cuò)誤才能執(zhí)行程序。試著將一個(gè)函數(shù)的名字寫錯(cuò),或者忽略一個(gè)“{”不寫,或者刪掉一行import語句等等,這些可以讓您熟悉許多種編譯錯(cuò)誤消息。初次看到某種類型的編譯錯(cuò)誤時(shí)您可能很是煩惱,但是經(jīng)過上面這樣用故意造成的已知錯(cuò)誤多次試驗(yàn)以后,您就會熟悉許多常見錯(cuò)誤了。
程序缺陷還包括執(zhí)行(或運(yùn)行時(shí))錯(cuò)誤,發(fā)生于程序可以通過編譯,但是在運(yùn)行的時(shí)候不能給出預(yù)想的輸出的情況。例如,下面代碼將繪制一個(gè)帶兩條交叉對角線的紅色矩形:
g.setColor(Color.red);
g.fillRect(0, 0, 200, 200);
g.setColor(Color.black);
g.drawLine(0, 0, 200, 200);
g.drawLine(200, 0, 0, 200);
但是下面的代碼只能產(chǎn)生紅色的矩形(兩條直線被它覆蓋了):
g.setColor(Color.black);
g.drawLine(0, 0, 200, 200);
g.drawLine(200, 0, 0, 200);
g.setColor(Color.red);
g.fillRect(0, 0, 200, 200);
兩段代碼幾乎完全一樣,但是執(zhí)行后產(chǎn)生的結(jié)果卻大不相同。如果您希望看到兩條對角線,則第二段代碼就包含了一個(gè)缺陷。
這里是另一個(gè)例子:
g.drawLine(0, 0, 200, 200);
g.drawRect(0, 0, 200, 200);
g.drawLine(200, 0, 0, 200);
上面的代碼生成一個(gè)具有黑色輪廓線和兩條對角線的方框。而下面這段代碼只產(chǎn)生一條對角線:
g.drawLine(0, 0, 200, 200);
g.drawRect(0, 0, 200, 200);
g.drawLine(0, 200, 0, 200);
同樣,如果您希望看到兩條對角線,則第二段代碼包含一個(gè)缺陷(請查看第二段代碼找出錯(cuò)誤)。這類錯(cuò)誤因其隱蔽性可能需要花很多時(shí)間才能找到。
您將有充裕的時(shí)間練習(xí)查找自己程序中的缺陷。程序員平均要花大約一半的時(shí)間進(jìn)行程序缺陷的排查。程序發(fā)生缺陷錯(cuò)誤的時(shí)候不要灰心——它們是程序員編程生涯的一個(gè)正常的組成部分。
變量
所有的程序都使用變量臨時(shí)存儲各種數(shù)據(jù)。例如,當(dāng)程序運(yùn)行到某個(gè)階段時(shí)請求用戶輸入一個(gè)數(shù)字,則您要用一個(gè)變量存儲輸入數(shù)據(jù)供以后使用。
變量必須在程序中被定義(或聲明)后才能使用,您必須為每個(gè)變量確定一個(gè)具體類型。例如,您可能聲明某變量為保存數(shù)字的類型,又聲明另一個(gè)變量為保存人名的類型。(因?yàn)镴ava要求在使用變量前顯式定義變量并聲明變量值的類型,所以Java被稱為是一個(gè)強(qiáng)類型的語言。有些語言則沒有這些要求。一般說來,在創(chuàng)建大型程序時(shí),強(qiáng)類型有助于減少程序錯(cuò)誤。)
import java.awt.Graphics;
import java.awt.Color;
public class FirstApplet extends java.applet.Applet
{
public void paint(Graphics g)
{
int width = 200;
int height = 200;
g.drawRect(0, 0, width, height);
g.drawLine(0, 0, width, height);
g.drawLine(width, 0, 0, height);
}
}
這個(gè)程序中我們聲明了兩個(gè)名為width和height的變量。我們將其類型聲明為int。一個(gè)int型的變量可以保存一個(gè)整數(shù)(如1、2、3等)。我們將兩個(gè)變量都初始化為200。我們也完全可以這樣寫:
int width;
width = 200;
int height;
height = 200;
第一種形式只是輸入起來稍快一些。
將變量賦予初值的過程稱為初始化變量。一種常見的程序錯(cuò)誤是忘記初始化變量。為重現(xiàn)此錯(cuò)誤,試刪除代碼的初始化部分(“= 200”)然后重新編譯程序觀察后果。您會看到編譯器將發(fā)現(xiàn)這個(gè)問題。順便指出,這是編譯器的一個(gè)非常好的特性。它將為您節(jié)省許多時(shí)間。
Java支持兩種變量:簡單(初級)變量和類。
int是簡單變量的類型。這種變量可以保存一個(gè)數(shù)字,此外別無他長。您只要聲明一個(gè)int變量,設(shè)置它為某個(gè)值后使用即可。另一方面,類可以包含多個(gè)成員和方法,這些方法能簡化類的使用。一個(gè)易于理解的類的好例子就是Rectangle類,讓我們從它開始。
我們一直使用的那個(gè)程序有一個(gè)局限:他總是假定窗口大小是200乘200像素。為什么我們不問問窗口“您的尺寸有多大?”,然后據(jù)此調(diào)整我們的矩形和對角線的大小呢?如果您回頭查看Graphics 類的說明文檔(java.awt.Graphics.html——那個(gè)列出了所有可用的繪圖函數(shù)的文件),您會發(fā)現(xiàn)其中有一個(gè)叫做getClipBounds的函數(shù)。點(diǎn)擊此函數(shù)名瀏覽它的完整說明。這個(gè)函數(shù)沒有參數(shù)但是會返回一個(gè)Rectangle類型的值。返回的矩形包含了繪圖區(qū)的寬度和高度。若在此文檔頁面中點(diǎn)擊Rectangle就會被轉(zhuǎn)到Rectangle類(java.awt.Graphics.html)的文檔頁面。查看頁首的變量索引您會發(fā)現(xiàn)這個(gè)類包含四個(gè)名字分別為x、y、width和height的變量。因此我們將要做的就是用getClipBounds得到代表畫板邊界的矩形,然后從這個(gè)矩形中提取寬度和高度數(shù)據(jù),將它們保存在前一個(gè)例子中創(chuàng)建的width和height變量中,如下所示:
import java.awt.Graphics;
import java.awt.Color;
import java.awt.Rectangle;
public class FirstApplet extends java.applet.Applet
{
public void paint(Graphics g)
{
int width;
int height;
Rectangle r;
r = g.getClipBounds();
width = r.width - 1;
height = r.height - 1;
g.drawRect(0, 0, width, height);
g.drawLine(0, 0, width, height);
g.drawLine(width, 0, 0, height);
}
}
當(dāng)運(yùn)行上面程序的時(shí)候您會發(fā)現(xiàn)矩形和對角線恰好充滿繪圖區(qū)域。而且改變窗口大小時(shí)矩形和對角線還會自動(dòng)重畫適應(yīng)新的窗口大小。這段代碼引入了五個(gè)新概念,讓我看一看:
- 首先,因?yàn)槲覀兪褂昧薘ectangle類,所以要在程序的第三行引進(jìn) java.awt.Rectangle。
- 我們在本程序中聲明了三個(gè)變量:兩個(gè)(width和height)int型的,一個(gè)(r)Rectangle 型的。
- 我們使用了getClipBounds函數(shù)獲得繪圖區(qū)域的大小。此函數(shù)沒有參數(shù)所以我們也就不傳入?yún)?shù)(使用“()”),但是它返回一個(gè)Rectangle。我們寫下的代碼“r = g.getClipBounds();”其意思是說:“請將返回的矩形賦值給變量 r?!?
- 變量r是Rectangle類型的,它其實(shí)包含四個(gè)變量:x、y、width和height(通過閱讀Rectangle類的說明文檔可以知道這些變量名)。要訪問它們需使用“.”(點(diǎn))操作符。因此表達(dá)式“r.width”的意思就是“從變量 r 中取出名為width的變量”。這個(gè)值被保存到我們的名為width的局部變量中。在此過程中我們減去了一個(gè)1。試試不做減法會是什么結(jié)果。再試試減去五會是什么結(jié)果。
- 最后,我們在繪圖函數(shù)中使用了width和height。
學(xué)到這里常常提出的一個(gè)問題就是:“我們真有必要聲明width和height變量嗎?”答案是否定的。我們可以在繪圖函數(shù)參數(shù)的位置直接輸入r.width - 1。創(chuàng)建變量只是為了使程序更容易閱讀,因此這是一個(gè)應(yīng)該養(yǎng)成的好習(xí)慣。
Java支持多種簡單變量類型。三種最常見的類型是:
- int——整型數(shù)值(1、2、3……)
- float——十進(jìn)制小數(shù)(如 3.14159)
- char——字符值(a、b、c……)
可以用簡單類型進(jìn)行數(shù)學(xué)運(yùn)算。Java能夠識別 +(加)、-(減)、*(乘)、/(除)和幾種其他的運(yùn)算。這里有一個(gè)在程序中使用這些運(yùn)算符的例子。假設(shè)您要計(jì)算一個(gè)半徑為3米的圓球的體積??捎孟旅娴拇a完成:
float diameter = 10;
float radius;
float volume;
radius = diameter / 2.0;
volume = 4.0 / 3.0 * 3.14159 * radius * radius * radius;
第一行運(yùn)算的意義是:“將diameter變量的值除以2.0,結(jié)果保存在radius變量中?!笨梢姟?”符號在這里的意義就是:“將右側(cè)計(jì)算的結(jié)果保存到左側(cè)的變量之中?!?/P>
如何使一個(gè)順序代碼塊重復(fù)地執(zhí)行
計(jì)算機(jī)尤其擅長的工作之一就是進(jìn)行重復(fù)的計(jì)算或操作。在前面的幾節(jié)中我們看到了如何編寫“順序代碼塊”,所以下面我們將討論如何使一個(gè)順序代碼塊重復(fù)地執(zhí)行。
例如,我讓您畫出下面的圖形:
|
不妨先畫出所有的水平線,像這樣:
|
繪制這些線的一種方法是編寫一個(gè)順序代碼塊:
import java.awt.Graphics;
public class FirstApplet extends java.applet.Applet
{
public void paint(Graphics g)
{
int y;
y = 10;
g.drawLine(10, y, 210, y);
y = y + 25;
g.drawLine(10, y, 210, y);
y = y + 25;
g.drawLine(10, y, 210, y);
y = y + 25;
g.drawLine(10, y, 210, y);
y = y + 25;
g.drawLine(10, y, 210, y);
y = y + 25;
g.drawLine(10, y, 210, y);
y = y + 25;
g.drawLine(10, y, 210, y);
y = y + 25;
g.drawLine(10, y, 210, y);
y = y + 25;
g.drawLine(10, y, 210, y);
}
}
(對于一些新程序員來說,“y = y + 25;”這條語句初看起來很奇怪。它的意思是說:“將變量y當(dāng)前的值加上25,結(jié)果仍存回到y(tǒng)。”因此如果在該行執(zhí)行之前y的值是10,則該行執(zhí)行后y的值將立即變成35。)
看過以上代碼的多數(shù)人會立刻注意到有兩行代碼被一遍遍重復(fù)了。在我們這個(gè)特例中,重復(fù)現(xiàn)象還不是很嚴(yán)重。但可以想像如果需要繪制包含上千個(gè)行和列的網(wǎng)格時(shí),用這種方法編程將會是多么勞累。解決此問題的辦法就是循環(huán),如下所示:
import java.awt.Graphics;
public class FirstApplet extends java.applet.Applet
{
public void paint(Graphics g)
{
int y;
y = 10;
while (y <= 210)
{
g.drawLine(10, y, 210, y);
y = y + 25;
}
}
}
運(yùn)行程序時(shí)您會看到它會繪制九條200像素長的水平線。
while語句是Java中的一種循環(huán)語句。該語句告訴Java按照如下方式工作:執(zhí)行到while語句時(shí),Java查看括號中的表達(dá)式后判斷:“y是否小于等于210?”
- 如果答案是肯定的,Java將進(jìn)入用花括號({})包圍的代碼塊。循環(huán)發(fā)生在代碼塊的結(jié)尾處。當(dāng)Java執(zhí)行到結(jié)尾的花括號時(shí)就返回到前面的while語句處回答同樣的問題。這種循環(huán)過程可能要進(jìn)行許多次。
- 如果答案是否定的,Java將跳過用花括號包圍的代碼塊繼續(xù)執(zhí)行。
因此您可以看到,程序開始運(yùn)行時(shí)y的初值是10。10小于210,所以Java進(jìn)入花括號代碼塊,繪制從(10,10)到(210, 10)的直線,將y設(shè)為35,然后回溯到while語句。35小于210,所以Java進(jìn)入花括號代碼塊,繪制從(10,35)到(210, 35)的直線,將y設(shè)為60,然后回溯到while語句。此過程一直重復(fù)直到y(tǒng)終于超過了210,然后程序結(jié)束。
在程序中加入第二個(gè)循環(huán)即可完成網(wǎng)格的繪制,如下所示:
import java.awt.Graphics;
public class FirstApplet extends java.applet.Applet
{
public void paint(Graphics g)
{
int x, y;
y = 10;
while (y <= 210)
{
g.drawLine(10, y, 210, y);
y = y + 25;
}
x = 10;
while (x <= 210)
{
g.drawLine(x, 10, x, 210);
x = x + 25;
}
}
}
可見一個(gè)while語句包含三部分:
- 一個(gè)初始化步驟,將y設(shè)為10。
- 一個(gè)求值步驟,在while語句的括號中。
- while語句的某處會有一個(gè)增量步驟,遞增y的值。
Java支持另一種比while語句更為緊湊的方式完成同樣的工作。這就是for語句。如果您有如下的while語句:
y = 10;
while (y <= 210)
{
g.drawLine(10, y, 210, y);
y = y + 25;
}
那么等價(jià)的for語句看起來就是這樣子:
for (y = 10; y <= 210; y = y + 25)
{
g.drawLine(10, y, 210, y);
}
可見for語句的全部工作是將初始化、求值和增量步驟精簡到一個(gè)短行之中。它只是縮短了您編寫代碼的長度,僅此而已。
關(guān)于循環(huán)順便提出下面兩點(diǎn)值得注意的地方:
- 許多情況下將y初始化為210然后在循環(huán)中每次遞減25同樣是很容易的。求值部分的問題將變?yōu)椋骸皔是否大于等于10?”您可以選擇兩種方法中的任何一種。多數(shù)人覺得用加法比用減法更舒服一些。但您可能有不同的感覺。
- 增量步驟十分重要。假如您無意間漏寫了循環(huán)中“y=y+25;”這行,于是y的值將不會改變——它總是等于10。因此它永遠(yuǎn)不會超過210,循環(huán)也就會無限地進(jìn)行下去(直到你關(guān)閉計(jì)算機(jī)或程序窗口時(shí)才停止)。這種情況稱為無限循環(huán),是一種常見的編程錯(cuò)誤。
作為循環(huán)的練習(xí),試編寫代碼繪制下面的圖形:
|
評論
查看更多