




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(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ǔ)一種特定類(lèi)型的數(shù)據(jù)。在程式中直接給出的數(shù)值被稱(chēng)作直接量,直接量可以是一個(gè)具體的數(shù)值或字串,每個(gè)直接量也屬於一個(gè)特定的類(lèi)型。2.3數(shù)據(jù)類(lèi)型2.3.1integer數(shù)據(jù)類(lèi)型 (1)位元組(byte)型 (2)短整(short)型 (3)整(int)型 (4)長(zhǎng)整(long)型2.3.2浮點(diǎn)數(shù)據(jù)類(lèi)型 (1)單精確度浮點(diǎn)型(float) (2)雙精度浮點(diǎn)型(double)2.3.3變數(shù)類(lèi)型的轉(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)成,是成員方法的主要成分,必須包含在類(lèi)的方法體之中。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ǔ)句也稱(chēng)為塊(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é)果見(jiàn)圖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í)際編程中並不多見(jiàn)。複合語(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開(kāi)關(guān)語(yǔ)句 雖然嵌套的條件語(yǔ)句可實(shí)現(xiàn)多個(gè)分支處理,但嵌套太多時(shí)容易出錯(cuò)和混亂,這時(shí)可以使用開(kāi)關(guān)語(yǔ)句switch處理。實(shí)際上開(kāi)關(guān)語(yǔ)句switch也是一種if...else結(jié)構(gòu),不過(guò)它使你在編程時(shí)很容易寫(xiě)出判斷條件,特別是有很多條件選項(xiàng)的時(shí)候。開(kāi)關(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子句可以省略。開(kāi)關(guān)語(yǔ)句先計(jì)算運(yùn)算式,然後將運(yùn)算式值與各個(gè)常量比較,如果運(yùn)算式值與某個(gè)常量相等,就執(zhí)行該常量後面的語(yǔ)句。如果都不相等,就執(zhí)行default下麵的語(yǔ)句,如果無(wú)default子句,就什麼都不執(zhí)行,直接跳出開(kāi)關(guān)語(yǔ)句。使用開(kāi)關(guān)語(yǔ)句時(shí),注意以下問(wèn)題。(1)case後面的常量必須是整數(shù)或字元型,而且不能有相同的值。(2)通常在每一個(gè)case中都應(yīng)使用break語(yǔ)句提供一個(gè)出口,使流程跳出開(kāi)關(guān)語(yǔ)句。否則,在第一個(gè)滿(mǎn)足條件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)也常常寫(xiě)成如下形式: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é)束,下一次迴圈開(kāi)始時(shí)執(zhí)行的語(yǔ)句,常用來(lái)使計(jì)數(shù)器加1或減1。(4)終止部分通常是一個(gè)布爾運(yùn)算式,每一次迴圈要對(duì)該運(yùn)算式求值,以驗(yàn)證是否滿(mǎ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ù)組類(lèi)型,它指出數(shù)組中各元素的類(lèi)型,arrayname為數(shù)組名。2.6.2多維數(shù)組 以二維數(shù)組為例,其格式為: typearrayname[][];第3章面向?qū)ο蟮某淌皆O(shè)計(jì)3.1簡(jiǎn)介3.2類(lèi)3.3對(duì)象3.4實(shí)例研究(無(wú))3.5類(lèi)的繼承和類(lèi)的多態(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類(lèi)1.類(lèi)的說(shuō)明(1)指出特性(2)指出父類(lèi)(extends部分)(3)指出介面(implements部分)2.類(lèi)體3.2.1類(lèi)的成員變數(shù) 1.變數(shù)的訪(fǎng)問(wèn)許可權(quán) (1)公用(public)變數(shù) (2)專(zhuān)用(private)變數(shù) (3)保護(hù)型(protected)變數(shù) (4)專(zhuān)用保護(hù)型(privateprotected)變數(shù) (5)默認(rèn)型變數(shù)2.是否為靜態(tài)變數(shù)3.是否為常量3.2.2類(lèi)的方法 其格式如下所示: methodDeclaration{ methodBody }3.2.3this和super this和super是Java的兩個(gè)關(guān)鍵字,它們用在方法體中作為兩個(gè)特殊的變數(shù)首碼和方法首碼。this用來(lái)指明當(dāng)前對(duì)象的成員變數(shù)或方法,以區(qū)分於同名的局部變數(shù)和其他同名的方法,而super則用於指出父類(lèi)的變數(shù)和方法。 1.this的使用場(chǎng)合 一個(gè)對(duì)象中的方法一般可以直接訪(fǎng)問(wèn)同一對(duì)象的成員變數(shù)。但是,有時(shí)候方法體內(nèi)部定義的變數(shù)和成員變數(shù)名字相同,還有時(shí)方法的入口參數(shù)和對(duì)象的成員變數(shù)名字相同,那麼就需要將三者區(qū)別清楚。因此,專(zhuān)門(mén)用this來(lái)指明當(dāng)前對(duì)象的成員變數(shù)或當(dāng)前對(duì)象的方法。2.super的使用場(chǎng)合在Java中,由父類(lèi)派生子類(lèi),這樣,子類(lèi)的成員變數(shù)可能和父類(lèi)的成員變數(shù)名字相同,子類(lèi)的方法也可能和父類(lèi)的方法一樣。當(dāng)需要調(diào)用父類(lèi)的同名方法或使用父類(lèi)的同名變數(shù)時(shí),在子類(lèi)中可用關(guān)鍵字super作首碼來(lái)指明父類(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è)階段,這稱(chēng)為對(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ǔ)句訪(fǎng)問(wèn)對(duì)象的變數(shù),通過(guò)這種引用可以檢測(cè)和修改變數(shù)。引用對(duì)象變數(shù)須按如下格式:ObjectReference.variable;其中,ObjectReference是對(duì)象名,variable是所引用的變數(shù)。比如,已經(jīng)由Rectangle建立了名為myRectangle的對(duì)象,它有4個(gè)可以訪(fǎng)問(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),在類(lèi)的設(shè)計(jì)中,有些變數(shù)被設(shè)置為禁止被操作狀態(tài),從而使這些變數(shù)不允許其他對(duì)象訪(fǎng)問(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類(lèi)中創(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è)稱(chēng)為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類(lèi)的繼承和類(lèi)的多態(tài)性3.5.1類(lèi)的繼承 類(lèi)的繼承是面向?qū)ο蟮某淌皆O(shè)計(jì)語(yǔ)言所具有的重要技術(shù)。有了繼承技術(shù),程式設(shè)計(jì)時(shí),就可以先定義一個(gè)包含公用變數(shù)和公用方法的類(lèi)作為父類(lèi),再在此基礎(chǔ)上創(chuàng)建具有專(zhuān)用變數(shù)和專(zhuān)用方法的子類(lèi)。子類(lèi)一方面可以增加父類(lèi)中沒(méi)有的變數(shù)和方法,另一方面還可以在繼承基礎(chǔ)上再定義父類(lèi)中已有的變數(shù)和方法。 Java系統(tǒng)要求應(yīng)用程式中每個(gè)類(lèi)都有父類(lèi),如果一個(gè)類(lèi)的定義中沒(méi)有用關(guān)鍵字extends明確指出父類(lèi)名,則Java系統(tǒng)默認(rèn)這個(gè)類(lèi)的父類(lèi)為系統(tǒng)軟體包java.1ang中的Object類(lèi)。父類(lèi)中凡是公用型的、保護(hù)型的或者專(zhuān)用保護(hù)型的變數(shù)和方法均可由子類(lèi)直接調(diào)用,只有父類(lèi)的專(zhuān)用型變數(shù)和專(zhuān)用型方法不能被子類(lèi)調(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é)果見(jiàn)圖3-3。圖3-3 程式分析:Circle類(lèi)繼承了Point類(lèi)。這意味著Circle的public介面除了包括Circle類(lèi)的setRadius、getRadius、area、toString方法和Circle的構(gòu)造函數(shù)外,還包括Point的方法。應(yīng)用程式Test用來(lái)測(cè)試Cylinder類(lèi)。 注意Cylinder類(lèi)繼承了Circle類(lèi),即Cylinder的public介面除了包括Cylinder構(gòu)造函數(shù),Cylinder的方法setHeight、getHeight、area(覆蓋Circle的area方法)、volume和toSting外,還包括Circle的方法。Test應(yīng)用程式的main方法首先實(shí)例化了Cylinder類(lèi)的一個(gè)對(duì)象,然後用“獲取”方法獲取關(guān)於Cylinder對(duì)象的資訊。同樣,這裏的main方法也不能直接引用Cylinder類(lèi)的protected數(shù)據(jù)。3.5.2類(lèi)的多態(tài)性 如果你想要使用多態(tài)性,則所需的條件概括如下。 (1)對(duì)派生類(lèi)對(duì)象方法的調(diào)用必須通過(guò)基類(lèi)的變數(shù)。 (2)被調(diào)用的方法必須也是基類(lèi)的一個(gè)成員。(3)在基類(lèi)與派生類(lèi)中這個(gè)方法的方法名必須相同。(4)在基類(lèi)與派生類(lèi)中這個(gè)方法的返回類(lèi)型必須相同。(5)在派生類(lèi)中這個(gè)方法的訪(fǎng)問(wèn)修飾符限制不能超過(guò)基類(lèi)中的限制。3.6接口與包3.6.1介面 介面是和類(lèi)很相似而又有區(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)用類(lèi)的單一繼承機(jī)制。3.6.2包 1.聲明自己的程式包 2.程式包的引用 3.Java的系統(tǒng)程式包第4章異常處理和常用系統(tǒng)類(lèi)4.1異常處理機(jī)制4.2String類(lèi)和StringBuffer類(lèi)4.3AWT4.4Javaapplet4.1異常處理機(jī)制4.1.1什麼是異常 用任何一種電腦語(yǔ)言設(shè)計(jì)的程式在運(yùn)行時(shí)都可能出現(xiàn)各種錯(cuò)誤,常見(jiàn)的錯(cuò)誤如除數(shù)為0、檔不存在、檔不能打開(kāi)、數(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ú)法打開(kāi)檔,那麼,可以提示用戶(hù)輸入一個(gè)新的檔案名,從而使程式繼續(xù)往下運(yùn)行。 (2)由程式員在程式設(shè)計(jì)中兼顧錯(cuò)誤檢測(cè)、錯(cuò)誤資訊顯示和出錯(cuò)處理。這種處理方法的優(yōu)點(diǎn)是減少了中途終止程式運(yùn)行的可能性。但是,要求程式員在程式設(shè)計(jì)中不僅將精力用於正常處理過(guò)程,還要精心考慮錯(cuò)誤檢測(cè)和處理,這會(huì)使程式變得複雜。並且,這類(lèi)錯(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)中,專(zhuān)門(mén)設(shè)置了一個(gè)調(diào)用棧,此棧中裝有指向異常處理方法的指針。 在程式運(yùn)行時(shí),系統(tǒng)會(huì)把收集到的異常和異常處理指針?biāo)傅奶幚眍?lèi)型逐個(gè)比較,如果找到相符的類(lèi)型,那麼就轉(zhuǎn)向相應(yīng)的方法處理,如沒(méi)有在調(diào)用棧中找到相應(yīng)的類(lèi)型指針,則終止程式運(yùn)行,並顯示解釋資訊。在Java程式中,異常一般由以下兩種原因引起。(1)程式中存在非法操作,最簡(jiǎn)單的例子就是除數(shù)為0的除法操作。這種原因常常是程式員出於無(wú)意或大意造成的,所以稱(chēng)為隱式異常。常見(jiàn)的隱式異??梢酝ㄟ^(guò)java.lang包中的Throwable類(lèi)的子類(lèi)Error處理。 (2)程式員在程式中使用了throw語(yǔ)句引起的異常。這種異常是程式員出於某種考慮有意安排的,所以稱(chēng)為顯式異常。在throw語(yǔ)句中,都會(huì)指出處理顯式異常的對(duì)象,這些對(duì)象都是由java.lang包的類(lèi)Throwable的子類(lèi)Exception再派生的子類(lèi)生成的,每個(gè)對(duì)象完成對(duì)某種異常的處理功能,這些對(duì)象綜合起來(lái)實(shí)現(xiàn)各種異常處理。比如Array-IndexOutOfBoundsException子類(lèi)處理數(shù)組越界異常,IOException子類(lèi)處理輸入輸出異常,而ArithmeticException子類(lèi)處理除數(shù)為0導(dǎo)致的算術(shù)異常等。4.1.2異常的層次結(jié)構(gòu)4.1.3異常的處理4.1.4創(chuàng)建自己的異常4.2String類(lèi)和StringBuffer類(lèi)4.2.1String類(lèi)1.String類(lèi)的主要構(gòu)造方法 String類(lèi)有多個(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位置開(kāi)始提取字元,共提取numChars個(gè)字元組成一個(gè)字串。第4個(gè)構(gòu)造方法是以位元組數(shù)組的形式生成一個(gè)字串,數(shù)組中存放字串各字元對(duì)應(yīng)的ASCII碼。第5個(gè)構(gòu)造方法也是從位元組數(shù)組生成一個(gè)字串。具體講,就是以位元組數(shù)組ascii[]的startIndex處開(kāi)始,共提取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é)果見(jiàn)圖4-5。圖4-5程式分析:String類(lèi)提供了9個(gè)構(gòu)造函數(shù),以便使用各種方法初始化String對(duì)象。例題共演示了7種。程式“s1=newString()”實(shí)例化一個(gè)新的String對(duì)象,並使用String類(lèi)的缺省構(gòu)造函數(shù)將它賦給引用s1。新的String對(duì)象沒(méi)有字元(即空串),長(zhǎng)度為0?!皊2=newString(s);”例化一個(gè)新的String對(duì)象,並使用String類(lèi)的拷貝構(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類(lèi)構(gòu)造函數(shù),將它賦給引用s3。新的String對(duì)象包含了數(shù)組中字元的拷貝?!皊4=newString(charArray,6,3);”實(shí)例化一個(gè)String對(duì)象,使用以一個(gè)字元數(shù)組和兩個(gè)整數(shù)為參數(shù)的String類(lèi)構(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的例外處理?!皊5=newString(byteArray,4,4);”實(shí)例化一個(gè)新的String對(duì)象,使用以一個(gè)byte數(shù)組和兩個(gè)整數(shù)為參數(shù)的String類(lèi)構(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類(lèi)構(gòu)造函數(shù),將它賦給引用s6。新的String對(duì)象包含了數(shù)組中byte的拷貝?!皊7=newString(buffer);”實(shí)例化一個(gè)新的String對(duì)象,使用以StringBuffer為參數(shù)的String類(lèi)構(gòu)造函數(shù),將它賦給引用s7。StringBuffer是一個(gè)可動(dòng)態(tài)改變大小和內(nèi)容的字串。新的String對(duì)象包含了StringBuffer中字元的拷貝。2.String類(lèi)的length、charAt和getChars方法 下麵的例子演示了String類(lèi)的length、charAt和getChars方法,它們分別用於確定String類(lèi)的長(zhǎng)度、取String某一指定位置的字元以及取String某一子串。3.String類(lèi)的字串比較例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é)果見(jiàn)圖4-10。7.轉(zhuǎn)化為字串圖4-104.2.2StringBuffer類(lèi) String類(lèi)提供了很多處理字串的功能。但是,一旦創(chuàng)建了字串對(duì)象,它的內(nèi)容就永遠(yuǎn)不會(huì)變。下麵將討論StringBuffer類(lèi)的特點(diǎn)。這個(gè)類(lèi)可以創(chuàng)建和操縱動(dòng)態(tài)字串,即可修改的字串。每個(gè)StringBuffer都能夠存儲(chǔ)由它的容量所指定的一些字元。如果超過(guò)了StringBuffer的容量,容量就會(huì)自動(dòng)地?cái)U(kuò)大以容納多出來(lái)的字元。我們將看到,StringBuffer類(lèi)還可用來(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類(lèi)的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)程式開(kāi)始運(yùn)行時(shí),解釋器首先查找main()方法並執(zhí)行。而Javaapplet中則不需要main()方法,它必須嵌入HTML檔中,由支持Javaapplet的流覽器運(yùn)行。(2)Java應(yīng)用程式可以獨(dú)立運(yùn)行。而Javaapplet不能獨(dú)立運(yùn)行,需要依賴(lài)於網(wǎng)路流覽器。(3)Java應(yīng)用程式所實(shí)現(xiàn)的功能是完全的,不需依賴(lài)於其他程式。而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子類(lèi)名extendsApplet //定義Applet類(lèi)的子類(lèi){publicvoidinit(){方法體}//初始化方法
publicvoidstart(){方法體}//開(kāi)始執(zhí)行方法
publicvoidstop(){方法體}//停止執(zhí)行方法
publicvoiddestroy(){方法體}//退出方法
publicvoidpaint(Graphicsg){方法體}//繪畫(huà)方法}……從Javaapplet程式結(jié)構(gòu)看出,Javaapplet由若干類(lèi)組成,無(wú)需main()方法,但必須有且僅有一個(gè)主類(lèi),該類(lèi)是Applet類(lèi)的子類(lèi),且被聲明為public。程式被保存時(shí),程式名必須命名為主類(lèi)名,即程式名與主類(lèi)名完全相同,尾碼為.java。主類(lèi)中定義了init()、start()、stop()、destroy()和paint()方法,這些方法是從Applet中繼承的,有固定的含義,由流覽器在時(shí)機(jī)成熟時(shí)自動(dòng)執(zhí)行。4.4.3Applet的主要方法 在流覽器中運(yùn)行Applet程式,從運(yùn)行開(kāi)始到運(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),真正開(kāi)始執(zhí)行Applet,在該狀態(tài)下Applet通常會(huì)啟動(dòng)一些線(xiàn)程執(zhí)行各種任務(wù)。 當(dāng)退出當(dāng)前主頁(yè)時(shí),流覽器調(diào)用stop()方法終止在運(yùn)行狀態(tài)下啟動(dòng)的線(xiàn)程,進(jìn)入停止?fàn)顟B(tài)。當(dāng)用戶(hù)退出流覽器時(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()方法在A(yíng)pplet執(zhí)行過(guò)程中,init()方法只執(zhí)行一次。當(dāng)流覽器第一次流覽含有Applet的Web頁(yè)載入Applet時(shí),就會(huì)執(zhí)行init()方法。由於在A(yíng)pplet執(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()方法不同,在A(yíng)pplet的執(zhí)行過(guò)程中,start()方法可被流覽器調(diào)用多次。在下列情況下,流覽器會(huì)調(diào)用start()方法。(1)流覽器從圖示狀態(tài)恢復(fù)為窗口狀態(tài)或縮放流覽器窗口時(shí)。(2)Applet第一次載入時(shí)。(3)離開(kāi)該Web頁(yè)後又再返回時(shí)。(4)reload該頁(yè)面時(shí)。在start()方法中可啟動(dòng)相關(guān)線(xiàn)程來(lái)控制Applet,給引入類(lèi)對(duì)象發(fā)送消息,或以某種方式通知Applet開(kāi)始運(yùn)行。該方法是Applet的主體。3.stop()方法該方法與start()方法是相對(duì)應(yīng)的,在A(yíng)pplet執(zhí)行過(guò)程中,也會(huì)被流覽器調(diào)用多次。在下列情況下,流覽器會(huì)調(diào)用stop()方法。(1)流覽器從圖示狀態(tài)恢復(fù)為窗口狀態(tài)或縮放流覽器窗口時(shí)。(2)離開(kāi)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è)的訪(fǎng)問(wèn)或退出流覽器時(shí)調(diào)用destroy()方法,卸載Applet,釋放載入Applet時(shí)分配的系統(tǒng)資源。在A(yíng)pplet的執(zhí)行過(guò)程中,destroy()方法只執(zhí)行一次。destroy()方法是Applet類(lèi)的類(lèi)方法,只能用於Applet??稍谠摲椒ㄖ袌?zhí)行釋放系統(tǒng)資源的代碼。但一般不需重寫(xiě)destroy()方法,因?yàn)镴ava運(yùn)行系統(tǒng)本身會(huì)自動(dòng)進(jìn)行“垃圾”處理和記憶體管理,除非用了特殊的資源如創(chuàng)建的線(xiàn)程。注意:destroy()方法與stop()方法不同。除了上述4個(gè)方法外,Applet還提供一個(gè)非常重要的方法:paint(Graphicsg)方法。該方法用於進(jìn)行繪圖的具體操作,但沒(méi)有實(shí)現(xiàn)任何操作,用戶(hù)可重寫(xiě)該方法,實(shí)現(xiàn)個(gè)性化的繪圖操作。在A(yíng)pplet執(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類(lèi)的對(duì)象,由這個(gè)對(duì)象來(lái)完成具體的繪圖操作。Graphics對(duì)象由流覽器自動(dòng)創(chuàng)建並將其傳送給paint()方法。注意:應(yīng)在A(yíng)pplet中引入Graphics類(lèi)的包或該類(lèi):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)行,因此我們需編寫(xiě)一個(gè)HTML檔,通過(guò)<applet>標(biāo)記將applet程式編譯生成的位元組碼檔嵌入HTML檔,通知流覽器來(lái)運(yùn)行Javaapplet。 如要運(yùn)行例4-16,可編寫(xiě)如下的HTML檔:<html><head><title>example4_16</title></head><body><appletcode=example4_16.classwidth=300height=250></applet></body></html>第5章圖形用戶(hù)介面5.1文本框和文本區(qū)5.2標(biāo)簽5.3按鈕5.4選擇框5.5畫(huà)布5.6面板與佈局設(shè)計(jì)5.7窗口5.8菜單5.9對(duì)話(huà)框5.1文本框和文本區(qū)5.1.1文本框及處理事件1.文本框的創(chuàng)建2.文本框處理事件 例5-2:兩個(gè)空白文本框,當(dāng)在第一個(gè)文本框內(nèi)輸入字元時(shí),在文本框內(nèi)顯示“*”號(hào),輸入完畢按回車(chē)鍵後,在第二個(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é)果見(jiàn)圖5-2。圖5-15.1.2文本區(qū)及處理事件 例5-4:在A(yíng)pplet中添加一個(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é)果見(jiàn)圖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用戶(hù)介面中常用的元素,它是用戶(hù)輸入命令的一個(gè)重要工具。當(dāng)用滑鼠單擊某個(gè)按鈕該按鈕獲得焦點(diǎn)時(shí),在鍵盤(pán)上按回車(chē)鍵都會(huì)導(dǎo)致一個(gè)命令的執(zhí)行。Button類(lèi)有兩種構(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)的事件有兩類(lèi)。1.ActionEvent 當(dāng)用滑鼠單擊按鈕,或當(dāng)按鈕獲得焦點(diǎn)時(shí)在鍵盤(pán)上按回車(chē)鍵都導(dǎo)致該事件的發(fā)生,此時(shí)任何實(shí)現(xiàn)了被註冊(cè)為監(jiān)聽(tīng)者的ActionListener介面的類(lèi),它的actionPerformed()方法將被調(diào)用。下麵的程式範(fàn)例在A(yíng)pplet上添加兩個(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é)果見(jiàn)圖5-6。圖5-62.FocusEvent FocusEvent稱(chēng)作焦點(diǎn)事件,它的發(fā)生是指鍵盤(pán)游標(biāo)移動(dòng)到構(gòu)件上並且可以接受鍵盤(pán)的輸入。如果游標(biāo)移動(dòng)到一個(gè)按鈕上,稱(chēng)作該按鈕獲得焦點(diǎn),反之稱(chēng)作失去焦點(diǎn)。當(dāng)一個(gè)按鈕獲得焦點(diǎn)時(shí)單擊回車(chē)鍵即相當(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é)果見(jiàn)圖5-7。圖5-7在上面的例子中,只有button1和txt1註冊(cè)了焦點(diǎn)事件的事件監(jiān)聽(tīng)者,它們共用同一個(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é)果見(jiàn)圖5-12。圖5-125.5畫(huà)布例5-13:創(chuàng)建一個(gè)畫(huà)布。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é)果見(jiàn)圖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)益歸上傳用戶(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年汽車(chē)行業(yè)供應(yīng)鏈風(fēng)險(xiǎn)管理與供應(yīng)鏈風(fēng)險(xiǎn)管理培訓(xùn)課程創(chuàng)新實(shí)踐報(bào)告
- 2025年標(biāo)準(zhǔn)勞動(dòng)合同書(shū)模板
- 房地產(chǎn)市場(chǎng)的區(qū)域分化現(xiàn)象與2025年特色小鎮(zhèn)綜合體投資策略
- 無(wú)動(dòng)力樂(lè)園項(xiàng)目的土地使用與資源獲取方案
- 公園項(xiàng)目?jī)和螛?lè)區(qū)設(shè)計(jì)與安全規(guī)劃
- 企業(yè)如何實(shí)施成功的數(shù)字化轉(zhuǎn)型并提升ROI
- 2025年環(huán)境影響評(píng)價(jià)公眾參與與環(huán)境保護(hù)公眾參與機(jī)制創(chuàng)新策略研究與實(shí)踐報(bào)告
- 2025年社區(qū)心理健康服務(wù)與社區(qū)心理健康促進(jìn)活動(dòng)的創(chuàng)新模式探索報(bào)告
- 親子樂(lè)園運(yùn)營(yíng)成本分析與控制措施
- 柔性顯示面板項(xiàng)目運(yùn)營(yíng)管理方案(范文參考)
- 電力市場(chǎng)交易模式
- 婦科門(mén)診護(hù)理質(zhì)量控制管理考核標(biāo)準(zhǔn)
- 第四課《單色版畫(huà)》 課件
- 秋收起義-完整版課件
- 門(mén)診手術(shù)麻醉原則課件
- 朝陽(yáng)區(qū)編制外崗位應(yīng)聘人員報(bào)名表
- 自動(dòng)噴水滅火系統(tǒng)質(zhì)量驗(yàn)收項(xiàng)目缺陷判定記錄
- 人教版一年級(jí)起點(diǎn)小學(xué)二年級(jí)英語(yǔ)下冊(cè)全套教案
- T-CCIAT 0043-2022 建筑工程滲漏治理技術(shù)規(guī)程
- 供貨、安裝、調(diào)試、驗(yàn)收方案
- 電氣設(shè)備-開(kāi)篇緒論匯編
評(píng)論
0/150
提交評(píng)論