JAVA程序設(shè)計(jì)基礎(chǔ)課件_第1頁(yè)
JAVA程序設(shè)計(jì)基礎(chǔ)課件_第2頁(yè)
JAVA程序設(shè)計(jì)基礎(chǔ)課件_第3頁(yè)
JAVA程序設(shè)計(jì)基礎(chǔ)課件_第4頁(yè)
JAVA程序設(shè)計(jì)基礎(chǔ)課件_第5頁(yè)
已閱讀5頁(yè),還剩441頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

Java基本語(yǔ)法2.1Java語(yǔ)言的基本組成2.1.1識(shí)別字2.1.2關(guān)鍵字2.2變數(shù)和直接量變數(shù)是一塊取了名字的用來(lái)存儲(chǔ)Java程式資訊的記憶體區(qū)域,它是一些有意義的數(shù)據(jù)。在程式中,定義的每塊被命名的記憶體區(qū)域只能存儲(chǔ)一種特定類型的數(shù)據(jù)。在程式中直接給出的數(shù)值被稱作直接量,直接量可以是一個(gè)具體的數(shù)值或字串,每個(gè)直接量也屬於一個(gè)特定的類型。2.3數(shù)據(jù)類型2.3.1integer數(shù)據(jù)類型 (1)位元組(byte)型 (2)短整(short)型 (3)整(int)型 (4)長(zhǎng)整(long)型2.3.2浮點(diǎn)數(shù)據(jù)類型 (1)單精確度浮點(diǎn)型(float) (2)雙精度浮點(diǎn)型(double)2.3.3變數(shù)類型的轉(zhuǎn)換2.4運(yùn)算符與運(yùn)算式2.4.1賦值運(yùn)算符2.4.2算術(shù)運(yùn)算符2.4.3關(guān)係運(yùn)算符2.4.4條件運(yùn)算符2.4.5邏輯運(yùn)算符2.5Java語(yǔ)句及其控制結(jié)構(gòu)2.5.1Java語(yǔ)句 Java語(yǔ)句是Java識(shí)別字的集合,由關(guān)鍵字、常量、變數(shù)和運(yùn)算式構(gòu)成,是成員方法的主要成分,必須包含在類的方法體之中。Java語(yǔ)句有運(yùn)算式語(yǔ)句、複合語(yǔ)句、選擇語(yǔ)句和迴圈語(yǔ)句等。語(yǔ)句以分號(hào)“;”作為結(jié)束標(biāo)誌,單獨(dú)的一個(gè)分號(hào)被看作一個(gè)空語(yǔ)句,空語(yǔ)句不做任何事情。在運(yùn)算式後邊加上分號(hào)“;”就是一個(gè)運(yùn)算式語(yǔ)句。經(jīng)常使用的運(yùn)算式語(yǔ)句有賦值語(yǔ)句和方法調(diào)用語(yǔ)句。運(yùn)算式語(yǔ)句是最簡(jiǎn)單的語(yǔ)句,它們被順序執(zhí)行,完成相應(yīng)的操作。 複合語(yǔ)句也稱為塊(block)語(yǔ)句,是包含在一對(duì)大括弧“{}”中的任意語(yǔ)句序列。與其他語(yǔ)句用分號(hào)作結(jié)束符不同,複合語(yǔ)句右括弧“}”後面不需要分號(hào)。儘管複合語(yǔ)句含有任意多個(gè)語(yǔ)句,但從語(yǔ)法上講,一個(gè)複合語(yǔ)句被看作一個(gè)簡(jiǎn)單語(yǔ)句。例2-2:publicclassBlock{publicstaticvoidmain(Stringargs[]){intk,i=3,j=4;k=i+j;System.out.println("k="+k);{floatf;f=j+4.5F;i++;System.out.println("f="+f);}System.out.println("i="+i);}}運(yùn)行結(jié)果見圖2-2。圖2-2程式說(shuō)明:在main方法中有兩個(gè)複合語(yǔ)句嵌套在一起,複合語(yǔ)句內(nèi)包含的是運(yùn)算式語(yǔ)句。第1個(gè)複合語(yǔ)句中說(shuō)明了3個(gè)整型變數(shù)k、i、j,它們不僅在第1個(gè)複合語(yǔ)句中起作用,還在被嵌套的第2個(gè)複合語(yǔ)句中起作用。而在第2個(gè)複合語(yǔ)句中說(shuō)明的變數(shù)f僅在第2個(gè)複合語(yǔ)句中起作用。在這個(gè)例子中,人為地加入了一個(gè)複合語(yǔ)句,在實(shí)際編程中並不多見。複合語(yǔ)句更廣泛的應(yīng)用是在結(jié)構(gòu)式語(yǔ)句中,如選擇語(yǔ)句和迴圈語(yǔ)句。當(dāng)結(jié)構(gòu)式語(yǔ)句中包含的運(yùn)算式語(yǔ)句超過(guò)一條時(shí),就要用大括弧把它們括起來(lái)。2.5.2選擇語(yǔ)句 在複合語(yǔ)句中必須逐行執(zhí)行每條命令。能否改變程式執(zhí)行的順序呢?利用if...else結(jié)構(gòu)就可以根據(jù)條件控制程式流程。1.if語(yǔ)句if語(yǔ)句的語(yǔ)法結(jié)構(gòu)如下:if(條件運(yùn)算式)s1語(yǔ)句;這是最簡(jiǎn)單的單分支結(jié)構(gòu)。條件運(yùn)算式的值為true,就執(zhí)行s1語(yǔ)句,否則就忽略s1語(yǔ)句。s1語(yǔ)句可以是複合語(yǔ)句。2.if...else語(yǔ)句 if選擇結(jié)構(gòu)僅當(dāng)條件為真時(shí)才執(zhí)行某一動(dòng)作,否則忽略這一動(dòng)作。而if...else選擇結(jié)構(gòu)允許程式員指定在條件為真或者條件為假時(shí)的不同動(dòng)作。if語(yǔ)句通常都與else語(yǔ)句配套使用,形成二分支結(jié)構(gòu)。它的語(yǔ)法結(jié)構(gòu)如下:if(條件運(yùn)算式)s1語(yǔ)句;elses2語(yǔ)句;當(dāng)條件運(yùn)算式的值為true,就執(zhí)行s1語(yǔ)句,忽略else和s2語(yǔ)句;否則,條件運(yùn)算式的值為false,程式忽略s1語(yǔ)句,執(zhí)行else後面的s2語(yǔ)句。s1和s2都可以是複合語(yǔ)句。3.if...else複合結(jié)構(gòu)對(duì)於複雜的情況,我們可以嵌套使用if...else語(yǔ)句。它的語(yǔ)法結(jié)構(gòu)如下:if(條件運(yùn)算式1)s1語(yǔ)句;elseif(條件運(yùn)算式2)s2語(yǔ)句;elses3語(yǔ)句; 在這裏依次計(jì)算條件運(yùn)算式,如果某個(gè)條件運(yùn)算式的值為true,就執(zhí)行它後面的語(yǔ)句,其餘部分被忽略。所有運(yùn)算式的值都為false,就執(zhí)行最後一個(gè)else後的s3語(yǔ)句。s1、s2和s3都可以是複合語(yǔ)句。4.switch開關(guān)語(yǔ)句 雖然嵌套的條件語(yǔ)句可實(shí)現(xiàn)多個(gè)分支處理,但嵌套太多時(shí)容易出錯(cuò)和混亂,這時(shí)可以使用開關(guān)語(yǔ)句switch處理。實(shí)際上開關(guān)語(yǔ)句switch也是一種if...else結(jié)構(gòu),不過(guò)它使你在編程時(shí)很容易寫出判斷條件,特別是有很多條件選項(xiàng)的時(shí)候。開關(guān)語(yǔ)句switch的語(yǔ)法結(jié)構(gòu)如下:switch(運(yùn)算式){case常量1;語(yǔ)句1;

break;case常量2;語(yǔ)句2;

break;……default:

語(yǔ)句n;}其中switch、case、default是關(guān)鍵字,default子句可以省略。開關(guān)語(yǔ)句先計(jì)算運(yùn)算式,然後將運(yùn)算式值與各個(gè)常量比較,如果運(yùn)算式值與某個(gè)常量相等,就執(zhí)行該常量後面的語(yǔ)句。如果都不相等,就執(zhí)行default下麵的語(yǔ)句,如果無(wú)default子句,就什麼都不執(zhí)行,直接跳出開關(guān)語(yǔ)句。使用開關(guān)語(yǔ)句時(shí),注意以下問(wèn)題。(1)case後面的常量必須是整數(shù)或字元型,而且不能有相同的值。(2)通常在每一個(gè)case中都應(yīng)使用break語(yǔ)句提供一個(gè)出口,使流程跳出開關(guān)語(yǔ)句。否則,在第一個(gè)滿足條件case後面的所有語(yǔ)句都會(huì)被執(zhí)行,這種情況叫做落空。(3)有些case標(biāo)號(hào)列在一起(如“case1:case2:”,中間沒(méi)有語(yǔ)句),這表示對(duì)所列情況將進(jìn)行同樣的操作。2.5.3迴圈語(yǔ)句 1.for迴圈語(yǔ)句 for迴圈的語(yǔ)法結(jié)構(gòu)為: for(運(yùn)算式1;運(yùn)算式2;運(yùn)算式3) 循環(huán)體2.while迴圈語(yǔ)句 while迴圈的語(yǔ)法結(jié)構(gòu)為如下形式: while(條件運(yùn)算式) 循環(huán)體3.do...while迴圈 如不用大括弧,循環(huán)體中只含一條語(yǔ)句的do...while結(jié)構(gòu)如下: do 語(yǔ)句 while(條件);只有一條語(yǔ)句的do...while結(jié)構(gòu)也常常寫成如下形式:do{語(yǔ)句}while(條件);4.迴圈語(yǔ)句的嵌套5.迴圈語(yǔ)句小結(jié)一個(gè)迴圈一般應(yīng)包括以下4部分內(nèi)容。(1)初始化部分用來(lái)設(shè)置迴圈的一些初始條件,計(jì)數(shù)器清零等。(2)循環(huán)體部分這是反復(fù)被執(zhí)行的一段代碼,可以是單語(yǔ)句,也可以是複合語(yǔ)句。(3)迭代部分這是在當(dāng)前迴圈結(jié)束,下一次迴圈開始時(shí)執(zhí)行的語(yǔ)句,常用來(lái)使計(jì)數(shù)器加1或減1。(4)終止部分通常是一個(gè)布爾運(yùn)算式,每一次迴圈要對(duì)該運(yùn)算式求值,以驗(yàn)證是否滿足迴圈終止條件。2.5.4跳轉(zhuǎn)語(yǔ)句 1.break和continue語(yǔ)句 2.帶標(biāo)號(hào)的break和continue語(yǔ)句2.6數(shù)組2.6.1數(shù)組的聲明和建立 數(shù)組按如下格式定義: typearrayname[]; type是數(shù)組類型,它指出數(shù)組中各元素的類型,arrayname為數(shù)組名。2.6.2多維數(shù)組 以二維數(shù)組為例,其格式為: typearrayname[][];第3章面向?qū)ο蟮某淌皆O(shè)計(jì)3.1簡(jiǎn)介3.2類3.3對(duì)象3.4實(shí)例研究(無(wú))3.5類的繼承和類的多態(tài)性3.6接口與包3.1簡(jiǎn)介Java是面向?qū)ο蟮某淌皆O(shè)計(jì)語(yǔ)言,從面向?qū)ο筮@個(gè)角度看,體現(xiàn)了如下3個(gè)特點(diǎn)。1.封裝性2.繼承性3.通信相關(guān)性3.2類1.類的說(shuō)明(1)指出特性(2)指出父類(extends部分)(3)指出介面(implements部分)2.類體3.2.1類的成員變數(shù) 1.變數(shù)的訪問(wèn)許可權(quán) (1)公用(public)變數(shù) (2)專用(private)變數(shù) (3)保護(hù)型(protected)變數(shù) (4)專用保護(hù)型(privateprotected)變數(shù) (5)默認(rèn)型變數(shù)2.是否為靜態(tài)變數(shù)3.是否為常量3.2.2類的方法 其格式如下所示: methodDeclaration{ methodBody }3.2.3this和super this和super是Java的兩個(gè)關(guān)鍵字,它們用在方法體中作為兩個(gè)特殊的變數(shù)首碼和方法首碼。this用來(lái)指明當(dāng)前對(duì)象的成員變數(shù)或方法,以區(qū)分於同名的局部變數(shù)和其他同名的方法,而super則用於指出父類的變數(shù)和方法。 1.this的使用場(chǎng)合 一個(gè)對(duì)象中的方法一般可以直接訪問(wèn)同一對(duì)象的成員變數(shù)。但是,有時(shí)候方法體內(nèi)部定義的變數(shù)和成員變數(shù)名字相同,還有時(shí)方法的入口參數(shù)和對(duì)象的成員變數(shù)名字相同,那麼就需要將三者區(qū)別清楚。因此,專門用this來(lái)指明當(dāng)前對(duì)象的成員變數(shù)或當(dāng)前對(duì)象的方法。2.super的使用場(chǎng)合在Java中,由父類派生子類,這樣,子類的成員變數(shù)可能和父類的成員變數(shù)名字相同,子類的方法也可能和父類的方法一樣。當(dāng)需要調(diào)用父類的同名方法或使用父類的同名變數(shù)時(shí),在子類中可用關(guān)鍵字super作首碼來(lái)指明父類的成員變數(shù)和方法。3.2.4構(gòu)造函數(shù)3.2.5main方法3.3對(duì)象3.3.1對(duì)象的創(chuàng)建 一個(gè)對(duì)象往往經(jīng)歷創(chuàng)建、運(yùn)行和釋放3個(gè)階段,這稱為對(duì)象的典型生命週期。 創(chuàng)建對(duì)象包括定義對(duì)象、建立對(duì)象和初始化對(duì)象3步。3.3.2對(duì)象的使用 對(duì)象使用就是指通過(guò)某種手段使一個(gè)對(duì)象產(chǎn)生它的效能。有兩種途徑來(lái)使用對(duì)象:一種是通過(guò)對(duì)象變數(shù)的引用來(lái)使用對(duì)象,另一種是通過(guò)調(diào)用對(duì)象的方法來(lái)使用對(duì)象。下麵我們結(jié)合具體例子來(lái)說(shuō)明。1.通過(guò)對(duì)象變數(shù)的引用來(lái)使用對(duì)象實(shí)際上,對(duì)象變數(shù)的引用就是用語(yǔ)句訪問(wèn)對(duì)象的變數(shù),通過(guò)這種引用可以檢測(cè)和修改變數(shù)。引用對(duì)象變數(shù)須按如下格式:ObjectReference.variable;其中,ObjectReference是對(duì)象名,variable是所引用的變數(shù)。比如,已經(jīng)由Rectangle建立了名為myRectangle的對(duì)象,它有4個(gè)可以訪問(wèn)的變數(shù)x,y,width和height,那麼:myRectangle.x=2;myRectangle.y=4;這兩個(gè)語(yǔ)句將矩形myRectangle的原點(diǎn)定位於X軸方向?yàn)?,Y軸方向?yàn)?的位置上,而語(yǔ)句:rnyRectangle.width=20;myRectangle.height=40;則將矩形的寬定為20,長(zhǎng)定為40。對(duì)象變數(shù)的引用不僅能夠檢測(cè)和修改變數(shù),也可以通過(guò)運(yùn)算式來(lái)對(duì)幾個(gè)變數(shù)進(jìn)行合成,得到新的複合型變數(shù)。比如,用如下運(yùn)算式引用對(duì)象變數(shù):areaMyRectangle=myRectangle.width*myRectangle.height;就獲得了矩形的面積,它用變數(shù)areaMyRectangle表示。要提到的是,對(duì)象變數(shù)的引用有時(shí)會(huì)使某個(gè)變數(shù)改得不符合要求,從而使一個(gè)對(duì)象處?kù)恫灰?guī)範(fàn)狀態(tài)。因?yàn)檫@一點(diǎn),在類的設(shè)計(jì)中,有些變數(shù)被設(shè)置為禁止被操作狀態(tài),從而使這些變數(shù)不允許其他對(duì)象訪問(wèn)。這時(shí),對(duì)象變數(shù)引用就不可行了。2.通過(guò)調(diào)用對(duì)象的方法來(lái)使用對(duì)象 每個(gè)對(duì)象在創(chuàng)建的時(shí)候,一方面用變數(shù)確定了它的狀態(tài),由創(chuàng)建過(guò)程為它分配記憶體空間,另一方面也創(chuàng)建了與它有關(guān)的方法,每個(gè)方法都是和行為有關(guān)的。所以通過(guò)調(diào)用對(duì)象的某個(gè)方法來(lái)使用對(duì)象,從而產(chǎn)生某種行為,這是最符合邏輯思維習(xí)慣的。實(shí)際上,這也是更為安全可靠地使用對(duì)象的一種手段,因?yàn)檫@避免了對(duì)變數(shù)的直接操作。 調(diào)用一個(gè)對(duì)象中的某個(gè)方法要遵照如下格式:ObjectReference.methodName(paramlist); 或者:ObjectReference.methodName();比如,從Rectangle類中創(chuàng)建的對(duì)象myRectangle含有一個(gè)方法叫move(),下麵的語(yǔ)句就是用方法move()將對(duì)象myRectangle移動(dòng)到一個(gè)新的位置:myRectangle.move(5,10);這個(gè)語(yǔ)句產(chǎn)生的效果等同於下麵兩個(gè)語(yǔ)句:myRectangle.x=5;myRectangle.y=10;3.3.3對(duì)象的釋放 所謂釋放對(duì)象,實(shí)質(zhì)上就是釋放掉分配給此對(duì)象的記憶體空間。Java中,對(duì)象的釋放是自動(dòng)完成的,不需要程式員在編程時(shí)關(guān)注這一點(diǎn)。Java運(yùn)行系統(tǒng)具有所謂的“垃圾收集”機(jī)制,這種機(jī)制會(huì)週期性地檢測(cè)對(duì)象是否還在使用,如發(fā)現(xiàn)有長(zhǎng)期不用的對(duì)象,則給予釋放,回收分配給這些對(duì)象的記憶體,這就是垃圾收集。 具體運(yùn)行中,垃圾收集是由一個(gè)稱為Java垃圾收集器的程式實(shí)現(xiàn)的。當(dāng)一個(gè)對(duì)象在使用時(shí),Java運(yùn)行系統(tǒng)會(huì)將其對(duì)應(yīng)的記憶體空間設(shè)置標(biāo)記;而當(dāng)一個(gè)對(duì)象結(jié)束使用時(shí),會(huì)自動(dòng)清除標(biāo)記。有了這種標(biāo)記設(shè)置和清除的規(guī)則,Java垃圾收集器就可以通過(guò)週期性地掃描所有Java對(duì)象有關(guān)的記憶體區(qū)域標(biāo)記,將沒(méi)有標(biāo)記的記憶體區(qū)列入可供分配的範(fàn)疇,從而起到垃圾收集作用。3.5類的繼承和類的多態(tài)性3.5.1類的繼承 類的繼承是面向?qū)ο蟮某淌皆O(shè)計(jì)語(yǔ)言所具有的重要技術(shù)。有了繼承技術(shù),程式設(shè)計(jì)時(shí),就可以先定義一個(gè)包含公用變數(shù)和公用方法的類作為父類,再在此基礎(chǔ)上創(chuàng)建具有專用變數(shù)和專用方法的子類。子類一方面可以增加父類中沒(méi)有的變數(shù)和方法,另一方面還可以在繼承基礎(chǔ)上再定義父類中已有的變數(shù)和方法。 Java系統(tǒng)要求應(yīng)用程式中每個(gè)類都有父類,如果一個(gè)類的定義中沒(méi)有用關(guān)鍵字extends明確指出父類名,則Java系統(tǒng)默認(rèn)這個(gè)類的父類為系統(tǒng)軟體包java.1ang中的Object類。父類中凡是公用型的、保護(hù)型的或者專用保護(hù)型的變數(shù)和方法均可由子類直接調(diào)用,只有父類的專用型變數(shù)和專用型方法不能被子類調(diào)用。例3-3://Point.javapublicclassPoint{protectedintx,y;publicPoint(){setPoint(0,0);}publicPoint(inta,intb){setPoint(a,b);}publicvoidsetPoint(inta,intb){x=a;y=b;}publicintgetX(){returnx;}publicintgetY(){returny;}publicStringtoString(){return"["+x+","+y+"]";}}//Circle.javapublicclassCircleextendsPoint{protecteddoubleradius;publicCircle(){setRadius(0);}publicCircle(doubler,inta,intb){super(a,b);setRadius(r);}publicvoidsetRadius(doubler){radius=(r>=0.0?r:0.0);}publicdoublegetRadius(){returnradius;}publicdoublearea(){returnMath.PI*radius*radius;}publicStringtoString(){return"Center="+super.toString()+";Radius="+radius;}}//Cylinder.javapublicclassCylinderextendsCircle{protecteddoubleheight;publicCylinder(){setHeight(0);}publicCylinder(doubleh,doubler,inta,intb){super(r,a,b);setHeight(h);}publicvoidsetHeight(doubleh){height=(h>=0?h:0);}publicdoublegetHeight(){returnheight;}publicdoublearea(){return2*super.area()+2*Math.PI*radius*height;}publicdoublevolume(){returnsuper.area()*height;}publicStringtoString(){returnsuper.toString()+";Height="+height;}}//Test.javaimportjavax.swing.JOptionPane;importjava.text.DecimalFormat;publicclassTest{publicstaticvoidmain(Stringargs[]){Cylinderc=newCylinder(5.7,2.5,12,23);DecimalFormatprecision2=newDecimalFormat("0.00");Stringoutput;output="Xcoordinateis"+c.getX()+"\nYcoordinateis"+c.getY()+"\nRadiusis"+c.getRadius()+"\nHeightis"+c.getHeight();c.setHeight(10);c.setRadius(4.25);c.setPoint(2,2);output+="\n\nThenewlocation,radius"+"andheightofcare\n"+c+"\nAreais"+precision2.format(c.area())+"\nVolumeis"+precision2.format(c.volume());JOptionPane.showMessageDialog(null,output,"DemonstratingClassCylinder",

