




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
0.1任務(wù)一開(kāi)發(fā)環(huán)境0.2任務(wù)二編寫(xiě)程序的基礎(chǔ)0.3任務(wù)三構(gòu)建簡(jiǎn)單操作菜單0.4任務(wù)四圖形界面與事件處理0.5任務(wù)五文件讀/寫(xiě)操作學(xué)習(xí)情境0程序設(shè)計(jì)語(yǔ)言基礎(chǔ)本學(xué)習(xí)情境將學(xué)習(xí)《數(shù)據(jù)結(jié)構(gòu)與算法項(xiàng)目化教程》中Java程序設(shè)計(jì)所需要的語(yǔ)言知識(shí)和技能,目標(biāo)是為后續(xù)的學(xué)習(xí)情境準(zhǔn)備充足的工具基礎(chǔ)。0.1任務(wù)一開(kāi)發(fā)環(huán)境0.1.1子任務(wù)1下載開(kāi)發(fā)軟件
1.下載Java
Development
Kit(JDK)第1步:連接因特網(wǎng),搜索Sun公司的網(wǎng)站地址并進(jìn)入Java開(kāi)發(fā)軟件下載界面,或直接在瀏覽器地址欄輸入“/javase/downloads/index.jsp”,如圖0-1所示。圖0-1Java開(kāi)發(fā)軟件下載界面第2步:?jiǎn)螕簟癑avaDownload”圖標(biāo),由于不同時(shí)期的下載操作略有不同,因此可按提示進(jìn)行操作,完成下載工作。第3步:將下載后的文件復(fù)制到適當(dāng)?shù)拇疟P(pán)目錄中,以方便管理。
2.下載集成開(kāi)發(fā)工具NetBeansIDE第1步:進(jìn)入如圖0-1所示的界面。第2步:?jiǎn)螕簟癗etBeansDownload”圖標(biāo),按提示進(jìn)行操作,完成下載工作。第3步:將下載后的文件復(fù)制到適當(dāng)?shù)拇疟P(pán)目錄中,以方便管理。0.1.2子任務(wù)2JDK的安裝和配置
1.JDK安裝第1步:雙擊已下載的Java
Development
Kit(JDK)安裝文件jdk-6u21-windows-i586.exe,單擊“下一步”按鈕,進(jìn)入圖0-2所示的安裝選項(xiàng)窗口。第2步:?jiǎn)螕簟案摹卑粹o,進(jìn)入修改安裝目錄的窗口,如圖0-3所示,修改C盤(pán)為D盤(pán)(或其他盤(pán),當(dāng)然也可以不必修改安裝目錄)。之后單擊“確定”按鈕,返回原來(lái)界面,單擊“下一步”按鈕安裝JavaSEDevelopment
Kit(Java虛擬機(jī),用于開(kāi)發(fā)與運(yùn)行Java程序)。圖0-2安裝選項(xiàng)圖0-3改變安裝目錄第3步:進(jìn)行jre(JavaRuntimeEnvironment,即Java運(yùn)行環(huán)境)的安裝,與第2步類(lèi)似,更改安裝目錄后單擊“下一步”按鈕即可開(kāi)始安裝。安裝結(jié)束后,單擊“完成”按鈕,即可完成JDK的安裝。
2.JDK的配置完成JDK安裝后,還要進(jìn)行Windows環(huán)境配置,操作步驟如下:第1步:用資源管理器打開(kāi)JDK的安裝目錄,如圖0-4中鼠標(biāo)所指,選中地址欄中“D:\ProgramFiles\Java”后,右擊鼠標(biāo),選擇“復(fù)制”(將安裝目錄復(fù)制到剪貼板)。圖0-4JDK的安裝目錄第2步:右擊“我的電腦”(桌面或資源管理器均可)→選擇“屬性”→選擇“高級(jí)”選項(xiàng)卡,單擊“環(huán)境變量”按鈕,單擊上半窗口中的“新建”按鈕。第3步:在“新建用戶(hù)變量”對(duì)話(huà)框中,在“變量名”的編輯框中輸入“JAVA_HOME”,在“變量值”編輯框中點(diǎn)擊鼠標(biāo)右鍵,選擇“粘貼”,再單擊“確認(rèn)”,完成JAVA_HOME的配置。說(shuō)明:這個(gè)配置可以直接用鍵盤(pán)輸入,但是用“復(fù)制+粘貼”命令速度更快,且不容易出錯(cuò)。注意:環(huán)境中的“變量值”應(yīng)以用戶(hù)實(shí)際安裝目錄為準(zhǔn)。輸入字母和字符應(yīng)該是半角字符,不能是全角字符。第4步:在“環(huán)境變量”窗口中的下半窗口中查找變量“Path”并選中,結(jié)果如圖0-5所示,單擊“編輯”按鈕,在“變量值”的編輯框中,將光標(biāo)移到最后,先輸入一個(gè)半角分號(hào)(;),接著,如圖0-6所示,復(fù)制Java的實(shí)際安裝目錄“D:\ProgramFiles\Java\jdk1.6.0_21\bin”,并粘貼到剛輸入的分號(hào)之后的位置,最后單擊“確定”按鈕,完成Path設(shè)置。說(shuō)明:這個(gè)配置同樣可以直接用鍵盤(pán)輸入,但是用“復(fù)制+粘貼”命令速度更快,且不容易出錯(cuò)。注意:環(huán)境中的“變量值”應(yīng)以用戶(hù)實(shí)際安裝目錄為準(zhǔn),輸入字母和字符應(yīng)該是半角字符,不能是全角字符。圖0-5選中系統(tǒng)變量中的Path圖0-6復(fù)制Java命令文件目錄第5步:?jiǎn)螕魣D0-5Windows環(huán)境變量窗口中的“確定”按鈕,返回到Windows屬性窗口,單擊“確定”按鈕。到此完成Java的運(yùn)行環(huán)境配置。第6步:驗(yàn)證是否正確安裝及配置:如圖0-7所示,單擊Windows的“開(kāi)始”按鈕→選擇“運(yùn)行”菜單,在運(yùn)行對(duì)話(huà)框中輸入“cmd”,如圖0-8所示,單擊“確定”按鈕。進(jìn)入DOS操作窗口,在鍵盤(pán)上鍵入“javac”后,按回車(chē)鍵,運(yùn)行結(jié)果如圖0-9所示;在鍵盤(pán)上鍵入“java”后,按回車(chē)鍵,運(yùn)行結(jié)果如圖0-10所示。此時(shí),表示JDK安裝和配置均正確,可以進(jìn)行Java開(kāi)發(fā)了。圖0-7Windows開(kāi)始菜單圖0-8運(yùn)行命令對(duì)話(huà)框圖0-9運(yùn)行javac命令正確結(jié)果圖0-10運(yùn)行java命令正確結(jié)果0.1.3子任務(wù)3NetBeansIDE的安裝和配置
1.安裝NetBeansIDE安裝NetBeansIDE前計(jì)算機(jī)系統(tǒng)中需先安裝有JDK,如果沒(méi)有安裝JDK,系統(tǒng)會(huì)提醒用戶(hù)并退出。操作步驟如下:第1步:雙擊NetBeansIDE安裝文件NetBeansIDE-6.9-ml-windows.exe,進(jìn)行安裝,如圖0-11所示,單擊“下一步”按鈕,再單擊“我接受許可證協(xié)議中的條款”,當(dāng)出現(xiàn)打勾之后單擊“下一步”按鈕。圖0-11NetBeansIDE開(kāi)始安裝界面第2步:可以修改安裝目錄或按默認(rèn)的目錄安裝NetBeansIDE,如圖0-12所示,單擊“下一步”按鈕;同樣修改安裝目錄或按默認(rèn)的目錄安裝GlassFish,單擊“下一步”按鈕。第3步:?jiǎn)螕簟鞍惭b”按鈕,開(kāi)始NetBeansIDE的安裝。安裝結(jié)束后,如果“安裝NetBeansIDE后對(duì)其進(jìn)行注冊(cè)”選項(xiàng)的勾選去掉,就可以略去注冊(cè)過(guò)程。單擊“完成”按鈕完成NetBeansIDE安裝。
2.配置NetBeansIDE
NetBeansIDE安裝后,其運(yùn)行環(huán)境已自動(dòng)配置好,不必另行配置。圖0-12NetBeansIDE安裝目錄0.1.4子任務(wù)4編寫(xiě)及運(yùn)行程序
1.編寫(xiě)一個(gè)Java程序第1步:運(yùn)行NetBeansIDE界面,如圖0-13所示,單擊“文件”→選擇“新建項(xiàng)目”。第2步:類(lèi)別選擇“Java”→項(xiàng)目選擇“Java應(yīng)用程序”,單擊“下一步”按鈕,如圖0-14所示。第3步:進(jìn)入“新建Java應(yīng)用程序”窗口,在“名稱(chēng)和位置”中的“項(xiàng)目名稱(chēng)”輸入“dsjava”創(chuàng)建主類(lèi)”輸入“SayHello”,如圖0-15所示,單擊“完成”按鈕,自動(dòng)生成源程序框架。第4步:如圖0-16所示,只需輸入“System.out.println("你好!");”。圖0-13NetBeansIDE界面圖0-14新建項(xiàng)目圖0-15新建Java應(yīng)用程序圖0-16代碼編寫(xiě)第5步:編譯與運(yùn)行Java程序,方式如下:
(1)運(yùn)行項(xiàng)目。
按快捷鍵F6。
單擊工具欄上的“運(yùn)行主項(xiàng)目”綠色三角形圖標(biāo)。
單擊菜單欄“運(yùn)行”→選擇“運(yùn)行項(xiàng)目”。
(2)運(yùn)行文件。
按快捷鍵Shift+F6。
單擊菜單欄“運(yùn)行”→選擇“運(yùn)行文件”。如果程序正確,則可得到圖0-17所示的結(jié)果,輸出“你好!”。圖0-17運(yùn)行結(jié)果
DOS環(huán)境下的JDK平臺(tái)、NetBeansIDE平臺(tái)都同樣可以實(shí)現(xiàn)Java程序的編寫(xiě)和運(yùn)行。NetBeansIDE是集成的開(kāi)發(fā)環(huán)境,編輯、編譯和運(yùn)行集成一體,操作直觀、方便、省時(shí)且效率高;JDK編輯需用其他編輯軟件在DOS環(huán)境下編譯和運(yùn)行,操作起來(lái)比較繁雜。其他開(kāi)發(fā)工具(如Eclipse、MyEclipse、JBuilder等)也是Java開(kāi)發(fā)的優(yōu)秀平臺(tái),都能實(shí)現(xiàn)程序開(kāi)發(fā),相當(dāng)多的學(xué)習(xí)者和工作者都選擇此方式進(jìn)行項(xiàng)目開(kāi)發(fā)。因?yàn)榛贜etBeansIDE平臺(tái)的操作更為直觀和方便,所以本教程使用NetBeansIDE平臺(tái)。0.2任務(wù)二編寫(xiě)程序的基礎(chǔ)從面向?qū)ο蟮慕嵌葋?lái)看,世界上的人或事都是一個(gè)個(gè)的具體對(duì)象。Java是面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言,那么Java如何描述對(duì)象并通過(guò)程序來(lái)實(shí)現(xiàn)呢?通過(guò)分析研究對(duì)象具有的共同行為、共同屬性之后,將對(duì)象抽象為類(lèi),對(duì)象的行為就是類(lèi)的方法,屬性就是類(lèi)的成員。開(kāi)發(fā)或編寫(xiě)Java程序的一般方法和步驟如下:
(1)在問(wèn)題分析后構(gòu)建類(lèi)(可以選擇繼承系統(tǒng)或自己開(kāi)發(fā)的類(lèi))。
(2)由類(lèi)創(chuàng)建對(duì)象。
(3)調(diào)用對(duì)象中的方法。方法有行為,即可以實(shí)現(xiàn)一定功能,而類(lèi)的成員在創(chuàng)建對(duì)象后就成為對(duì)象的屬性,只能由方法根據(jù)需要進(jìn)行設(shè)置(setter)或取出(getter),也就是讀/寫(xiě)操作。本任務(wù)主要學(xué)習(xí)數(shù)據(jù)類(lèi)型、包、構(gòu)建類(lèi)、創(chuàng)建對(duì)象、封裝、繼承、接口和抽象等。0.2.1子任務(wù)1創(chuàng)建隨機(jī)數(shù)在數(shù)據(jù)結(jié)構(gòu)與算法的實(shí)現(xiàn)過(guò)程中經(jīng)常要遇到創(chuàng)建隨機(jī)數(shù)。本子任務(wù)主要學(xué)習(xí)其最基本的知識(shí)和操作:數(shù)據(jù)類(lèi)型、包、構(gòu)建類(lèi)、創(chuàng)建對(duì)象、調(diào)用方法。
1.?dāng)?shù)據(jù)類(lèi)型
Java需先聲明數(shù)據(jù)成員或變量的數(shù)據(jù)類(lèi)型后才能使用,有以下兩種方式可供選擇:
聲明并賦初值。格式:數(shù)據(jù)類(lèi)型數(shù)據(jù)成員名(變量名)?=?初值;使用:數(shù)據(jù)成員名(變量名)?=?值;
只聲明未賦值。格式:數(shù)據(jù)類(lèi)型數(shù)據(jù)成員名(變量名);使用:數(shù)據(jù)成員名(變量名)?=?值;下面簡(jiǎn)要介紹幾種常用的數(shù)據(jù)類(lèi)型。
(1)整型數(shù)(int):整型數(shù)表示沒(méi)有小數(shù)的數(shù)值,允許是負(fù)數(shù),占4個(gè)字節(jié)。例如:
inti;
(2)浮點(diǎn)數(shù)(float或double):浮點(diǎn)數(shù)用于表示有小數(shù)部分的數(shù)值。java提供兩種浮點(diǎn)數(shù):?jiǎn)尉萬(wàn)loat占4個(gè)字節(jié),雙精度double占8個(gè)字節(jié)。例如:
floatweight;或 doublecalculator;
(3)字符串類(lèi)型(String):Java程序中的多個(gè)字符串連在一起(如"abc123"),字符串是一個(gè)類(lèi),屬于引用數(shù)據(jù)類(lèi)型。例如:
Stringstr="abc";
(4)字符類(lèi)型(char):用UTF-16編碼描述的一個(gè)代碼單元。只有當(dāng)確實(shí)有必要在程序中對(duì)UTF-16代碼單元進(jìn)行操作時(shí)才可以使用char類(lèi)型。例如:
charx='X';
chardata[]={‘a(chǎn)’,‘b’,‘c’};
//字符數(shù)組
(5)布爾類(lèi)型(boolean):boolean只有兩個(gè)值false和true,用來(lái)判斷邏輯條件,而且這兩個(gè)值不能與整型數(shù)值進(jìn)行轉(zhuǎn)換。例如:
booleanflag="true";
2.包包(package)其實(shí)就是Windows中的文件夾。為了更好地組織類(lèi),Java提供了包機(jī)制。包是類(lèi)的容器,用于分隔類(lèi)名空間。Java有一個(gè)默認(rèn)的無(wú)名包,在NetBeans中顯示為<缺省包>,就是源程序src文件夾。編寫(xiě)Java程序時(shí)可以使用package指明源文件中的類(lèi)屬于哪個(gè)具體的包。包中一般包含相關(guān)的類(lèi)。例如,本教程各學(xué)習(xí)情境各建一個(gè)包(文件夾),以便管理程序代碼文件。如圖0-18所示,在項(xiàng)目中選擇“源包”并右擊,選擇“新建”,再選擇“Java包”,在彈出對(duì)話(huà)框中的“包名”編輯框中輸入“ch0ProgramBase”,點(diǎn)擊“確定”按鈕,完成建包。圖0-18新建Java包
3.構(gòu)建類(lèi)和創(chuàng)建對(duì)象在本教程中經(jīng)常會(huì)用到隨機(jī)數(shù),所以下面介紹產(chǎn)生隨機(jī)數(shù)的最簡(jiǎn)單方法。選擇剛建好的包c(diǎn)h0ProgramBase,右擊選擇“新建”并選擇“Java類(lèi)”,類(lèi)名為RandomNumber,點(diǎn)擊“確定”按鈕生成一個(gè)RandomNumber類(lèi),該類(lèi)的文件是RandomNumber.java,在項(xiàng)目src\ch0ProgramBase文件夾中,如圖0-19所示。圖0-19RandomNumber.java文件及位置
(1)在RandomNumber.java中創(chuàng)建一個(gè)產(chǎn)生隨機(jī)整數(shù)的類(lèi)createRandom。①聲明一個(gè)整型私有成員random。
privateintrandom;②創(chuàng)建一個(gè)產(chǎn)生隨機(jī)數(shù)的方法getRandom(),該方法中調(diào)用Java的Math類(lèi)產(chǎn)生隨機(jī)數(shù)方法Math.random(),將產(chǎn)生一個(gè)小于1的double類(lèi)型的隨機(jī)數(shù),所以乘以n再轉(zhuǎn)化為整型,將得到0~n范圍內(nèi)的整數(shù)。
(2)在主方法main()中創(chuàng)建createRandom類(lèi)的對(duì)象。假設(shè)命名為cr,調(diào)用對(duì)象cr的方法就可以得到隨機(jī)數(shù)。完整的程序代碼如下:
packagech0ProgramBase; //包聲明
classcreateRandom{
privateintrandom; //聲明私有整型成員random
publicintgetRandom(){ //產(chǎn)生隨機(jī)方法
random=(int)(Math.random()*20); //產(chǎn)生隨機(jī)數(shù)
returnrandom;
//返回隨機(jī)數(shù)
}
}
publicclassRandomNumber{
publicstaticvoidmain(String[]args){
createRandomcr=newcreateRandom(); //創(chuàng)建對(duì)象
System.out.println(cr.getRandom()); //使用Random()方法獲得對(duì)象中的數(shù)據(jù)并輸出
}
}每次運(yùn)行將得到0~20內(nèi)的一個(gè)不同隨機(jī)數(shù),請(qǐng)學(xué)習(xí)者自行驗(yàn)證。0.2.2子任務(wù)2封裝與修飾符
1.封裝封裝(encapsulation)是指隱藏對(duì)象的屬性和實(shí)現(xiàn)細(xì)節(jié),僅對(duì)外公開(kāi)接口,并控制在程序中屬性的讀/寫(xiě)和修改。目的是增強(qiáng)安全性和簡(jiǎn)化編程,使用者不必了解其具體的實(shí)現(xiàn)細(xì)節(jié),而只是要通過(guò)方法(外部接口),以特定的訪問(wèn)權(quán)限來(lái)使用類(lèi)的成員。
2.可訪問(wèn)控制符訪問(wèn)權(quán)限控制是通過(guò)可訪問(wèn)控制符來(lái)實(shí)現(xiàn)的。上例中,語(yǔ)句privateintrandom;?就是將random定義為私有成員,所以外部類(lèi)不能通過(guò)cr.random(對(duì)象.成員)來(lái)訪問(wèn)讀或?qū)懺摮蓡T,只能通過(guò)getRandom()來(lái)讀取random,因?yàn)間etRandom()方法是public。學(xué)習(xí)者可以將random的可訪問(wèn)控制符private(私有)改為public(公有),則可以直接用“對(duì)象.成員”來(lái)訪問(wèn)成員random,但這會(huì)造成不安全,所以建議使用private??稍L問(wèn)控制符以及訪問(wèn)權(quán)限如表0-1所示。表0-1可訪問(wèn)控制符定義類(lèi)的成員訪問(wèn)權(quán)限
3.創(chuàng)建getter和setter使用private來(lái)修飾成員,必然會(huì)產(chǎn)生訪問(wèn)的不便,所以Java提供了getter()和setter()兩個(gè)可以自動(dòng)產(chǎn)生的方法來(lái)讀取和設(shè)置成員屬性值。例如,類(lèi)BiTreeNode.java只要定義了三個(gè)private成員,如下所示:
packagech5Tree;
publicclassBiTreeNode{ //二叉樹(shù)節(jié)點(diǎn)
privateStringdata; //二叉樹(shù)節(jié)點(diǎn)的值
privateBiTreeNodelchild; //二叉樹(shù)的左孩子
privateBiTreeNoderchild; //二叉樹(shù)的右孩子
}就可以在代碼界面內(nèi)右擊(或從菜單欄)選擇“重構(gòu)”→“封裝字段”,這時(shí)彈出如圖0-20所示界面。圖0-20封裝字段getter和setter單擊打勾之后,單擊“重構(gòu)”按鈕就可以完成三個(gè)getter()和三個(gè)setter()方法。有多少成員(不論公有或私有),就有多少對(duì)應(yīng)的getter()和setter(),可以全部打勾或根據(jù)需要打勾即可,非??旖莺头奖恪R话愠蓡T定義為私有,利用getter()和setter()進(jìn)行存或取。字段封裝的getter和setter操作必須掌握。
4.Java修飾符修飾符是用于限定類(lèi)型以及類(lèi)型成員申明的一種符號(hào),前面可訪問(wèn)控制符public和private就是兩個(gè)修飾符。Java修飾符見(jiàn)表0-2。本教程重點(diǎn)學(xué)習(xí)public、private、static、abstract四個(gè)修飾符的使用。表0-2Java修飾符0.2.3子任務(wù)3Java程序編寫(xiě)規(guī)范開(kāi)始編寫(xiě)程序時(shí),就要認(rèn)真注意Java程序編寫(xiě)規(guī)范。按照編寫(xiě)規(guī)范的要求,養(yǎng)成良好的編碼習(xí)慣是非常重要的。
1.命名慣例
Java程序設(shè)計(jì)中,涉及命名的有包、類(lèi)、接口、方法、變量和常量等。通常命名慣例如下:
(1)包:名詞或名詞性詞組,全部小寫(xiě);一般使用本公司/組織網(wǎng)站域名的逆序,后跟具體的軟件內(nèi)部模塊名。例如:
packagecom.sun.java;或packagecom.mycompany.db;
(2)類(lèi):名詞或名詞性詞組,每個(gè)單詞首字母大寫(xiě);一般不使用縮寫(xiě),除非其縮寫(xiě)更通用和便于理解。例如:
publicclassSeqList
(3)接口:同“類(lèi)”的命名規(guī)則。例如:
publicinterfaceQueue
(4)方法:動(dòng)詞或動(dòng)詞性詞組,首字母小寫(xiě),第二個(gè)及以后的單詞首字母大寫(xiě)。例如:
initiate();displayData();
(5)變量:名詞或名詞性詞組,首字母小寫(xiě),第二個(gè)及以后的單詞首字母大寫(xiě);不提倡使用下畫(huà)線“_”和美元符“$”作為變量開(kāi)頭;單詞間可以使用下畫(huà)線分隔;變量名不宜過(guò)長(zhǎng)但也應(yīng)有意義,除非是臨時(shí)使用(例如只涉及幾行代碼)后即丟棄的情況,不建議使用單個(gè)字母做變量名,常用的臨時(shí)使用的變量名包括表示整數(shù)的i、j、k、m、n和表示字母的c以及表示異常對(duì)象的e等。例如:
intage;StringstudentName;Exceptione;
(6)常量:名詞或名詞性詞組,每個(gè)單詞的首字母大寫(xiě);單詞間使用下畫(huà)線來(lái)分隔。例如:
intMAX_VALUE;double
Comm_Tax;
2.文件內(nèi)部組織
(1)建議一個(gè)源文件中只定義一個(gè)Java類(lèi)或接口,無(wú)論該類(lèi)或接口是否被聲明為public,文件名都以其來(lái)命名,源文件中各成分的出現(xiàn)順序如下:①開(kāi)始的注釋。②package語(yǔ)句。③import語(yǔ)句。④類(lèi)/接口聲明。
(2)在一個(gè)Java類(lèi)中,各種成分的排列順序本無(wú)嚴(yán)格規(guī)定,也沒(méi)有特別通用的慣例,為便于掌握,給出一個(gè)推薦的順序:①屬性聲明。②構(gòu)造方法聲明。③static語(yǔ)句。④普通方法聲明。⑤main方法聲明。⑥內(nèi)部類(lèi)的聲明。
3.分隔和縮進(jìn)在NetBeans開(kāi)發(fā)環(huán)境下,只要選擇菜單“源”→“格式”,或同時(shí)按Alt?+?Shift?+?F組合鍵,就可按規(guī)范化格式自動(dòng)排列好源代碼,具體的要求不再詳述。
4.聲明語(yǔ)句建議每行聲明一個(gè)變量,并盡量在聲明變量的同時(shí)對(duì)其進(jìn)行初始化,除非其初值尚不確定。局部變量應(yīng)在其所在的方法或語(yǔ)句塊的開(kāi)頭集中聲明,而不應(yīng)隨用隨聲明。0.2.4子任務(wù)4方法的重載和覆蓋
1.方法重載本節(jié)子任務(wù)2中的程序中已經(jīng)可以產(chǎn)生隨機(jī)數(shù)了,范圍是0~20。如果要求產(chǎn)生其他范圍的隨機(jī)數(shù),可以修改代碼但這個(gè)方法當(dāng)然不好,最好是編寫(xiě)一個(gè)能夠讓用戶(hù)設(shè)置范圍的方法。如果還要求產(chǎn)生小數(shù)的隨機(jī)數(shù),那只能再編寫(xiě)新的方法??赡苓€需要滿(mǎn)足其他類(lèi)似又不同的要求,就會(huì)有一系列的方法,這就涉及方法的取名??梢悦麨椋悍椒?、方法2……。實(shí)際上,Java提供一個(gè)更好辦法,那就是方法重載。方法重載(overloadingmethod)是讓類(lèi)以統(tǒng)一的方式處理不同類(lèi)型數(shù)據(jù)的一種手段。Java的方法重載,就是在類(lèi)中可以創(chuàng)建多個(gè)方法:它們具有相同的方法名字,但具有不同的參數(shù)個(gè)數(shù)或參數(shù)個(gè)數(shù)相同但類(lèi)型不同。注意:方法的返回類(lèi)型、修飾符可以相同,也可不同,所以不能用返回類(lèi)型或修飾符來(lái)區(qū)別不同方法。調(diào)用方法時(shí)通過(guò)傳遞給它們的不同個(gè)數(shù)或個(gè)數(shù)相同但類(lèi)型不同的參數(shù)來(lái)決定具體使用哪個(gè)方法,這也是多態(tài)性的表現(xiàn)。編寫(xiě)產(chǎn)生不同隨機(jī)數(shù)要求的三個(gè)方法:無(wú)參產(chǎn)生小數(shù)隨機(jī)數(shù),一個(gè)參數(shù)產(chǎn)生該范圍的整型隨機(jī)數(shù),兩個(gè)起止參數(shù)產(chǎn)生起止范圍的隨機(jī)數(shù)。與RandomNumber.java不同,以下編碼中,沒(méi)有聲明random成員,直接返回產(chǎn)生的隨機(jī)數(shù)。RandomNumber3.java完整的程序代碼如下:
packagech0ProgramBase; //包聲明
classRandom3{
publicdoubleRandom3(){ //產(chǎn)生小數(shù)隨機(jī)方法
returnMath.random(); //返回隨機(jī)數(shù)
}
publicintRandom3(intend){ //產(chǎn)生end以?xún)?nèi)隨機(jī)方法
return(int)(Math.random()*end);
}
publicintRandom3(intbegin,intend){ //產(chǎn)生begin至end隨機(jī)方法
return(int)(begin+Math.random()*(end-begin));
}
}
publicclassRandomNumber3{
publicstaticvoidmain(String[]args){
Random3cr3=newRandom3(); //創(chuàng)建對(duì)象
//調(diào)用Random()方法獲得隨機(jī)數(shù)輸出
System.out.println("產(chǎn)生小數(shù)的隨機(jī)數(shù):"+cr3.Random3());
System.out.println("產(chǎn)生0-20的隨機(jī)數(shù):"+cr3.Random3(20));
System.out.println("產(chǎn)生50-100的隨機(jī)數(shù):"+cr3.Random3(50,100));
}
}
2.構(gòu)造方法構(gòu)造方法與一般方法的區(qū)別如下:
(1)構(gòu)造方法的名字必須與所在的類(lèi)名完全相同,沒(méi)有返回類(lèi)型,甚至連void也沒(méi)有。
(2)構(gòu)造方法的調(diào)用是在創(chuàng)建一個(gè)對(duì)象時(shí)使用new操作自動(dòng)進(jìn)行的,一般不能顯式調(diào)用。構(gòu)造方法的任務(wù)是初始化對(duì)象。
(3)除public和protect外,不能用static、final、synchronized、abstract和native等修飾符修飾。構(gòu)造方法不能被子類(lèi)繼承。
(4)構(gòu)造方法可以被重載。沒(méi)有參數(shù)的構(gòu)造方法稱(chēng)為默認(rèn)構(gòu)造方法,可以根據(jù)需要構(gòu)建帶若干個(gè)參數(shù)的構(gòu)造方法。
(5)每個(gè)類(lèi)可以有零個(gè)或多個(gè)構(gòu)造方法。與一般的方法一樣,構(gòu)造方法可以進(jìn)行任何活動(dòng),但是經(jīng)常將其設(shè)計(jì)為進(jìn)行各種初始化活動(dòng)(比如初始化對(duì)象)的屬性。構(gòu)造方法是很常用的方法,后面會(huì)介紹SingleLinkList類(lèi)及其他各種類(lèi)的構(gòu)造方法,此處不再贅述。
3.方法覆蓋方法覆蓋(overridingmethod)也稱(chēng)方法重寫(xiě),用于子類(lèi)和父類(lèi)的場(chǎng)合。
Java中,子類(lèi)可繼承父類(lèi)中的方法,而不需要重新編寫(xiě)相同的方法。但有時(shí)子類(lèi)并不想原封不動(dòng)地繼承父類(lèi)的方法,而是想做一定的修改,這就需要采用方法的重寫(xiě)。若子類(lèi)中的方法與父類(lèi)中的某一方法具有相同的方法名、返回類(lèi)型和參數(shù)表,則新方法將覆蓋原有的方法。如需父類(lèi)中原有的方法,可使用super關(guān)鍵字,該關(guān)鍵字引用了當(dāng)前類(lèi)的父類(lèi)。
Java系統(tǒng)中提供了toString()方法將其他類(lèi)型的數(shù)據(jù)轉(zhuǎn)換為字符串,如果想改變轉(zhuǎn)換后的格式,就可以覆蓋該方法。如類(lèi)SeqStack.java就覆蓋了Java系統(tǒng)提供的toString()方法,代碼如下(注意此代碼不能作為單獨(dú)程序運(yùn)行,而是要被其他調(diào)用才能起作用):
@Override
publicStringtoString(){ //返回棧中各數(shù)據(jù)的字符串
Stringstr="[";
if(this.top!=-1){
str+=this.value[this.top].toString();
}
for(inti=this.top-1;i>=0;i--){
str+=","+this.value[i].toString();
}
returnstr+"]";
}下面即將開(kāi)始學(xué)習(xí)繼承、接口、抽象等概念,這些內(nèi)容理論性較強(qiáng),比較抽象,也比較難理解,但在面向?qū)ο蟮某绦蛟O(shè)計(jì)中占有非常重要的地位,應(yīng)該認(rèn)真理解、掌握。學(xué)習(xí)這些知識(shí)時(shí),首先盡量認(rèn)知這些理論和概念,有一個(gè)基本的理性認(rèn)識(shí),在不完全理解和掌握的情況下應(yīng)盡量多接觸些程序,了解程序中用到的知識(shí),而不必追究為什么和如何做;接下來(lái)試著修改、編寫(xiě)一些程序,然后回過(guò)頭來(lái)學(xué)習(xí)理論和概念,再回到實(shí)踐中應(yīng)用。如此,經(jīng)歷反復(fù)多次才能理解、掌握和應(yīng)用。
4.繼承繼承(inheritance)是使用已存在的類(lèi)的定義作為基礎(chǔ)建立新類(lèi)的技術(shù)。定義新類(lèi)時(shí)可以增加新的成員或新方法以實(shí)現(xiàn)新功能,也可以繼承使用父類(lèi)已存在的類(lèi)的功能,但不能選擇性地繼承父類(lèi)。這種技術(shù)使復(fù)用以前的代碼非常容易,能夠大大縮短開(kāi)發(fā)周期,降低開(kāi)發(fā)費(fèi)用。比如可以先定義一個(gè)類(lèi)叫車(chē),車(chē)有以下屬性:車(chē)體大小、顏色、方向盤(pán)、輪胎,而又由車(chē)這個(gè)類(lèi)派生出轎車(chē)和卡車(chē)兩個(gè)類(lèi),為轎車(chē)添加一個(gè)小后備箱,而為卡車(chē)添加一個(gè)大貨箱。
Java不支持多重繼承,單繼承使Java的繼承關(guān)系很簡(jiǎn)單,一個(gè)類(lèi)只能有一個(gè)父類(lèi),易于管理程序;同時(shí)一個(gè)類(lèi)可以實(shí)現(xiàn)多個(gè)接口,具有多繼承的功能,從而克服單繼承的缺點(diǎn)。繼承中包括如下概念:
(1)一般類(lèi)和特殊類(lèi)。在面向?qū)ο蟪绦蛟O(shè)計(jì)中運(yùn)用繼承原則,就是在每個(gè)由一般類(lèi)和特殊類(lèi)形成的一般-特殊結(jié)構(gòu)中,把一般類(lèi)的對(duì)象實(shí)例和所有特殊類(lèi)的對(duì)象實(shí)例都共同具有的屬性和操作一次性地在一般類(lèi)中進(jìn)行顯式的定義,在特殊類(lèi)中不再重復(fù)地定義一般類(lèi)中已經(jīng)定義的東西,但是在語(yǔ)義上,特殊類(lèi)卻自動(dòng)地、隱含地?fù)碛兴囊话泐?lèi)(以及所有更上層的一般類(lèi))中定義的屬性和操作。特殊類(lèi)的對(duì)象擁有其一般類(lèi)的全部或部分屬性與方法,稱(chēng)做特殊類(lèi)對(duì)一般類(lèi)的繼承。
(2)基類(lèi)與派生類(lèi)。繼承所表達(dá)的就是一種對(duì)象類(lèi)之間的相交關(guān)系,它使得某類(lèi)對(duì)象可以繼承另外一類(lèi)對(duì)象的數(shù)據(jù)成員和成員方法。若類(lèi)B繼承類(lèi)A,則屬于B的對(duì)象便具有類(lèi)A的全部或部分性質(zhì)(成員屬性)和功能(方法),我們稱(chēng)被繼承的類(lèi)A為基類(lèi)、父類(lèi)或超類(lèi),而稱(chēng)繼承類(lèi)B為A的派生類(lèi)或子類(lèi)。繼承避免了對(duì)一般類(lèi)與特殊類(lèi)之間共同特征進(jìn)行的重復(fù)描述。同時(shí),通過(guò)繼承可以清晰地表達(dá)每一項(xiàng)共同特征所適應(yīng)的概念范圍——在一般類(lèi)中定義的屬性和操作適應(yīng)于這個(gè)類(lèi)本身以及它以下的每一層特殊類(lèi)的全部對(duì)象。運(yùn)用繼承原則使得系統(tǒng)模型比較簡(jiǎn)練也比較清晰。
Java繼承具有如下特性:
(1)繼承關(guān)系是傳遞的。若類(lèi)C繼承類(lèi)B,類(lèi)B繼承類(lèi)A,則類(lèi)C既有從類(lèi)B那里繼承下來(lái)的屬性與方法,也有從類(lèi)A那里繼承下來(lái)的屬性與方法,還可以有自己新定義的屬性和方法。繼承來(lái)的屬性和方法盡管是隱式的,但仍是類(lèi)C的屬性和方法。繼承是在一些比較一般的類(lèi)的基礎(chǔ)上構(gòu)造、建立和擴(kuò)充新類(lèi)的最有效的手段。
(2)繼承簡(jiǎn)化了人們對(duì)事物的認(rèn)識(shí)和描述,能清晰體現(xiàn)相關(guān)類(lèi)間的層次結(jié)構(gòu)關(guān)系。
(3)繼承提供了軟件復(fù)用功能。若類(lèi)B繼承類(lèi)A,那么建立類(lèi)B時(shí)只需要再描述與基類(lèi)(類(lèi)A)不同的少量特征(數(shù)據(jù)成員和成員方法)即可。這種做法能減小代碼和數(shù)據(jù)的冗余度,大大增加程序的重用性。
(4)繼承通過(guò)增強(qiáng)一致性來(lái)減少模塊間的接口和界面,大大增加了程序的易維護(hù)性。
(5)提供多重繼承機(jī)制。從理論上說(shuō),一個(gè)類(lèi)可以是多個(gè)一般類(lèi)的特殊類(lèi),它可以從多個(gè)一般類(lèi)中繼承屬性與方法,這便是多重繼承。Java出于安全性和可靠性的考慮,僅支持單重繼承,而通過(guò)使用接口機(jī)制來(lái)實(shí)現(xiàn)多重繼承。
5.抽象(類(lèi))和接口接口和抽象是Java語(yǔ)言中對(duì)于抽象類(lèi)定義進(jìn)行支持的兩種機(jī)制,正是由于這兩種機(jī)制的存在,才賦予了Java強(qiáng)大的面向?qū)ο竽芰?。接口與抽象之間在對(duì)于抽象類(lèi)定義的支持方面具有很大的相似性,甚至可以相互替換,當(dāng)然兩者之間還是有很大的區(qū)別的。
1)抽象(類(lèi))抽象(Abstraction)也稱(chēng)抽象類(lèi),是一種特殊的類(lèi)。在構(gòu)造這種類(lèi)的時(shí)候,其中的方法可以實(shí)現(xiàn),也可以沒(méi)有實(shí)現(xiàn)(抽象)。抽象是在決定如何實(shí)現(xiàn)對(duì)象之前,先考慮對(duì)象的意義和行為,使用抽象可以盡可能避免過(guò)早考慮一些細(xì)節(jié),所以是簡(jiǎn)化復(fù)雜問(wèn)題的途徑。它可以為具體問(wèn)題找到最恰當(dāng)?shù)念?lèi)定義,并且可以在最恰當(dāng)?shù)睦^承級(jí)別解釋問(wèn)題。它可以忽略一個(gè)主題中與當(dāng)前目標(biāo)無(wú)關(guān)的那些方面,以便更充分地注意與當(dāng)前目標(biāo)有關(guān)的方面。抽象并不解決全部問(wèn)題,而只是選擇其中的一部分,暫時(shí)不用部分細(xì)節(jié)。抽象類(lèi)的引入是為了給實(shí)現(xiàn)其子類(lèi)服務(wù)的,在抽象類(lèi)中存在著一個(gè)或多個(gè)抽象方法,而子類(lèi)在繼承抽象類(lèi)時(shí)就可以繼承抽象類(lèi)中的非抽象方法,而對(duì)于抽象類(lèi)中的抽象方法,子類(lèi)可以根據(jù)自己的需要去實(shí)現(xiàn)這個(gè)具體的、自己需要的抽象方法的內(nèi)容。既然子類(lèi)都會(huì)去實(shí)現(xiàn)自己需要的抽象方法,那么在父類(lèi)中就只需要一個(gè)聲明就夠了。因?yàn)榧词苟x了父類(lèi)中抽象方法的具體實(shí)現(xiàn),仍然會(huì)被子類(lèi)重寫(xiě),所以父類(lèi)就沒(méi)有必要再去寫(xiě)具體的實(shí)現(xiàn)了。抽象(類(lèi))的引入很大部分原因也是為接口做鋪墊的。抽象(類(lèi))可應(yīng)用于圖的處理,由于圖的實(shí)現(xiàn)比較復(fù)雜,因此先要構(gòu)造圖的抽象類(lèi),詳細(xì)內(nèi)容可以先參閱MapAbstract.java,但代碼較長(zhǎng),此處不列出。
2)接口接口(interface)是一系列方法的聲明,是一些方法聲明(特征)的集合。一個(gè)接口只有方法的聲明而沒(méi)有方法的實(shí)現(xiàn),因此這些方法可以在不同的地方被不同的類(lèi)實(shí)現(xiàn),而這些實(shí)現(xiàn)可以具有不同的行為(功能)。
(1)“接口”有兩種含義。一是Java接口,它有特定的語(yǔ)法和結(jié)構(gòu);二是一個(gè)類(lèi)所具有的方法的特征集合,是一種邏輯上的抽象。前者叫做“Java接口”,后者叫做“接口”。在Java語(yǔ)言規(guī)范中,一個(gè)方法的特征僅包括方法的名字、參數(shù)的數(shù)目和種類(lèi),而不包括方法的返回類(lèi)型、參數(shù)的名字以及所拋出來(lái)的異常。在Java編譯器檢查方法的重載時(shí),會(huì)根據(jù)這些條件判斷兩個(gè)方法是否是重載方法。但在Java編譯器檢查方法的置換時(shí),則會(huì)進(jìn)一步檢查兩個(gè)方法(分為超類(lèi)型和子類(lèi)型)的返回類(lèi)型和拋出的異常是否相同。
(2)接口的特征如下:①接口繼承和實(shí)現(xiàn)繼承的規(guī)則不同,一個(gè)類(lèi)只有一個(gè)直接父類(lèi),但可以實(shí)現(xiàn)多個(gè)接口。②Java接口本身沒(méi)有任何實(shí)現(xiàn),因?yàn)镴ava接口不涉及表象,而只描述public行為,所以Java接口比Java?抽象類(lèi)更抽象化。③Java接口的方法只能是抽象的和公開(kāi)的,Java接口不能有構(gòu)造器,Java接口可以有公有public、靜態(tài)static和final屬性。④接口把方法的特征和方法的實(shí)現(xiàn)分割開(kāi)來(lái)。這種分割體現(xiàn)在接口常常代表一個(gè)角色,它包裝與該角色相關(guān)的操作和屬性,而實(shí)現(xiàn)這個(gè)接口的類(lèi)便是扮演這個(gè)角色的演員。一個(gè)角色由不同的演員來(lái)演,而不同的演員之間除了扮演一個(gè)共同的角色之外,并不要求其他的共同之處。
(3)接口的作用如下:如果兩個(gè)類(lèi)中有相似的功能,調(diào)用它們的類(lèi)則動(dòng)態(tài)決定一種實(shí)現(xiàn),即提供一個(gè)抽象父類(lèi),子類(lèi)分別實(shí)現(xiàn)父類(lèi)所定義的方法。但是,這樣會(huì)出現(xiàn)以下問(wèn)題:Java是一種單繼承的語(yǔ)言,一般情況下,某個(gè)具體類(lèi)可能已經(jīng)有了一個(gè)超類(lèi),解決辦法是給它的父類(lèi)加父類(lèi),或者給它父類(lèi)的父類(lèi)加父類(lèi),直到移動(dòng)到類(lèi)等級(jí)結(jié)構(gòu)的最頂端。這樣一來(lái),對(duì)一個(gè)具體類(lèi)的可插入性的設(shè)計(jì),就變成了對(duì)整個(gè)等級(jí)結(jié)構(gòu)中所有類(lèi)的修改。接口是可插入性的保證:在一個(gè)等級(jí)結(jié)構(gòu)中的任何一個(gè)類(lèi)都可以實(shí)現(xiàn)一個(gè)接口,這個(gè)接口會(huì)影響到此類(lèi)的所有子類(lèi),但不會(huì)影響到此類(lèi)的任何超類(lèi)。此類(lèi)將不得不實(shí)現(xiàn)這個(gè)接口所規(guī)定的方法,而其子類(lèi)可以從此類(lèi)自動(dòng)繼承這些方法,當(dāng)然也可以選擇置換掉所有的這些方法,或者其中的某一些方法,這時(shí)候,這些子類(lèi)具有了可插入性(并且可以用這個(gè)接口類(lèi)型裝載,傳遞實(shí)現(xiàn)了其所有子類(lèi))。所以應(yīng)該關(guān)注的不是哪一個(gè)具體的類(lèi),而是這個(gè)類(lèi)是否實(shí)現(xiàn)了程序需要的接口。接口提供了關(guān)聯(lián)以及方法調(diào)用上的可插入性,軟件系統(tǒng)的規(guī)模越大,生命周期越長(zhǎng),接口使得軟件系統(tǒng)的靈活性、可擴(kuò)展性和可插入性方面得到保證。在理想的情況下,一個(gè)具體的Java類(lèi)應(yīng)當(dāng)只實(shí)現(xiàn)Java接口和抽象Java類(lèi)中聲明的方法,而不應(yīng)當(dāng)再編寫(xiě)其他方法。
(4)接口的應(yīng)用可體現(xiàn)為隊(duì)列接口Queue.java,代碼如下:
publicinterfaceQueue<E>
//隊(duì)列接口
{
booleanisEmpty();
//判斷隊(duì)列是否為空,若空則返回true
booleanenQueue(Eelement);
//數(shù)據(jù)element入隊(duì),若操作成功則返回true
EdeQueue();
//出隊(duì),返回當(dāng)前隊(duì)頭數(shù)據(jù),若隊(duì)列空則返回null
EgetFront();//取隊(duì)頭數(shù)據(jù)值,未出隊(duì),若隊(duì)列空則返回null
}0.3任務(wù)三構(gòu)建簡(jiǎn)單操作菜單在后面數(shù)據(jù)結(jié)構(gòu)與算法的程序?qū)崿F(xiàn)中,每個(gè)學(xué)習(xí)情境基本都要求有簡(jiǎn)單的操作菜單,所以本任務(wù)將介紹如何制作簡(jiǎn)單控制臺(tái)的菜單。制作控制臺(tái)的菜單只需要掌握J(rèn)ava的輸入/輸出、程序控制和異常處理的知識(shí)就足夠了。教程中完整的程序源碼,請(qǐng)先模仿練習(xí)(抄到計(jì)算機(jī)NetBeans中)來(lái)實(shí)現(xiàn),再自己做出類(lèi)似的或更好的程序。需要反復(fù)練習(xí),直到能獨(dú)立完成。0.3.1子任務(wù)1輸入/輸出
1.輸出信息
(1)?Java的信息輸出方法前面已經(jīng)提到了,就是用System.out.println()方法自動(dòng)將括號(hào)里的對(duì)象轉(zhuǎn)化成String類(lèi)型,也就是調(diào)用對(duì)象的toString方法,在()中可以使用連字號(hào)“+”連接除布爾型以外的各數(shù)據(jù)類(lèi)型變量。
(2)?System.out.println()輸出后有換行;System.out.print()輸出后不換行。
(3)?Java轉(zhuǎn)義符。ASCII中的控制字符及回車(chē)換行等字符都沒(méi)有現(xiàn)成的文字符號(hào),所以只能用轉(zhuǎn)義字符來(lái)表示。所有的ASCII碼都可以用“\”加數(shù)字(一般是十六進(jìn)制數(shù)字)來(lái)表示。
Java常用的轉(zhuǎn)義符有:
\n回車(chē)(\u000a)
\r換行(\u000d)
\t水平制表符(\u0009)
\'單引號(hào)(\u0027)
\"雙引號(hào)(\u0022)
\\反斜杠(\u005c)例:System.out.print(“\n\n\n”);會(huì)連換三行。
2.信息的輸入
Java中,java.util.Scanner類(lèi)用于掃描輸入文本的程序。使用該類(lèi)創(chuàng)建一個(gè)對(duì)象scan:
Scannerscan=newScanner(System.in);然后對(duì)象scan調(diào)用下列方法,讀取用戶(hù)在命令行輸入的各種數(shù)據(jù)類(lèi)型:
next():讀取字符串。
nextInt():讀取整型數(shù)據(jù)。
nextFloat():讀取浮點(diǎn)型數(shù)據(jù)。
nextDouble():讀取雙精度型數(shù)據(jù)。
nextLine():讀取一行數(shù)據(jù)。
next.Byte():讀取字節(jié)數(shù)據(jù)。
3.菜單程序在包c(diǎn)h0ProgramBase中新建一個(gè)類(lèi),類(lèi)名為Menu0,使用輸入/輸出語(yǔ)句就可構(gòu)造一個(gè)基本的菜單,Menu0.java完整的程序代碼如下:
packagech0ProgramBase;
importjava.util.Scanner;
publicclassMenu0{
publicstaticvoidmain(String[]args){
Scannerscan=newScanner(System.in);
intselect;
System.out.println("\n\t==========操作菜單==========");
System.out.print("1.初始化");
System.out.print("2.追加數(shù)據(jù)");
System.out.print("3.刪除數(shù)據(jù)");
System.out.print("4.修改數(shù)據(jù)");
System.out.print("0.退出\n");
System.out.print("請(qǐng)輸入您的選擇項(xiàng):");
select=scan.nextInt();
System.out.println("您剛剛選擇的是:"+select);
}
}運(yùn)行效果如下:
==========操作菜單==========
1.初始化2.追加數(shù)據(jù)3.刪除數(shù)據(jù)4.修改數(shù)據(jù)0.退出請(qǐng)輸入您的選擇項(xiàng):2
您剛剛選擇的是:20.3.2子任務(wù)2程序控制程序結(jié)構(gòu)有三種基本組合:順序結(jié)構(gòu)、選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)。再?gòu)?fù)雜的程序也是由順序、選擇和循環(huán)三種基本程序結(jié)構(gòu)通過(guò)組合、嵌套構(gòu)成的。
1.循環(huán)結(jié)構(gòu)
Java有兩類(lèi)循環(huán)結(jié)構(gòu),一類(lèi)是for,另一類(lèi)是while,包括四種情況。
1)傳統(tǒng)for循環(huán)傳統(tǒng)for循環(huán)一般用于循環(huán)次數(shù)固定或循環(huán)次數(shù)可以確定的循環(huán)(當(dāng)然for循環(huán)也可以用于循環(huán)次數(shù)無(wú)法確定的循環(huán))。格式如下:
for(初始值;循環(huán)條件;迭代)
{
循環(huán)體語(yǔ)句;
}
2)?foreach循環(huán)
foreach語(yǔ)句是java5版本開(kāi)始的特征之一,在遍歷數(shù)組、集合方面,foreach為開(kāi)發(fā)人員提供了極大的方便。
foreach語(yǔ)句是for語(yǔ)句的特殊簡(jiǎn)化版本,但是foreach語(yǔ)句并不能完全取代for語(yǔ)句,然而,任何的foreach語(yǔ)句都可以改寫(xiě)為for語(yǔ)句版本。
foreach并不是一個(gè)關(guān)鍵字,習(xí)慣上將這種特殊的for語(yǔ)句格式稱(chēng)之為“foreach”語(yǔ)句。從英文字面意思理解foreach也就是“for每一個(gè)”的意思。格式如下:
for(元素類(lèi)型t元素變量x:遍歷對(duì)象obj)
{
引用了x的java語(yǔ)句;
}前面產(chǎn)生隨機(jī)數(shù)的程序每次運(yùn)行都只能得到一個(gè)隨機(jī)數(shù),有了for循環(huán),結(jié)合輸入就可以由用戶(hù)指定產(chǎn)生的個(gè)數(shù)了。在包c(diǎn)h0ProgramBase中新建一個(gè)類(lèi),類(lèi)名Randomfor,使用for和輸入語(yǔ)句就可構(gòu)造一個(gè)由使用者輸入個(gè)數(shù)的隨機(jī)數(shù)產(chǎn)生程序,Randomfor.java完整的程序代碼如下:
packagech0ProgramBase;//包聲明
importjava.util.Scanner;
classRandom{
publicintRandom(intbegin,intend){//產(chǎn)生begin至end隨機(jī)方法
return(int)(begin+Math.random()*(end-begin));
}
}
publicclassRandomfor{
publicstaticvoidmain(String[]args){
Randomcr=newRandom();//創(chuàng)建對(duì)象
Scannerscan=newScanner(System.in);
intnumber,start,end;
System.out.print("請(qǐng)輸入您想產(chǎn)生隨機(jī)數(shù)的個(gè)數(shù):");
number=scan.nextInt();
System.out.print("請(qǐng)輸入隨機(jī)數(shù)的范圍起點(diǎn)數(shù):");
start=scan.nextInt();
System.out.print("請(qǐng)輸入隨機(jī)數(shù)的范圍截止數(shù):");
end=scan.nextInt();
System.out.println("按您的要求產(chǎn)生的隨機(jī)數(shù)如下:");
for(inti=0;i<number;i++){
System.out.print(""+cr.Random(start,end));
}
}
}某次運(yùn)行結(jié)果如下(輸入不同,產(chǎn)生結(jié)果不同;輸入相同,結(jié)果也不會(huì)完全相同):請(qǐng)輸入您想產(chǎn)生隨機(jī)數(shù)的個(gè)數(shù):10請(qǐng)輸入隨機(jī)數(shù)的范圍起點(diǎn)數(shù):20請(qǐng)輸入隨機(jī)數(shù)的范圍截止數(shù):80按您的要求產(chǎn)生的隨機(jī)數(shù)如下:
32467929215558307233
3)?while循環(huán)
while循環(huán)一般用于循環(huán)次數(shù)無(wú)法知道或無(wú)法確定,由用戶(hù)決定是否繼續(xù)循環(huán)工作,通過(guò)設(shè)置一定條件,如果條件滿(mǎn)足就繼續(xù)循環(huán),如果條件不滿(mǎn)足就結(jié)束循環(huán)(當(dāng)然while循環(huán)也可以用于循環(huán)次數(shù)可以確定的循環(huán))。格式如下:
while(循環(huán)條件)
{
循環(huán)體語(yǔ)句;
}
4)?do…while循環(huán)
do…while循環(huán)與while循環(huán)的最大差別是:do…while循環(huán)的循環(huán)體至少執(zhí)行一次,而while循環(huán)如果開(kāi)始執(zhí)行時(shí)條件不成立,則一次也不執(zhí)行。格式如下:
do{
循環(huán)體語(yǔ)句;
}while(循環(huán)條件);特別注意:while(循環(huán)條件);最后需要一個(gè)語(yǔ)句結(jié)束分號(hào)“;”。前面實(shí)現(xiàn)的菜單,每次運(yùn)行都只能選擇一次就結(jié)束,顯然不適合使用,有了while循環(huán),可以由用戶(hù)隨意操作N次,當(dāng)輸入0時(shí)結(jié)束程序運(yùn)行。在包c(diǎn)h0ProgramBase中新建一個(gè)類(lèi),類(lèi)名為Menu1while,增加while循環(huán)就可構(gòu)造一個(gè)由使用者根據(jù)需要操作的較好菜單,Menu1while.java完整的程序代碼如下:
packagech0ProgramBase;
importjava.util.Scanner;
publicclassMenu1while{
publicstaticvoidmain(String[]args){
Scannerscan=newScanner(System.in);
intselect;
do{
System.out.println("\n\t=========操作菜單=========");
System.out.print("1.初始化");
System.out.print("2.追加數(shù)據(jù)");
System.out.print("3.刪除數(shù)據(jù)");
System.out.print("4.修改數(shù)據(jù)");
System.out.print("0.退出\n");
System.out.print("請(qǐng)輸入您的選擇項(xiàng):");
select=scan.nextInt();
System.out.println("您剛剛選擇的是:"+select);
}while(select!=0);
}
}運(yùn)行結(jié)果請(qǐng)讀者自己運(yùn)行查看。
2.選擇結(jié)構(gòu)選擇結(jié)構(gòu)有兩類(lèi),一類(lèi)是if…else,另一類(lèi)是switch+case,共分三種情況。
1)?if結(jié)構(gòu)
if結(jié)構(gòu)的作用是進(jìn)行條件判斷,讓程序滿(mǎn)足條件時(shí)執(zhí)行某些語(yǔ)句,不滿(mǎn)足條件則不執(zhí)行。格式如下:
if(條件){
語(yǔ)句塊1;
}
2)?if…else結(jié)構(gòu)
if…else結(jié)構(gòu)是java中的條件分支語(yǔ)句,它能讓程序根據(jù)條件滿(mǎn)足與否選擇在兩個(gè)不同的路徑中執(zhí)行。格式如下:
if(條件){
語(yǔ)句塊1;
}else{
語(yǔ)句塊2;
}前面Menu1while.java程序可以反復(fù)運(yùn)行,直至用戶(hù)輸入0退出操作,但程序的操作菜單只有5項(xiàng),有效選擇應(yīng)該是0~4,但如果用戶(hù)輸入其他的數(shù)字,程序沒(méi)有提示輸入錯(cuò)誤,解決這個(gè)問(wèn)題就需要條件判斷了,有了if判斷,修改Menu1while就可以滿(mǎn)足該要求。在包c(diǎn)h0ProgramBase中新建一個(gè)類(lèi),類(lèi)名為Menu2if,使用if和循環(huán)菜單就可構(gòu)造一個(gè)判斷使用者輸入是否合法,Menu2if.java完整的程序代碼如下:
packagech0ProgramBase;
importjava.util.Scanner;
publicclassMenu2if{
publicstaticvoidmain(String[]args){
Scannerscan=newScanner(System.in);
intselect;
do{
System.out.println("\n\t==========操作菜單==========");
System.out.print("1.初始化");
System.out.print("2.追加數(shù)據(jù)");
System.out.print("3.刪除數(shù)據(jù)");
System.out.print("4.修改數(shù)據(jù)");
System.out.print("0.退出\n");
System.out.print("請(qǐng)輸入您的選擇項(xiàng):");
select=scan.nextInt();
if(select>=0&&select<5){
System.out.println("您剛剛選擇的是:"+select);
}else{
System.out.println("您剛剛選擇的是:"+select+"系統(tǒng)無(wú)此選項(xiàng),請(qǐng)重新輸入");
}
}while(select!=0);
}
}如果輸入不在0~4之間,則運(yùn)行結(jié)果如下:
==========操作菜單==========
1.初始化2.追加數(shù)據(jù)3.刪除數(shù)據(jù)4.修改數(shù)據(jù)0.退出請(qǐng)輸入您的選擇項(xiàng):1234
您剛剛選擇的是:1234系統(tǒng)無(wú)此選項(xiàng),請(qǐng)重新輸入
3)?switch多分支結(jié)構(gòu)
switch結(jié)構(gòu)是多路分支語(yǔ)句。它提供了一種簡(jiǎn)單的方法,使程序根據(jù)表達(dá)式的值來(lái)執(zhí)行不同的程序部分,當(dāng)然多路分支可用if…else多級(jí)結(jié)合來(lái)實(shí)現(xiàn),但是switch比if…else…if…else…是更好的選擇。格式如下:
switch(expresson){
casevalue1:
語(yǔ)句1; break;
casevalue2: 語(yǔ)句2; break;
…….
casevalueN:
語(yǔ)句N(xiāo); break;
default: //default是除了上述選擇以外的任何選擇語(yǔ)句1;
}
3.break和continue
break語(yǔ)句用于終止最近的循環(huán)或它所在的switch語(yǔ)句,continue語(yǔ)句將控制權(quán)傳遞給它所在的封閉循環(huán)語(yǔ)句的下一次循環(huán)。兩者的差異如圖0-21所示。具體來(lái)說(shuō):
(1)break語(yǔ)句在循環(huán)和switch等具有選擇特征的語(yǔ)句中使用,而且是終止最近的循環(huán)或分支的封閉代碼塊,其后的代碼不再執(zhí)行。如果多重循環(huán)時(shí),它只終止自己所被包含的最近循環(huán)層。
(2)?continue語(yǔ)句與break語(yǔ)句的使用場(chǎng)合類(lèi)似。continue語(yǔ)句不可以在單獨(dú)的switch語(yǔ)句中使用,但可以在一個(gè)循環(huán)內(nèi)的switch語(yǔ)句中使用。含有continue的循環(huán)語(yǔ)句在遇到continue語(yǔ)句后,代碼先不按照常規(guī)的從上往下的代碼順序執(zhí)行,而是馬上返回到循環(huán)入口轉(zhuǎn)入下一次循環(huán)。圖0-21break和continue轉(zhuǎn)向
(3)?break語(yǔ)句和continue語(yǔ)句在循環(huán)內(nèi)的switch語(yǔ)句中使用時(shí),是有區(qū)別的。break語(yǔ)句是跳出該switch,switch結(jié)構(gòu)后的代碼繼續(xù)執(zhí)行;而continue語(yǔ)句是不執(zhí)行switch后的代碼的,可以理解為跳出循環(huán),接著進(jìn)入下一次循環(huán)。前面的Menu2if.java程序可以反復(fù)運(yùn)行直至用戶(hù)輸入0退出操作,并且能判斷是否是有效選擇(應(yīng)該是0~4),但如果用戶(hù)輸入正確選擇,則程序無(wú)法按使用者的響應(yīng)執(zhí)行不同的分支操作,解決這個(gè)問(wèn)題就需要多分支結(jié)構(gòu)switch。有了switch,在Menu2if基礎(chǔ)上增加選擇分支處理,并使用continue就可以滿(mǎn)足該要求,但要注意先用if判斷是否在0~4范圍內(nèi),如果不是(注意if的條件與前面不同)就不執(zhí)行switch分支判斷,顯示提示錯(cuò)誤信息后直接轉(zhuǎn)到循環(huán)開(kāi)始位置再次顯示菜單并接受輸入。在包c(diǎn)h0ProgramBase中新建一個(gè)類(lèi),類(lèi)名為Menu3switch,使用switch和continue修改前期菜單就可構(gòu)造一個(gè)響應(yīng)使用者輸入的不同選擇了,Menu3switch.java完整的程序代碼如下:
packagech0ProgramBase;
importjava.util.Scanner;
publicclassMenu3switch{
publicstaticvoidmain(String[]args){
Scannerscan=newScanner(System.in);
intselect;do{System.out.println("\n\t==========操作菜單==========");System.out.print("1.初始化");System.out.print("2.追加數(shù)據(jù)");System.out.print("3.刪除數(shù)據(jù)");System.out.print("4.修改數(shù)據(jù)");System.out.print("0.退出\n");System.out.print("請(qǐng)輸入您的選擇項(xiàng):");select=scan.nextInt();if(select<0||select>5){System.out.println("您剛剛選擇的是:"+select+"系統(tǒng)無(wú)此選項(xiàng),請(qǐng)重新輸入");continue;}
switch(select){case1:System.out.print("您剛剛選擇的是:1.初始化");break;case2:System.out.print("您剛剛選擇的是:2.追加數(shù)據(jù)");break;case3:System.out.print("您剛剛選擇的是:3.刪除數(shù)據(jù)");break;case4:System.out.print("您剛剛選擇的是:4.修改數(shù)據(jù)");break;}}while(select!=0);}}運(yùn)行結(jié)果如下:
==========操作菜單==========
1.初始化2.追加數(shù)據(jù)3.刪除數(shù)據(jù)4.修改數(shù)據(jù)0.退出請(qǐng)輸入您的選擇項(xiàng):3您剛剛選擇的是:3.刪除數(shù)據(jù)
==========操作菜單==========
1.初始化2.追加數(shù)據(jù)3.刪除數(shù)據(jù)4.修改數(shù)據(jù)0.退出請(qǐng)輸入您的選擇項(xiàng):1234
您剛剛選擇的是:1234系統(tǒng)無(wú)此選項(xiàng),請(qǐng)重新輸入至此,一個(gè)能滿(mǎn)足數(shù)據(jù)結(jié)構(gòu)與算法操作的控制臺(tái)菜單完成。通過(guò)四個(gè)菜單不斷遞進(jìn),每次增加一點(diǎn),對(duì)初學(xué)者而言應(yīng)該不難。但編者在教學(xué)中,發(fā)現(xiàn)很多學(xué)生連這樣的菜單都很難一次性做好,只能循序漸進(jìn)地講解。后來(lái)發(fā)現(xiàn),這樣講解其實(shí)也是在講解項(xiàng)目開(kāi)發(fā)的業(yè)務(wù)分析技術(shù),而且對(duì)后續(xù)程序編寫(xiě)還有幫助,正所謂“磨刀不誤砍柴工”。所以說(shuō),菜單是基礎(chǔ),只有做好了菜單,才能為后續(xù)的數(shù)據(jù)結(jié)構(gòu)與算法操作實(shí)現(xiàn)打下堅(jiān)實(shí)的基礎(chǔ)。這點(diǎn)非常重要。下面還要在“0.3.3子任務(wù)3異常處理”中貼一次該菜單代碼完善版,這樣共五次,希望學(xué)習(xí)者能至少做5~10遍,如果能在3~5五分鐘內(nèi)自己獨(dú)立完成菜單程序,那一遍就可以了。0.3.3子任務(wù)3異常處理
1.異常現(xiàn)象前面的Menu3switch.java程序似乎可以滿(mǎn)足要求了,但看看下面的使用結(jié)果:
==========操作菜單==========
1.初始化2.追加數(shù)據(jù)3.刪除數(shù)據(jù)4.修改數(shù)據(jù)0.退出請(qǐng)輸入您的選擇項(xiàng):3w
Exceptioninthread"main"java.util.InputMismatchException
atjava.util.Scanner.throwFor(Scanner.java:840)
atjava.util.Scanner.next(Scanner.java:1461)
atjava.util.Scanner.nextInt(Scanner.java:2091)
atjava.util.Scanner.nextInt(Scanner.java:2050)
atch0ProgramBase.Menu3switch.main(Menu3switch.java:18)
JavaResult:1
2.異常處理上述程序輸入任何數(shù)字已經(jīng)完全沒(méi)有問(wèn)題,但用戶(hù)輸入如果有字符,系統(tǒng)就嚴(yán)重出錯(cuò)了。這個(gè)問(wèn)題應(yīng)如何處理?
(1)將select數(shù)據(jù)類(lèi)型改為字符串型“Stringselect;”,相應(yīng)地將“select=scan.nextInt();”改為“select=scan.next();”最后還要將“case1:”改為“case“1”:”其他case語(yǔ)句類(lèi)推。這個(gè)工作可由學(xué)習(xí)者自己完成。代碼不再一一列出。這種處理當(dāng)然可以,因?yàn)榻?jīng)分析,問(wèn)題出在“scan.nextInt();”,是要從鍵盤(pán)輸入整數(shù),可是操作中卻輸入了字符,當(dāng)然出錯(cuò)。將select類(lèi)型改為字符串型后,問(wèn)題就可以解決了,但是如果select需要用整型,那又該怎么辦?
(2)?Java為了防止程序運(yùn)行出錯(cuò),提供了一套異常處理機(jī)制,其格式如下:
try{
//此處是要嘗試運(yùn)行的代碼
}catch(Exceptione){
//此處是如果try部分的任何一句代碼嘗試失敗后,則跳轉(zhuǎn)到此模塊執(zhí)行代碼
//可以獲取系統(tǒng)錯(cuò)誤,系統(tǒng)錯(cuò)誤信息就在e.message中,也可以自己寫(xiě)錯(cuò)誤提示信息,
//或者其他代碼塊
}finally{
//無(wú)論嘗試是否成功都會(huì)運(yùn)行此部分代碼,做一些清理工作。比如數(shù)據(jù)庫(kù)連接打開(kāi)了,
//但讀/寫(xiě)錯(cuò)誤,在此寫(xiě)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 商品房裝修協(xié)議合同協(xié)議
- 欺詐簽訂賠償協(xié)議書(shū)范本
- 2025標(biāo)準(zhǔn)房屋抵押借款合同
- 2025年版單位房屋租賃合同樣本
- 2025專(zhuān)業(yè)版設(shè)備融資租賃合同模板
- 2025屆河南省新鄉(xiāng)金太陽(yáng)高三二??荚囉⒄Z(yǔ)試題及答案
- 2025融資租賃合同樣本
- 社區(qū)農(nóng)業(yè)生產(chǎn)資源利用合作協(xié)議
- 2025年黑龍江c1貨運(yùn)從業(yè)資格證模擬考試
- 公司董事會(huì)致行動(dòng)人協(xié)議
- 婦科管理制度
- 《浙江省中藥飲片炮制規(guī)范》 2015年版
- 新晉管理者培訓(xùn)
- 第19課《紫藤蘿瀑布》課件-2024-2025學(xué)年統(tǒng)編版語(yǔ)文七年級(jí)下冊(cè)
- 2025-2030中國(guó)二氯乙烷行業(yè)市場(chǎng)發(fā)展趨勢(shì)與前景展望戰(zhàn)略研究報(bào)告
- 供電公司故障搶修服務(wù)規(guī)范
- 初中體育課堂安全教育
- 防高處墜落 物體打擊專(zhuān)項(xiàng)施工方案
- 食品銷(xiāo)售初級(jí)考試試題及答案
- 全國(guó)第三屆職業(yè)技能大賽(增材制造)選拔賽理論考試題庫(kù)(含答案)
- 人教部編版初中語(yǔ)文七年級(jí)下冊(cè) 《15.青春之光》課件
評(píng)論
0/150
提交評(píng)論