JOptionPane.INFORMATION_MESSAGE);System.exit(0);}}運(yùn)行結(jié)果見圖3-3。圖3-3 程式分析:Circle類繼承了Point類。這意味著Circle的public介面除了包括Circle類的setRadius、getRadius、area、toString方法和Circle的構(gòu)造函數(shù)外,還包括Point的方法。應(yīng)用程式Test用來(lái)測(cè)試Cylinder類。 注意Cylinder類繼承了Circle類,即Cylinder的public介面除了包括Cylinder構(gòu)造函數(shù),Cylinder的方法setHeight、getHeight、area(覆蓋Circle的area方法)、volume和toSting外,還包括Circle的方法。Test應(yīng)用程式的main方法首先實(shí)例化了Cylinder類的一個(gè)對(duì)象,然後用“獲取”方法獲取關(guān)於Cylinder對(duì)象的資訊。同樣,這裏的main方法也不能直接引用Cylinder類的protected數(shù)據(jù)。3.5.2類的多態(tài)性 如果你想要使用多態(tài)性,則所需的條件概括如下。 (1)對(duì)派生類對(duì)象方法的調(diào)用必須通過(guò)基類的變數(shù)。 (2)被調(diào)用的方法必須也是基類的一個(gè)成員。(3)在基類與派生類中這個(gè)方法的方法名必須相同。(4)在基類與派生類中這個(gè)方法的返回類型必須相同。(5)在派生類中這個(gè)方法的訪問(wèn)修飾符限制不能超過(guò)基類中的限制。3.6接口與包3.6.1介面 介面是和類很相似而又有區(qū)別的一種結(jié)構(gòu),介面的設(shè)計(jì)和調(diào)用也是Java程式設(shè)計(jì)的重要技術(shù)。從結(jié)構(gòu)上,介面有如下特點(diǎn)。 (1)介面用關(guān)鍵字interface來(lái)定義,而不是用class。(2)介面中定義的變數(shù)全是最終的靜態(tài)變數(shù)。(3)介面中沒(méi)有自身的構(gòu)造方法,而且定義的其他方法全是抽象方法,即只提供方法的定義,而沒(méi)有提供方法的實(shí)現(xiàn)語(yǔ)句。(4)介面採(cǎi)用多重繼承機(jī)制,而不是採(cǎi)用類的單一繼承機(jī)制。3.6.2包 1.聲明自己的程式包 2.程式包的引用 3.Java的系統(tǒng)程式包第4章異常處理和常用系統(tǒng)類4.1異常處理機(jī)制4.2String類和StringBuffer類4.3AWT4.4Javaapplet4.1異常處理機(jī)制4.1.1什麼是異常 用任何一種電腦語(yǔ)言設(shè)計(jì)的程式在運(yùn)行時(shí)都可能出現(xiàn)各種錯(cuò)誤,常見的錯(cuò)誤如除數(shù)為0、檔不存在、檔不能打開、數(shù)組下標(biāo)超過(guò)界限、記憶體不夠用等。對(duì)於這種在運(yùn)行中出現(xiàn)的錯(cuò)誤,電腦系統(tǒng)中通常有兩種處理辦法。 (1)由電腦系統(tǒng)本身直接檢測(cè)程式錯(cuò)誤,遇到錯(cuò)誤時(shí)使程式終止運(yùn)行。這種處理方法的優(yōu)點(diǎn)是使程式設(shè)計(jì)比較簡(jiǎn)單。但是,對(duì)程式錯(cuò)誤一概地採(cǎi)用終止運(yùn)行辦法,顯然過(guò)於簡(jiǎn)單化。因?yàn)橛行┣闆r下,完全可以通過(guò)其他途徑保持程式繼續(xù)運(yùn)行。比如,由於檔案名不符合要求而無(wú)法打開檔,那麼,可以提示用戶輸入一個(gè)新的檔案名,從而使程式繼續(xù)往下運(yùn)行。 (2)由程式員在程式設(shè)計(jì)中兼顧錯(cuò)誤檢測(cè)、錯(cuò)誤資訊顯示和出錯(cuò)處理。這種處理方法的優(yōu)點(diǎn)是減少了中途終止程式運(yùn)行的可能性。但是,要求程式員在程式設(shè)計(jì)中不僅將精力用於正常處理過(guò)程,還要精心考慮錯(cuò)誤檢測(cè)和處理,這會(huì)使程式變得複雜。並且,這類錯(cuò)誤檢測(cè)往往是多數(shù)程式中重複甚至在一個(gè)程式中多次重複。而另一方面,如果程式中某處忽略了應(yīng)有的檢測(cè),又將引起程式總體結(jié)果的錯(cuò)誤。 Java採(cǎi)用異常處理機(jī)制來(lái)處理程式運(yùn)行中的錯(cuò)誤。按照這種機(jī)制,將程式運(yùn)行中的所有錯(cuò)誤都看成一種異常,通過(guò)對(duì)語(yǔ)句塊的檢測(cè),一個(gè)程式中所有的異常被收集起來(lái)放在程式的某一段中去處理。在Java系統(tǒng)中,專門設(shè)置了一個(gè)調(diào)用棧,此棧中裝有指向異常處理方法的指針。 在程式運(yùn)行時(shí),系統(tǒng)會(huì)把收集到的異常和異常處理指針?biāo)傅奶幚眍愋椭饌€(gè)比較,如果找到相符的類型,那麼就轉(zhuǎn)向相應(yīng)的方法處理,如沒(méi)有在調(diào)用棧中找到相應(yīng)的類型指針,則終止程式運(yùn)行,並顯示解釋資訊。在Java程式中,異常一般由以下兩種原因引起。(1)程式中存在非法操作,最簡(jiǎn)單的例子就是除數(shù)為0的除法操作。這種原因常常是程式員出於無(wú)意或大意造成的,所以稱為隱式異常。常見的隱式異??梢酝ㄟ^(guò)java.lang包中的Throwable類的子類Error處理。 (2)程式員在程式中使用了throw語(yǔ)句引起的異常。這種異常是程式員出於某種考慮有意安排的,所以稱為顯式異常。在throw語(yǔ)句中,都會(huì)指出處理顯式異常的對(duì)象,這些對(duì)象都是由java.lang包的類Throwable的子類Exception再派生的子類生成的,每個(gè)對(duì)象完成對(duì)某種異常的處理功能,這些對(duì)象綜合起來(lái)實(shí)現(xiàn)各種異常處理。比如Array-IndexOutOfBoundsException子類處理數(shù)組越界異常,IOException子類處理輸入輸出異常,而ArithmeticException子類處理除數(shù)為0導(dǎo)致的算術(shù)異常等。4.1.2異常的層次結(jié)構(gòu)4.1.3異常的處理4.1.4創(chuàng)建自己的異常4.2String類和StringBuffer類4.2.1String類1.String類的主要構(gòu)造方法 String類有多個(gè)構(gòu)造方法,主要的有下列5個(gè):String();String(charchars[]);String(charchars[],intstartIndex,intnumChars);String(byteascii[],inthiByte);String(byteascii[],inthiByte,intstartIndex,intnumChars);第1個(gè)構(gòu)造方法生成一個(gè)空串。第2個(gè)構(gòu)造方法生成一個(gè)字元數(shù)組。第3個(gè)構(gòu)造方法生成一個(gè)字串,這個(gè)字串是從字元數(shù)組chars[]中提取的,具體講,即從chars[]數(shù)組的startIndex位置開始提取字元,共提取numChars個(gè)字元組成一個(gè)字串。第4個(gè)構(gòu)造方法是以位元組數(shù)組的形式生成一個(gè)字串,數(shù)組中存放字串各字元對(duì)應(yīng)的ASCII碼。第5個(gè)構(gòu)造方法也是從位元組數(shù)組生成一個(gè)字串。具體講,就是以位元組數(shù)組ascii[]的startIndex處開始,共提取numChars個(gè)字元構(gòu)成字串,如為ASCII字元,則hiByte的值為0。例4-5:importjavax.swing.*;publicclassStringConstructors{publicstaticvoidmain(Stringargs[]){charcharArray[]={'b','i','r','t','h','','d','a','y'};bytebyteArray[]={(byte)'n',(byte)'e',(byte)'w',(byte)'',(byte)'y',(byte)'e',(byte)'a',(byte)'r'};StringBufferbuffer;Strings,s1,s2,s3,s4,s5,s6,s7,output;s=newString("hello");buffer=newStringBuffer("WelcometoJavaProgramming!");s1=newString();s2=newString(s);s3=newString(charArray);s4=newString(charArray,6,3);s5=newString(byteArray,4,4);s6=newString(byteArray);s7=newString(buffer);output="s1="+s1+"\ns2="+s2+"\ns3="+s3+"\ns4="+s4+"\ns5="+s5+"\ns6="+s6+"\ns7="+s7;JOptionPane.showMessageDialog(null,output,"DemonstratingStringClassConstructors",

JOptionPane.INFORMATION_MESSAGE);System.exit(0);}}運(yùn)行結(jié)果見圖4-5。圖4-5程式分析:String類提供了9個(gè)構(gòu)造函數(shù),以便使用各種方法初始化String對(duì)象。例題共演示了7種。程式“s1=newString()”實(shí)例化一個(gè)新的String對(duì)象,並使用String類的缺省構(gòu)造函數(shù)將它賦給引用s1。新的String對(duì)象沒(méi)有字元(即空串),長(zhǎng)度為0。“s2=newString(s);”例化一個(gè)新的String對(duì)象,並使用String類的拷貝構(gòu)造函數(shù),將它賦給引用s2。s被當(dāng)作參數(shù)傳送給構(gòu)造函數(shù),新的String對(duì)象包含了String對(duì)象s中的字元的拷貝。在大多數(shù)情況下,沒(méi)有必要拷貝已有的String對(duì)象。String對(duì)象是不變的,一旦創(chuàng)建後就不能改變它們的內(nèi)容(字串)。而且,如果有一個(gè)或多個(gè)引用指向某個(gè)String對(duì)象,垃圾收集器就不能回收該對(duì)象。也就是說(shuō),String引用既不能用於修改String對(duì)象,也不能刪除String對(duì)象。這一點(diǎn)與C語(yǔ)言或C++語(yǔ)言是不同的。“s3=newString(charArray);”實(shí)例化一個(gè)新的String對(duì)象,並使用以字元數(shù)組為參數(shù)的String類構(gòu)造函數(shù),將它賦給引用s3。新的String對(duì)象包含了數(shù)組中字元的拷貝?!皊4=newString(charArray,6,3);”實(shí)例化一個(gè)String對(duì)象,使用以一個(gè)字元數(shù)組和兩個(gè)整數(shù)為參數(shù)的String類構(gòu)造函數(shù),將它賦給引用s4。第2個(gè)參數(shù)指定了在數(shù)組中拷貝字元的起始位置(offset)。第3個(gè)參數(shù)指定了數(shù)組中拷貝字元的數(shù)目(count),新的String對(duì)象包含了數(shù)組中指定字元的拷貝。如果offset或count參數(shù)指定的所取元素超過(guò)了字元數(shù)組的界限,就會(huì)產(chǎn)生StringIndexOutOfBoundsException的例外處理。“s5=newString(byteArray,4,4);”實(shí)例化一個(gè)新的String對(duì)象,使用以一個(gè)byte數(shù)組和兩個(gè)整數(shù)為參數(shù)的String類構(gòu)造函數(shù),將它賦給引用s5。第2和第3個(gè)參數(shù)分別指定了offset和count。新的String對(duì)象包含了數(shù)組中指定byte的拷貝。如果offset或count參數(shù)指定的所取元素超過(guò)了byte數(shù)組的界限,就會(huì)產(chǎn)生一個(gè)StringIndexOutOfBoundsException的例外處理?!皊6=newString(byteArray);”實(shí)例化一個(gè)新的String對(duì)象,使用以一個(gè)byte數(shù)組為參數(shù)的String類構(gòu)造函數(shù),將它賦給引用s6。新的String對(duì)象包含了數(shù)組中byte的拷貝?!皊7=newString(buffer);”實(shí)例化一個(gè)新的String對(duì)象,使用以StringBuffer為參數(shù)的String類構(gòu)造函數(shù),將它賦給引用s7。StringBuffer是一個(gè)可動(dòng)態(tài)改變大小和內(nèi)容的字串。新的String對(duì)象包含了StringBuffer中字元的拷貝。2.String類的length、charAt和getChars方法 下麵的例子演示了String類的length、charAt和getChars方法,它們分別用於確定String類的長(zhǎng)度、取String某一指定位置的字元以及取String某一子串。3.String類的字串比較例4-7:importjavax.swing.JOptionPane;publicclassStringCompare{publicstaticvoidmain(Stringargs[]){ Strings1,s2,s3,s4,output;s1=newString("hello");s2=newString("goodbye");s3=newString("HappyBirthday");s4=newString("happybirthday");output="s1="+s1+"\ns2="+s2+"\ns3="+s3+"\ns4="+s4+"\n\n";if(s1.equals("hello"))output+="s1equals\"hello\"\n";elseoutput+="s1doesnotequal\"hello\"\n";if(s1=="hello")output+="s1equals\"hello\"\n";elseoutput+="s1doesnotequal\"hello\"\n";if(s3.equalsIgnoreCase(s4))output+="s3equalss4\n";elseoutput+="s3doesnotequals4\n";output+="\pareTo(s2)is"+pareTo(s2)+"\pareTo(s1)is"+pareTo(s1)+"\pareTo(s1)is"+pareTo(s1)+"\pareTo(s4)is"+pareTo(s4)+"\pareTo(s3)is"+pareTo(s3)+"\n\n";if(s3.regionMatches(0,s4,0,5))output+="First5charactersofs3ands4match\n";elseoutput+="First5charactersofs3ands4donotmatch\n";if(s3.regionMatches(true,0,s4,0,5))output+="First5charactersofs3ands4match";elseoutput+="First5charactersofs3ands4donotmatch";JOptionPane.showMessageDialog(null,output,"DemonstratingStringClassConstructors",

JOptionPane.INFORMATION_MESSAGE);System.exit(0);}}4.在字串中定位字元和子串5.從字串中抽取子串6.字串連接publicStringconcat(Stringst)可返回一個(gè)字串,它將把參數(shù)str添加在原字串的後面形成一個(gè)新的字串。但在Java中,更多的是使用“+”來(lái)連接字串。這裏讀者可能會(huì)產(chǎn)生一個(gè)小小的迷惑,因?yàn)榍懊嫖覀冎v過(guò)String對(duì)象是不能改變的。實(shí)際上,字串的連接是由編譯器利用StringBuffer的方法append來(lái)實(shí)現(xiàn)的。這在下面的章節(jié)中講解。例4-10:importjavax.swing.*;publicclassStringConcat{publicstaticvoidmain(Stringargs[]){Strings1=newString("Happy"),s2=newString("Birthday"),output;output="s1="+s1+"\ns2="+s2;output+="\n\nResultofs1.concat(s2)="+s1.concat(s2);output+="\ns1afterconcatenation="+s1;JOptionPane.showMessageDialog(null,output,"DemonstratingStringMethodconcat",JOptionPane.INFORMATION_MESSAGE);System.exit(0);}}運(yùn)行結(jié)果見圖4-10。7.轉(zhuǎn)化為字串圖4-104.2.2StringBuffer類 String類提供了很多處理字串的功能。但是,一旦創(chuàng)建了字串對(duì)象,它的內(nèi)容就永遠(yuǎn)不會(huì)變。下麵將討論StringBuffer類的特點(diǎn)。這個(gè)類可以創(chuàng)建和操縱動(dòng)態(tài)字串,即可修改的字串。每個(gè)StringBuffer都能夠存儲(chǔ)由它的容量所指定的一些字元。如果超過(guò)了StringBuffer的容量,容量就會(huì)自動(dòng)地?cái)U(kuò)大以容納多出來(lái)的字元。我們將看到,StringBuffer類還可用來(lái)實(shí)現(xiàn)用於字串連接的運(yùn)算符"+"。 String對(duì)象是常量字串,StringBuffer對(duì)象是可修改的字串。Java區(qū)分字串和可修改的字串是為了優(yōu)化的目的。特別地,Java可以實(shí)現(xiàn)有關(guān)String對(duì)象的某些優(yōu)化,例如多個(gè)引用共用一個(gè)String對(duì)象,因?yàn)樗肋@些對(duì)象不會(huì)改變。 注意:在選擇是用String對(duì)象還是用StringBuffer對(duì)象來(lái)表示一個(gè)字串時(shí),如果該對(duì)象確實(shí)不會(huì)改變,則總是使用String對(duì)象,這樣做可以改善性能。對(duì)String對(duì)象調(diào)用非String類的StringBuffer方法是一種語(yǔ)法錯(cuò)誤。StringBuffer提供的方法有一些與String相同,有一些不同。最主要的方法有兩組,一組是append,另一組是insert。4.3AWT4.3.1AWT概述4.3.2AWT的特點(diǎn)4.3.3AWT應(yīng)用4.4Javaapplet4.4.1Javaapplet的特點(diǎn) Javaapplet與Java應(yīng)用程式不同。它們的不同之處有以下幾個(gè)方面。 (1)Java應(yīng)用程式中,必須有一個(gè)main()方法。Main()方法是程式的入口,當(dāng)程式開始運(yùn)行時(shí),解釋器首先查找main()方法並執(zhí)行。而Javaapplet中則不需要main()方法,它必須嵌入HTML檔中,由支持Javaapplet的流覽器運(yùn)行。(2)Java應(yīng)用程式可以獨(dú)立運(yùn)行。而Javaapplet不能獨(dú)立運(yùn)行,需要依賴於網(wǎng)路流覽器。(3)Java應(yīng)用程式所實(shí)現(xiàn)的功能是完全的,不需依賴於其他程式。而Javaapplet實(shí)現(xiàn)的功能是不完全的,它必須借助於流覽器中預(yù)先設(shè)計(jì)好的功能和已有的圖形介面。Javaapplet只需接收流覽器發(fā)送給它的消息,並及時(shí)做出回應(yīng)。 (4)Java應(yīng)用程式中的所有方法的使用是通過(guò)調(diào)用實(shí)現(xiàn)的??梢匀藶榭刂?。而Javaapplet中有一部分方法是固定的,只能由流覽器在特定時(shí)刻和場(chǎng)合調(diào)用,不能人為控制,但可以重載。4.4.2Javaapplet的程式結(jié)構(gòu) Javaapplet的一般程式結(jié)構(gòu)如下: importjava.applet.*; importjava.awt.*; publicclass子類名extendsApplet //定義Applet類的子類{publicvoidinit(){方法體}//初始化方法

publicvoidstart(){方法體}//開始執(zhí)行方法

publicvoidstop(){方法體}//停止執(zhí)行方法

publicvoiddestroy(){方法體}//退出方法

publicvoidpaint(Graphicsg){方法體}//繪畫方法}……從Javaapplet程式結(jié)構(gòu)看出,Javaapplet由若干類組成,無(wú)需main()方法,但必須有且僅有一個(gè)主類,該類是Applet類的子類,且被聲明為public。程式被保存時(shí),程式名必須命名為主類名,即程式名與主類名完全相同,尾碼為.java。主類中定義了init()、start()、stop()、destroy()和paint()方法,這些方法是從Applet中繼承的,有固定的含義,由流覽器在時(shí)機(jī)成熟時(shí)自動(dòng)執(zhí)行。4.4.3Applet的主要方法 在流覽器中運(yùn)行Applet程式,從運(yùn)行開始到運(yùn)行結(jié)束,Applet程式需經(jīng)歷4個(gè)狀態(tài),分別是初始狀態(tài)、運(yùn)行狀態(tài)、停止態(tài)和消亡狀態(tài)。這4種狀態(tài)分別對(duì)應(yīng)Applet的4個(gè)主要方法:init()、start()、stop()和destroy()。 對(duì)於支持Java的流覽器,如果在運(yùn)行一個(gè)HTML檔時(shí)發(fā)現(xiàn)該檔包含Applet程式,流覽器就會(huì)生成該Applet的一個(gè)實(shí)例,並調(diào)用init()方法,進(jìn)入初始化狀態(tài),在該狀態(tài)下完成Applet的一些初始化操作。初始化完成後,流覽器接著調(diào)用start()方法,進(jìn)入運(yùn)行狀態(tài),真正開始執(zhí)行Applet,在該狀態(tài)下Applet通常會(huì)啟動(dòng)一些線程執(zhí)行各種任務(wù)。 當(dāng)退出當(dāng)前主頁(yè)時(shí),流覽器調(diào)用stop()方法終止在運(yùn)行狀態(tài)下啟動(dòng)的線程,進(jìn)入停止?fàn)顟B(tài)。當(dāng)用戶退出流覽器時(shí),流覽器首先調(diào)用Applet的stop()方法,停止Applet的執(zhí)行,然後調(diào)用destroy()方法釋放Applet佔(zhàn)用的系統(tǒng)資源,進(jìn)入消亡狀態(tài)。下麵具體介紹init()、start()、stop()和destroy()4種方法。1.Init()方法在Applet執(zhí)行過(guò)程中,init()方法只執(zhí)行一次。當(dāng)流覽器第一次流覽含有Applet的Web頁(yè)載入Applet時(shí),就會(huì)執(zhí)行init()方法。由於在Applet執(zhí)行過(guò)程中,該方法只被執(zhí)行一次,所以可以在init()方法中進(jìn)行一些只需執(zhí)行一次的初始化操作,如變數(shù)的初始化、設(shè)置Applet初始狀態(tài)、載入圖形或字體、獲取HTML中Applet標(biāo)記單元中<PARAM>設(shè)定的參數(shù)等。2.start()方法調(diào)用完init()方法,流覽器將調(diào)用start()方法啟動(dòng)Applet。和init()方法不同,在Applet的執(zhí)行過(guò)程中,start()方法可被流覽器調(diào)用多次。在下列情況下,流覽器會(huì)調(diào)用start()方法。(1)流覽器從圖示狀態(tài)恢復(fù)為窗口狀態(tài)或縮放流覽器窗口時(shí)。(2)Applet第一次載入時(shí)。(3)離開該Web頁(yè)後又再返回時(shí)。(4)reload該頁(yè)面時(shí)。在start()方法中可啟動(dòng)相關(guān)線程來(lái)控制Applet,給引入類對(duì)象發(fā)送消息,或以某種方式通知Applet開始運(yùn)行。該方法是Applet的主體。3.stop()方法該方法與start()方法是相對(duì)應(yīng)的,在Applet執(zhí)行過(guò)程中,也會(huì)被流覽器調(diào)用多次。在下列情況下,流覽器會(huì)調(diào)用stop()方法。(1)流覽器從圖示狀態(tài)恢復(fù)為窗口狀態(tài)或縮放流覽器窗口時(shí)。(2)離開Applet所在Web頁(yè)時(shí)。(3)reload該頁(yè)面時(shí)。(4)關(guān)閉該Web頁(yè)時(shí)。(5)從該Web頁(yè)退出流覽器運(yùn)行時(shí)。stop()方法可在適當(dāng)時(shí)機(jī)掛起Applet,停止一些佔(zhàn)用系統(tǒng)資源的工作,釋放系統(tǒng)處理資源,以提高系統(tǒng)的運(yùn)行速度。4.destroy()方法在徹底結(jié)束對(duì)該Web頁(yè)的訪問(wèn)或退出流覽器時(shí)調(diào)用destroy()方法,卸載Applet,釋放載入Applet時(shí)分配的系統(tǒng)資源。在Applet的執(zhí)行過(guò)程中,destroy()方法只執(zhí)行一次。destroy()方法是Applet類的類方法,只能用於Applet??稍谠摲椒ㄖ袌?zhí)行釋放系統(tǒng)資源的代碼。但一般不需重寫destroy()方法,因?yàn)镴ava運(yùn)行系統(tǒng)本身會(huì)自動(dòng)進(jìn)行“垃圾”處理和記憶體管理,除非用了特殊的資源如創(chuàng)建的線程。注意:destroy()方法與stop()方法不同。除了上述4個(gè)方法外,Applet還提供一個(gè)非常重要的方法:paint(Graphicsg)方法。該方法用於進(jìn)行繪圖的具體操作,但沒(méi)有實(shí)現(xiàn)任何操作,用戶可重寫該方法,實(shí)現(xiàn)個(gè)性化的繪圖操作。在Applet執(zhí)行過(guò)程中,paint()方法可以被流覽器自動(dòng)調(diào)用執(zhí)行繪圖操作,可調(diào)用多次。當(dāng)調(diào)整流覽窗口大小、縮放流覽窗口、移動(dòng)窗口或reload等需要重繪窗口時(shí)都會(huì)調(diào)用paint()方法。與其他4個(gè)方法不同的是,paint()中需傳遞一個(gè)參數(shù),該參數(shù)是Graphics類的對(duì)象,由這個(gè)對(duì)象來(lái)完成具體的繪圖操作。Graphics對(duì)象由流覽器自動(dòng)創(chuàng)建並將其傳送給paint()方法。注意:應(yīng)在Applet中引入Graphics類的包或該類:importjava.awt.Graphics;例4-16:importjava.applet.*;importjava.awt.*;publicclassexample4_16extendsApplet{privateintInitCount;privateintStartCount;privateintStopCount;privateintDestroyCount;privateintPaintCount;publicexample4_16(){InitCount=0;StartCount=0;StopCount=0;DestroyCount=0;PaintCount=0;}publicvoidinit(){InitCount++;}publicvoiddestroy(){DestroyCount++;}publicvoidstart(){StartCount++;}publicvoidstop(){StopCount++;}publicvoidpaint(Graphicsg){PaintCount++;g.drawString("Paint()方法執(zhí)行了:"+PaintCount+"次。",20,20);

g.drawString("Init()方法執(zhí)行了:"+InitCount+"次。",20,70);

g.drawString("Start()方法執(zhí)行了:"+StartCount+"次。",20,120);

g.drawString("Stop()方法執(zhí)行了:"+StopCount+"次。",20,170);

g.drawString("Destroy()方法執(zhí)行了:"+DestroyCount+"次。",20,220);}}4.4.4Javaapplet的運(yùn)行 Javaapplet程式不能獨(dú)立運(yùn)行,必須由流覽器來(lái)運(yùn)行,因此我們需編寫一個(gè)HTML檔,通過(guò)<applet>標(biāo)記將applet程式編譯生成的位元組碼檔嵌入HTML檔,通知流覽器來(lái)運(yùn)行Javaapplet。 如要運(yùn)行例4-16,可編寫如下的HTML檔:<html><head><title>example4_16</title></head><body><appletcode=example4_16.classwidth=300height=250></applet></body></html>第5章圖形用戶介面5.1文本框和文本區(qū)5.2標(biāo)簽5.3按鈕5.4選擇框5.5畫布5.6面板與佈局設(shè)計(jì)5.7窗口5.8菜單5.9對(duì)話框5.1文本框和文本區(qū)5.1.1文本框及處理事件1.文本框的創(chuàng)建2.文本框處理事件 例5-2:兩個(gè)空白文本框,當(dāng)在第一個(gè)文本框內(nèi)輸入字元時(shí),在文本框內(nèi)顯示“*”號(hào),輸入完畢按回車鍵後,在第二個(gè)文本框內(nèi)顯示:Theend。importjava.awt.*;importjava.applet.Applet;importjava.awt.event.*;publicclassEx6_2extendsApplet{TextFieldtf1=newTextField(20);TextFieldtf2=newTextField(20);

publicvoidinit(){add(tf1);tf1.setEchoChar('*');add(tf2);tf1Listeneral=newtf1Listener();tf1.addActionListener(a1);}classtf1ListenerimplementsActionListener{

publicvoidactionPerformed(ActionEvente){tf2.setText("Theend");}}}運(yùn)行結(jié)果見圖5-2。圖5-15.1.2文本區(qū)及處理事件 例5-4:在Applet中添加一個(gè)文本框和一個(gè)文本區(qū),每當(dāng)在文本框中輸入一個(gè)字元時(shí),在文本區(qū)內(nèi)就附加一行文本:Thetextischanged。 importjava.awt.*; importjava.applet.Applet; importjava.awt.event.*;publicclassEx6_4extendsApplet{TextFieldtf1=newTextField(20);TextAreata1=newTextArea(null,6,40);publicvoidinit(){add(tf1);add(ta1);tf1.addTextListener(newTextL());}classTextLimplementsTextListener{

publicvoidtextValueChanged(TextEvente){ta1.append("\nThetextischanged");}}}運(yùn)行結(jié)果見圖5-4。圖5-45.2標(biāo)簽 標(biāo)籤(Label)是AWT構(gòu)件中最簡(jiǎn)單的一種構(gòu)件,所謂標(biāo)籤實(shí)質(zhì)上就是一段文字,但它與文字不同的是它是一個(gè)對(duì)象,所以在每次repaint時(shí),不用重新添加。標(biāo)籤在GUI介面中通常作為提示資訊使用。標(biāo)籤構(gòu)件的構(gòu)造方法如下。(1)Label()構(gòu)造一個(gè)空的標(biāo)籤。(2)Label(Stringstr)構(gòu)造一個(gè)以Stringstr為內(nèi)容的標(biāo)籤。(3)Label(Stringstr,intalign)定義一個(gè)以Stringstr為內(nèi)容的標(biāo)籤。5.3按鈕5.3.1按鈕 按鈕(Button)是GUI用戶介面中常用的元素,它是用戶輸入命令的一個(gè)重要工具。當(dāng)用滑鼠單擊某個(gè)按鈕該按鈕獲得焦點(diǎn)時(shí),在鍵盤上按回車鍵都會(huì)導(dǎo)致一個(gè)命令的執(zhí)行。Button類有兩種構(gòu)造方法。 (1)Button()構(gòu)造一個(gè)沒(méi)有標(biāo)籤的按鈕。 (2)Button(Stringstr)構(gòu)造一個(gè)以Stringstr為標(biāo)籤的按鈕。5.3.2按鈕處理事件 與按鈕有關(guān)的事件有兩類。1.ActionEvent 當(dāng)用滑鼠單擊按鈕,或當(dāng)按鈕獲得焦點(diǎn)時(shí)在鍵盤上按回車鍵都導(dǎo)致該事件的發(fā)生,此時(shí)任何實(shí)現(xiàn)了被註冊(cè)為監(jiān)聽者的ActionListener介面的類,它的actionPerformed()方法將被調(diào)用。下麵的程式範(fàn)例在Applet上添加兩個(gè)命令按鈕,其標(biāo)籤分別為“顯示”和“清除”,當(dāng)單擊“顯示”按鈕時(shí),在文本區(qū)中顯示:“你按下了顯示按鈕”,當(dāng)按“清除”按鈕時(shí)則清除文本區(qū)中顯示的字元。例5-6:文本區(qū)事件處理。importjava.awt.*;importjava.applet.Applet;importjava.awt.event.*;publicclassEx6_6extendsApplet{Buttonb1=newButton("顯示");

Buttonb2=newButton("清除");

TextAreata1=newTextArea(null,6,40);publicvoidinit(){add(b1);add(b2);add(ta1);b1.addActionListener(newButtenL());b2.addActionListener(newButtenL());}

classButtenLimplementsActionListener{publicvoidactionPerformed(ActionEvente){if(e.getSource()==b1)ta1.append("\n你按下了"顯示"按鈕");

elseta1.append("\n你按下了"清除"按鈕");}}}運(yùn)行結(jié)果見圖5-6。圖5-62.FocusEvent FocusEvent稱作焦點(diǎn)事件,它的發(fā)生是指鍵盤游標(biāo)移動(dòng)到構(gòu)件上並且可以接受鍵盤的輸入。如果游標(biāo)移動(dòng)到一個(gè)按鈕上,稱作該按鈕獲得焦點(diǎn),反之稱作失去焦點(diǎn)。當(dāng)一個(gè)按鈕獲得焦點(diǎn)時(shí)單擊回車鍵即相當(dāng)於用滑鼠單擊該按鈕。如果一個(gè)文本框獲得焦點(diǎn)就可以在該文本框中輸入字元。例5-7:按鈕和文本框檢測(cè)焦點(diǎn)事件的例子。程式如下:importjava.awt.*;importjava.applet.Applet;importjava.awt.event.*;publicclassEx6_7extendsApplet{TextFieldtxt1=newTextField("txt1",50);TextFieldtxt2=newTextField("txt2",50);Buttonbutton1=newButton("button1");Buttonbutton2=newButton("button2");classKeytryimplementsFocusListener{

publicvoidfocusGained(FocusEvente){txt1.setText("txt1:paramString()="+e.paramString());if(e.getSource()==txt1)txt2.setText("txt2:focusisontxt1");elsetxt2.setText("txt2:focusisonbutton1");}

publicvoidfocusLost(FocusEvente){txt1.setText("txt1:paramString()="+e.paramString());txt2.setText("txt2:focuslostoutsidebutton1ortxt1");}}Keytryal=newKeytry();

publicvoidinit(){setLayout(newFlowLayout());txt1.addFocusListener(al);button1.addFocusListener(al);add(button1);add(button2);add(txt1);add(txt2);}}運(yùn)行結(jié)果見圖5-7。圖5-7在上面的例子中,只有button1和txt1註冊(cè)了焦點(diǎn)事件的事件監(jiān)聽者,它們共用同一個(gè)事件處理程式。如果焦點(diǎn)在button1或txt1上面,文本框txt2顯示焦點(diǎn)在哪個(gè)構(gòu)件上(focusGaned),反之則指出無(wú)焦點(diǎn)(focusLost)。文本框txt1內(nèi)顯示事件的參數(shù)字串,它也能指出是否有焦點(diǎn)。另外,程式中的setLayout(newFlowLayout())語(yǔ)句是控制構(gòu)件的佈局用的,關(guān)於這個(gè)問(wèn)題將在後面的章節(jié)中進(jìn)行討論。5.4選擇框5.4.1選擇框1.下拉列表框(Choice)2.列表框(List)3.複選框(Checkbox)4.單選框(Checkboxgroup-RadioButton)5.4.2選擇框處理事件 例5-12:選擇框檢測(cè)ItemEvent事件的例子。

importjava.awt.*; importjava.applet.Applet; importjava.awt.event.*;publicclassEx6_12extendsAppletimplementsItemListener{TextAreata1=newTextArea(null,6,40);Stringsubject[]={"語(yǔ)文","數(shù)學(xué)","政治","外語(yǔ)","物理","化學(xué)"};

Checkboxcb[]=newCheckbox[6];publicvoidinit(){add(newLabel("請(qǐng)選擇:"));

for(intI=0;I<6;I++){cb[I]=newCheckbox(subject[I]);add(cb[I]);cb[I].addItemListener(this);}add(ta1);}

publicvoiditemStateChanged(ItemEvente){ta1.append("\n你在複選框中的選擇是:"+e.getItem());}}運(yùn)行結(jié)果見圖5-12。圖5-125.5畫布例5-13:創(chuàng)建一個(gè)畫布。importjava.awt.*;importjava.applet.Applet;importjava.util.*;publicclassmycanvasextendsApplet{

publicvoidinit(){MyCanvas1mc=newMyCanvas1();mc.setBackground(Color.green);mc.setSize(150,150);add(mc);}}classMyCanvas1extendsCanvas{publicvoidpaint(Graphicsg){g.fillOval(40,20,80,80);}}運(yùn)行結(jié)果見圖5-13。圖5-135.6面板與佈局

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論