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

下載本文檔

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

文檔簡介

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

break;case常量2;語句2;

break;……default:

語句n;}其中switch、case、default是關(guān)鍵字,default子句可以省略。開關(guān)語句先計算運算式,然後將運算式值與各個常量比較,如果運算式值與某個常量相等,就執(zhí)行該常量後面的語句。如果都不相等,就執(zhí)行default下麵的語句,如果無default子句,就什麼都不執(zhí)行,直接跳出開關(guān)語句。使用開關(guān)語句時,注意以下問題。(1)case後面的常量必須是整數(shù)或字元型,而且不能有相同的值。(2)通常在每一個case中都應使用break語句提供一個出口,使流程跳出開關(guān)語句。否則,在第一個滿足條件case後面的所有語句都會被執(zhí)行,這種情況叫做落空。(3)有些case標號列在一起(如“case1:case2:”,中間沒有語句),這表示對所列情況將進行同樣的操作。2.5.3迴圈語句 1.for迴圈語句 for迴圈的語法結(jié)構(gòu)為: for(運算式1;運算式2;運算式3) 循環(huán)體2.while迴圈語句 while迴圈的語法結(jié)構(gòu)為如下形式: while(條件運算式) 循環(huán)體3.do...while迴圈 如不用大括弧,循環(huán)體中只含一條語句的do...while結(jié)構(gòu)如下: do 語句 while(條件);只有一條語句的do...while結(jié)構(gòu)也常常寫成如下形式:do{語句}while(條件);4.迴圈語句的嵌套5.迴圈語句小結(jié)一個迴圈一般應包括以下4部分內(nèi)容。(1)初始化部分用來設(shè)置迴圈的一些初始條件,計數(shù)器清零等。(2)循環(huán)體部分這是反復被執(zhí)行的一段代碼,可以是單語句,也可以是複合語句。(3)迭代部分這是在當前迴圈結(jié)束,下一次迴圈開始時執(zhí)行的語句,常用來使計數(shù)器加1或減1。(4)終止部分通常是一個布爾運算式,每一次迴圈要對該運算式求值,以驗證是否滿足迴圈終止條件。2.5.4跳轉(zhuǎn)語句 1.break和continue語句 2.帶標號的break和continue語句2.6數(shù)組2.6.1數(shù)組的聲明和建立 數(shù)組按如下格式定義: typearrayname[]; type是數(shù)組類型,它指出數(shù)組中各元素的類型,arrayname為數(shù)組名。2.6.2多維數(shù)組 以二維數(shù)組為例,其格式為: typearrayname[][];第3章面向?qū)ο蟮某淌皆O(shè)計3.1簡介3.2類3.3對象3.4實例研究(無)3.5類的繼承和類的多態(tài)性3.6接口與包3.1簡介Java是面向?qū)ο蟮某淌皆O(shè)計語言,從面向?qū)ο筮@個角度看,體現(xiàn)了如下3個特點。1.封裝性2.繼承性3.通信相關(guān)性3.2類1.類的說明(1)指出特性(2)指出父類(extends部分)(3)指出介面(implements部分)2.類體3.2.1類的成員變數(shù) 1.變數(shù)的訪問許可權(quán) (1)公用(public)變數(shù) (2)專用(private)變數(shù) (3)保護型(protected)變數(shù) (4)專用保護型(privateprotected)變數(shù) (5)默認型變數(shù)2.是否為靜態(tài)變數(shù)3.是否為常量3.2.2類的方法 其格式如下所示: methodDeclaration{ methodBody }3.2.3this和super this和super是Java的兩個關(guān)鍵字,它們用在方法體中作為兩個特殊的變數(shù)首碼和方法首碼。this用來指明當前對象的成員變數(shù)或方法,以區(qū)分於同名的局部變數(shù)和其他同名的方法,而super則用於指出父類的變數(shù)和方法。 1.this的使用場合 一個對象中的方法一般可以直接訪問同一對象的成員變數(shù)。但是,有時候方法體內(nèi)部定義的變數(shù)和成員變數(shù)名字相同,還有時方法的入口參數(shù)和對象的成員變數(shù)名字相同,那麼就需要將三者區(qū)別清楚。因此,專門用this來指明當前對象的成員變數(shù)或當前對象的方法。2.super的使用場合在Java中,由父類派生子類,這樣,子類的成員變數(shù)可能和父類的成員變數(shù)名字相同,子類的方法也可能和父類的方法一樣。當需要調(diào)用父類的同名方法或使用父類的同名變數(shù)時,在子類中可用關(guān)鍵字super作首碼來指明父類的成員變數(shù)和方法。3.2.4構(gòu)造函數(shù)3.2.5main方法3.3對象3.3.1對象的創(chuàng)建 一個對象往往經(jīng)歷創(chuàng)建、運行和釋放3個階段,這稱為對象的典型生命週期。 創(chuàng)建對象包括定義對象、建立對象和初始化對象3步。3.3.2對象的使用 對象使用就是指通過某種手段使一個對象產(chǎn)生它的效能。有兩種途徑來使用對象:一種是通過對象變數(shù)的引用來使用對象,另一種是通過調(diào)用對象的方法來使用對象。下麵我們結(jié)合具體例子來說明。1.通過對象變數(shù)的引用來使用對象實際上,對象變數(shù)的引用就是用語句訪問對象的變數(shù),通過這種引用可以檢測和修改變數(shù)。引用對象變數(shù)須按如下格式:ObjectReference.variable;其中,ObjectReference是對象名,variable是所引用的變數(shù)。比如,已經(jīng)由Rectangle建立了名為myRectangle的對象,它有4個可以訪問的變數(shù)x,y,width和height,那麼:myRectangle.x=2;myRectangle.y=4;這兩個語句將矩形myRectangle的原點定位於X軸方向為2,Y軸方向為4的位置上,而語句:rnyRectangle.width=20;myRectangle.height=40;則將矩形的寬定為20,長定為40。對象變數(shù)的引用不僅能夠檢測和修改變數(shù),也可以通過運算式來對幾個變數(shù)進行合成,得到新的複合型變數(shù)。比如,用如下運算式引用對象變數(shù):areaMyRectangle=myRectangle.width*myRectangle.height;就獲得了矩形的面積,它用變數(shù)areaMyRectangle表示。要提到的是,對象變數(shù)的引用有時會使某個變數(shù)改得不符合要求,從而使一個對象處於不規(guī)範狀態(tài)。因為這一點,在類的設(shè)計中,有些變數(shù)被設(shè)置為禁止被操作狀態(tài),從而使這些變數(shù)不允許其他對象訪問。這時,對象變數(shù)引用就不可行了。2.通過調(diào)用對象的方法來使用對象 每個對象在創(chuàng)建的時候,一方面用變數(shù)確定了它的狀態(tài),由創(chuàng)建過程為它分配記憶體空間,另一方面也創(chuàng)建了與它有關(guān)的方法,每個方法都是和行為有關(guān)的。所以通過調(diào)用對象的某個方法來使用對象,從而產(chǎn)生某種行為,這是最符合邏輯思維習慣的。實際上,這也是更為安全可靠地使用對象的一種手段,因為這避免了對變數(shù)的直接操作。 調(diào)用一個對象中的某個方法要遵照如下格式:ObjectReference.methodName(paramlist); 或者:ObjectReference.methodName();比如,從Rectangle類中創(chuàng)建的對象myRectangle含有一個方法叫move(),下麵的語句就是用方法move()將對象myRectangle移動到一個新的位置:myRectangle.move(5,10);這個語句產(chǎn)生的效果等同於下麵兩個語句:myRectangle.x=5;myRectangle.y=10;3.3.3對象的釋放 所謂釋放對象,實質(zhì)上就是釋放掉分配給此對象的記憶體空間。Java中,對象的釋放是自動完成的,不需要程式員在編程時關(guān)注這一點。Java運行系統(tǒng)具有所謂的“垃圾收集”機制,這種機制會週期性地檢測對象是否還在使用,如發(fā)現(xiàn)有長期不用的對象,則給予釋放,回收分配給這些對象的記憶體,這就是垃圾收集。 具體運行中,垃圾收集是由一個稱為Java垃圾收集器的程式實現(xiàn)的。當一個對象在使用時,Java運行系統(tǒng)會將其對應的記憶體空間設(shè)置標記;而當一個對象結(jié)束使用時,會自動清除標記。有了這種標記設(shè)置和清除的規(guī)則,Java垃圾收集器就可以通過週期性地掃描所有Java對象有關(guān)的記憶體區(qū)域標記,將沒有標記的記憶體區(qū)列入可供分配的範疇,從而起到垃圾收集作用。3.5類的繼承和類的多態(tài)性3.5.1類的繼承 類的繼承是面向?qū)ο蟮某淌皆O(shè)計語言所具有的重要技術(shù)。有了繼承技術(shù),程式設(shè)計時,就可以先定義一個包含公用變數(shù)和公用方法的類作為父類,再在此基礎(chǔ)上創(chuàng)建具有專用變數(shù)和專用方法的子類。子類一方面可以增加父類中沒有的變數(shù)和方法,另一方面還可以在繼承基礎(chǔ)上再定義父類中已有的變數(shù)和方法。 Java系統(tǒng)要求應用程式中每個類都有父類,如果一個類的定義中沒有用關(guān)鍵字extends明確指出父類名,則Java系統(tǒng)默認這個類的父類為系統(tǒng)軟體包java.1ang中的Object類。父類中凡是公用型的、保護型的或者專用保護型的變數(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);}}運行結(jié)果見圖3-3。圖3-3 程式分析:Circle類繼承了Point類。這意味著Circle的public介面除了包括Circle類的setRadius、getRadius、area、toString方法和Circle的構(gòu)造函數(shù)外,還包括Point的方法。應用程式Test用來測試Cylinder類。 注意Cylinder類繼承了Circle類,即Cylinder的public介面除了包括Cylinder構(gòu)造函數(shù),Cylinder的方法setHeight、getHeight、area(覆蓋Circle的area方法)、volume和toSting外,還包括Circle的方法。Test應用程式的main方法首先實例化了Cylinder類的一個對象,然後用“獲取”方法獲取關(guān)於Cylinder對象的資訊。同樣,這裏的main方法也不能直接引用Cylinder類的protected數(shù)據(jù)。3.5.2類的多態(tài)性 如果你想要使用多態(tài)性,則所需的條件概括如下。 (1)對派生類對象方法的調(diào)用必須通過基類的變數(shù)。 (2)被調(diào)用的方法必須也是基類的一個成員。(3)在基類與派生類中這個方法的方法名必須相同。(4)在基類與派生類中這個方法的返回類型必須相同。(5)在派生類中這個方法的訪問修飾符限制不能超過基類中的限制。3.6接口與包3.6.1介面 介面是和類很相似而又有區(qū)別的一種結(jié)構(gòu),介面的設(shè)計和調(diào)用也是Java程式設(shè)計的重要技術(shù)。從結(jié)構(gòu)上,介面有如下特點。 (1)介面用關(guān)鍵字interface來定義,而不是用class。(2)介面中定義的變數(shù)全是最終的靜態(tài)變數(shù)。(3)介面中沒有自身的構(gòu)造方法,而且定義的其他方法全是抽象方法,即只提供方法的定義,而沒有提供方法的實現(xiàn)語句。(4)介面採用多重繼承機制,而不是採用類的單一繼承機制。3.6.2包 1.聲明自己的程式包 2.程式包的引用 3.Java的系統(tǒng)程式包第4章異常處理和常用系統(tǒng)類4.1異常處理機制4.2String類和StringBuffer類4.3AWT4.4Javaapplet4.1異常處理機制4.1.1什麼是異常 用任何一種電腦語言設(shè)計的程式在運行時都可能出現(xiàn)各種錯誤,常見的錯誤如除數(shù)為0、檔不存在、檔不能打開、數(shù)組下標超過界限、記憶體不夠用等。對於這種在運行中出現(xiàn)的錯誤,電腦系統(tǒng)中通常有兩種處理辦法。 (1)由電腦系統(tǒng)本身直接檢測程式錯誤,遇到錯誤時使程式終止運行。這種處理方法的優(yōu)點是使程式設(shè)計比較簡單。但是,對程式錯誤一概地採用終止運行辦法,顯然過於簡單化。因為有些情況下,完全可以通過其他途徑保持程式繼續(xù)運行。比如,由於檔案名不符合要求而無法打開檔,那麼,可以提示用戶輸入一個新的檔案名,從而使程式繼續(xù)往下運行。 (2)由程式員在程式設(shè)計中兼顧錯誤檢測、錯誤資訊顯示和出錯處理。這種處理方法的優(yōu)點是減少了中途終止程式運行的可能性。但是,要求程式員在程式設(shè)計中不僅將精力用於正常處理過程,還要精心考慮錯誤檢測和處理,這會使程式變得複雜。並且,這類錯誤檢測往往是多數(shù)程式中重複甚至在一個程式中多次重複。而另一方面,如果程式中某處忽略了應有的檢測,又將引起程式總體結(jié)果的錯誤。 Java採用異常處理機制來處理程式運行中的錯誤。按照這種機制,將程式運行中的所有錯誤都看成一種異常,通過對語句塊的檢測,一個程式中所有的異常被收集起來放在程式的某一段中去處理。在Java系統(tǒng)中,專門設(shè)置了一個調(diào)用棧,此棧中裝有指向異常處理方法的指針。 在程式運行時,系統(tǒng)會把收集到的異常和異常處理指針所指的處理類型逐個比較,如果找到相符的類型,那麼就轉(zhuǎn)向相應的方法處理,如沒有在調(diào)用棧中找到相應的類型指針,則終止程式運行,並顯示解釋資訊。在Java程式中,異常一般由以下兩種原因引起。(1)程式中存在非法操作,最簡單的例子就是除數(shù)為0的除法操作。這種原因常常是程式員出於無意或大意造成的,所以稱為隱式異常。常見的隱式異??梢酝ㄟ^java.lang包中的Throwable類的子類Error處理。 (2)程式員在程式中使用了throw語句引起的異常。這種異常是程式員出於某種考慮有意安排的,所以稱為顯式異常。在throw語句中,都會指出處理顯式異常的對象,這些對象都是由java.lang包的類Throwable的子類Exception再派生的子類生成的,每個對象完成對某種異常的處理功能,這些對象綜合起來實現(xiàn)各種異常處理。比如Array-IndexOutOfBoundsException子類處理數(shù)組越界異常,IOException子類處理輸入輸出異常,而ArithmeticException子類處理除數(shù)為0導致的算術(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òu)造方法,主要的有下列5個:String();String(charchars[]);String(charchars[],intstartIndex,intnumChars);String(byteascii[],inthiByte);String(byteascii[],inthiByte,intstartIndex,intnumChars);第1個構(gòu)造方法生成一個空串。第2個構(gòu)造方法生成一個字元數(shù)組。第3個構(gòu)造方法生成一個字串,這個字串是從字元數(shù)組chars[]中提取的,具體講,即從chars[]數(shù)組的startIndex位置開始提取字元,共提取numChars個字元組成一個字串。第4個構(gòu)造方法是以位元組數(shù)組的形式生成一個字串,數(shù)組中存放字串各字元對應的ASCII碼。第5個構(gòu)造方法也是從位元組數(shù)組生成一個字串。具體講,就是以位元組數(shù)組ascii[]的startIndex處開始,共提取numChars個字元構(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);}}運行結(jié)果見圖4-5。圖4-5程式分析:String類提供了9個構(gòu)造函數(shù),以便使用各種方法初始化String對象。例題共演示了7種。程式“s1=newString()”實例化一個新的String對象,並使用String類的缺省構(gòu)造函數(shù)將它賦給引用s1。新的String對象沒有字元(即空串),長度為0?!皊2=newString(s);”例化一個新的String對象,並使用String類的拷貝構(gòu)造函數(shù),將它賦給引用s2。s被當作參數(shù)傳送給構(gòu)造函數(shù),新的String對象包含了String對象s中的字元的拷貝。在大多數(shù)情況下,沒有必要拷貝已有的String對象。String對象是不變的,一旦創(chuàng)建後就不能改變它們的內(nèi)容(字串)。而且,如果有一個或多個引用指向某個String對象,垃圾收集器就不能回收該對象。也就是說,String引用既不能用於修改String對象,也不能刪除String對象。這一點與C語言或C++語言是不同的?!皊3=newString(charArray);”實例化一個新的String對象,並使用以字元數(shù)組為參數(shù)的String類構(gòu)造函數(shù),將它賦給引用s3。新的String對象包含了數(shù)組中字元的拷貝?!皊4=newString(charArray,6,3);”實例化一個String對象,使用以一個字元數(shù)組和兩個整數(shù)為參數(shù)的String類構(gòu)造函數(shù),將它賦給引用s4。第2個參數(shù)指定了在數(shù)組中拷貝字元的起始位置(offset)。第3個參數(shù)指定了數(shù)組中拷貝字元的數(shù)目(count),新的String對象包含了數(shù)組中指定字元的拷貝。如果offset或count參數(shù)指定的所取元素超過了字元數(shù)組的界限,就會產(chǎn)生StringIndexOutOfBoundsException的例外處理?!皊5=newString(byteArray,4,4);”實例化一個新的String對象,使用以一個byte數(shù)組和兩個整數(shù)為參數(shù)的String類構(gòu)造函數(shù),將它賦給引用s5。第2和第3個參數(shù)分別指定了offset和count。新的String對象包含了數(shù)組中指定byte的拷貝。如果offset或count參數(shù)指定的所取元素超過了byte數(shù)組的界限,就會產(chǎn)生一個StringIndexOutOfBoundsException的例外處理?!皊6=newString(byteArray);”實例化一個新的String對象,使用以一個byte數(shù)組為參數(shù)的String類構(gòu)造函數(shù),將它賦給引用s6。新的String對象包含了數(shù)組中byte的拷貝?!皊7=newString(buffer);”實例化一個新的String對象,使用以StringBuffer為參數(shù)的String類構(gòu)造函數(shù),將它賦給引用s7。StringBuffer是一個可動態(tài)改變大小和內(nèi)容的字串。新的String對象包含了StringBuffer中字元的拷貝。2.String類的length、charAt和getChars方法 下麵的例子演示了String類的length、charAt和getChars方法,它們分別用於確定String類的長度、取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)可返回一個字串,它將把參數(shù)str添加在原字串的後面形成一個新的字串。但在Java中,更多的是使用“+”來連接字串。這裏讀者可能會產(chǎn)生一個小小的迷惑,因為前面我們講過String對象是不能改變的。實際上,字串的連接是由編譯器利用StringBuffer的方法append來實現(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);}}運行結(jié)果見圖4-10。7.轉(zhuǎn)化為字串圖4-104.2.2StringBuffer類 String類提供了很多處理字串的功能。但是,一旦創(chuàng)建了字串對象,它的內(nèi)容就永遠不會變。下麵將討論StringBuffer類的特點。這個類可以創(chuàng)建和操縱動態(tài)字串,即可修改的字串。每個StringBuffer都能夠存儲由它的容量所指定的一些字元。如果超過了StringBuffer的容量,容量就會自動地擴大以容納多出來的字元。我們將看到,StringBuffer類還可用來實現(xiàn)用於字串連接的運算符"+"。 String對象是常量字串,StringBuffer對象是可修改的字串。Java區(qū)分字串和可修改的字串是為了優(yōu)化的目的。特別地,Java可以實現(xiàn)有關(guān)String對象的某些優(yōu)化,例如多個引用共用一個String對象,因為它知道這些對象不會改變。 注意:在選擇是用String對象還是用StringBuffer對象來表示一個字串時,如果該對象確實不會改變,則總是使用String對象,這樣做可以改善性能。對String對象調(diào)用非String類的StringBuffer方法是一種語法錯誤。StringBuffer提供的方法有一些與String相同,有一些不同。最主要的方法有兩組,一組是append,另一組是insert。4.3AWT4.3.1AWT概述4.3.2AWT的特點4.3.3AWT應用4.4Javaapplet4.4.1Javaapplet的特點 Javaapplet與Java應用程式不同。它們的不同之處有以下幾個方面。 (1)Java應用程式中,必須有一個main()方法。Main()方法是程式的入口,當程式開始運行時,解釋器首先查找main()方法並執(zhí)行。而Javaapplet中則不需要main()方法,它必須嵌入HTML檔中,由支持Javaapplet的流覽器運行。(2)Java應用程式可以獨立運行。而Javaapplet不能獨立運行,需要依賴於網(wǎng)路流覽器。(3)Java應用程式所實現(xiàn)的功能是完全的,不需依賴於其他程式。而Javaapplet實現(xiàn)的功能是不完全的,它必須借助於流覽器中預先設(shè)計好的功能和已有的圖形介面。Javaapplet只需接收流覽器發(fā)送給它的消息,並及時做出回應。 (4)Java應用程式中的所有方法的使用是通過調(diào)用實現(xiàn)的??梢匀藶榭刂?。而Javaapplet中有一部分方法是固定的,只能由流覽器在特定時刻和場合調(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由若干類組成,無需main()方法,但必須有且僅有一個主類,該類是Applet類的子類,且被聲明為public。程式被保存時,程式名必須命名為主類名,即程式名與主類名完全相同,尾碼為.java。主類中定義了init()、start()、stop()、destroy()和paint()方法,這些方法是從Applet中繼承的,有固定的含義,由流覽器在時機成熟時自動執(zhí)行。4.4.3Applet的主要方法 在流覽器中運行Applet程式,從運行開始到運行結(jié)束,Applet程式需經(jīng)歷4個狀態(tài),分別是初始狀態(tài)、運行狀態(tài)、停止態(tài)和消亡狀態(tài)。這4種狀態(tài)分別對應Applet的4個主要方法:init()、start()、stop()和destroy()。 對於支持Java的流覽器,如果在運行一個HTML檔時發(fā)現(xiàn)該檔包含Applet程式,流覽器就會生成該Applet的一個實例,並調(diào)用init()方法,進入初始化狀態(tài),在該狀態(tài)下完成Applet的一些初始化操作。初始化完成後,流覽器接著調(diào)用start()方法,進入運行狀態(tài),真正開始執(zhí)行Applet,在該狀態(tài)下Applet通常會啟動一些線程執(zhí)行各種任務。 當退出當前主頁時,流覽器調(diào)用stop()方法終止在運行狀態(tài)下啟動的線程,進入停止狀態(tài)。當用戶退出流覽器時,流覽器首先調(diào)用Applet的stop()方法,停止Applet的執(zhí)行,然後調(diào)用destroy()方法釋放Applet佔用的系統(tǒng)資源,進入消亡狀態(tài)。下麵具體介紹init()、start()、stop()和destroy()4種方法。1.Init()方法在Applet執(zhí)行過程中,init()方法只執(zhí)行一次。當流覽器第一次流覽含有Applet的Web頁載入Applet時,就會執(zhí)行init()方法。由於在Applet執(zhí)行過程中,該方法只被執(zhí)行一次,所以可以在init()方法中進行一些只需執(zhí)行一次的初始化操作,如變數(shù)的初始化、設(shè)置Applet初始狀態(tài)、載入圖形或字體、獲取HTML中Applet標記單元中<PARAM>設(shè)定的參數(shù)等。2.start()方法調(diào)用完init()方法,流覽器將調(diào)用start()方法啟動Applet。和init()方法不同,在Applet的執(zhí)行過程中,start()方法可被流覽器調(diào)用多次。在下列情況下,流覽器會調(diào)用start()方法。(1)流覽器從圖示狀態(tài)恢復為窗口狀態(tài)或縮放流覽器窗口時。(2)Applet第一次載入時。(3)離開該Web頁後又再返回時。(4)reload該頁面時。在start()方法中可啟動相關(guān)線程來控制Applet,給引入類對象發(fā)送消息,或以某種方式通知Applet開始運行。該方法是Applet的主體。3.stop()方法該方法與start()方法是相對應的,在Applet執(zhí)行過程中,也會被流覽器調(diào)用多次。在下列情況下,流覽器會調(diào)用stop()方法。(1)流覽器從圖示狀態(tài)恢復為窗口狀態(tài)或縮放流覽器窗口時。(2)離開Applet所在Web頁時。(3)reload該頁面時。(4)關(guān)閉該Web頁時。(5)從該Web頁退出流覽器運行時。stop()方法可在適當時機掛起Applet,停止一些佔用系統(tǒng)資源的工作,釋放系統(tǒng)處理資源,以提高系統(tǒng)的運行速度。4.destroy()方法在徹底結(jié)束對該Web頁的訪問或退出流覽器時調(diào)用destroy()方法,卸載Applet,釋放載入Applet時分配的系統(tǒng)資源。在Applet的執(zhí)行過程中,destroy()方法只執(zhí)行一次。destroy()方法是Applet類的類方法,只能用於Applet??稍谠摲椒ㄖ袌?zhí)行釋放系統(tǒng)資源的代碼。但一般不需重寫destroy()方法,因為Java運行系統(tǒng)本身會自動進行“垃圾”處理和記憶體管理,除非用了特殊的資源如創(chuàng)建的線程。注意:destroy()方法與stop()方法不同。除了上述4個方法外,Applet還提供一個非常重要的方法:paint(Graphicsg)方法。該方法用於進行繪圖的具體操作,但沒有實現(xiàn)任何操作,用戶可重寫該方法,實現(xiàn)個性化的繪圖操作。在Applet執(zhí)行過程中,paint()方法可以被流覽器自動調(diào)用執(zhí)行繪圖操作,可調(diào)用多次。當調(diào)整流覽窗口大小、縮放流覽窗口、移動窗口或reload等需要重繪窗口時都會調(diào)用paint()方法。與其他4個方法不同的是,paint()中需傳遞一個參數(shù),該參數(shù)是Graphics類的對象,由這個對象來完成具體的繪圖操作。Graphics對象由流覽器自動創(chuàng)建並將其傳送給paint()方法。注意:應在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的運行 Javaapplet程式不能獨立運行,必須由流覽器來運行,因此我們需編寫一個HTML檔,通過<applet>標記將applet程式編譯生成的位元組碼檔嵌入HTML檔,通知流覽器來運行Javaapplet。 如要運行例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標簽5.3按鈕5.4選擇框5.5畫布5.6面板與佈局設(shè)計5.7窗口5.8菜單5.9對話框5.1文本框和文本區(qū)5.1.1文本框及處理事件1.文本框的創(chuàng)建2.文本框處理事件 例5-2:兩個空白文本框,當在第一個文本框內(nèi)輸入字元時,在文本框內(nèi)顯示“*”號,輸入完畢按回車鍵後,在第二個文本框內(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");}}}運行結(jié)果見圖5-2。圖5-15.1.2文本區(qū)及處理事件 例5-4:在Applet中添加一個文本框和一個文本區(qū),每當在文本框中輸入一個字元時,在文本區(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");}}}運行結(jié)果見圖5-4。圖5-45.2標簽 標籤(Label)是AWT構(gòu)件中最簡單的一種構(gòu)件,所謂標籤實質(zhì)上就是一段文字,但它與文字不同的是它是一個對象,所以在每次repaint時,不用重新添加。標籤在GUI介面中通常作為提示資訊使用。標籤構(gòu)件的構(gòu)造方法如下。(1)Label()構(gòu)造一個空的標籤。(2)Label(Stringstr)構(gòu)造一個以Stringstr為內(nèi)容的標籤。(3)Label(Stringstr,intalign)定義一個以Stringstr為內(nèi)容的標籤。5.3按鈕5.3.1按鈕 按鈕(Button)是GUI用戶介面中常用的元素,它是用戶輸入命令的一個重要工具。當用滑鼠單擊某個按鈕該按鈕獲得焦點時,在鍵盤上按回車鍵都會導致一個命令的執(zhí)行。Button類有兩種構(gòu)造方法。 (1)Button()構(gòu)造一個沒有標籤的按鈕。 (2)Button(Stringstr)構(gòu)造一個以Stringstr為標籤的按鈕。5.3.2按鈕處理事件 與按鈕有關(guān)的事件有兩類。1.ActionEvent 當用滑鼠單擊按鈕,或當按鈕獲得焦點時在鍵盤上按回車鍵都導致該事件的發(fā)生,此時任何實現(xiàn)了被註冊為監(jiān)聽者的ActionListener介面的類,它的actionPerformed()方法將被調(diào)用。下麵的程式範例在Applet上添加兩個命令按鈕,其標籤分別為“顯示”和“清除”,當單擊“顯示”按鈕時,在文本區(qū)中顯示:“你按下了顯示按鈕”,當按“清除”按鈕時則清除文本區(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你按下了"清除"按鈕");}}}運行結(jié)果見圖5-6。圖5-62.FocusEvent FocusEvent稱作焦點事件,它的發(fā)生是指鍵盤游標移動到構(gòu)件上並且可以接受鍵盤的輸入。如果游標移動到一個按鈕上,稱作該按鈕獲得焦點,反之稱作失去焦點。當一個按鈕獲得焦點時單擊回車鍵即相當於用滑鼠單擊該按鈕。如果一個文本框獲得焦點就可以在該文本框中輸入字元。例5-7:按鈕和文本框檢測焦點事件的例子。程式如下: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);}}運行結(jié)果見圖5-7。圖5-7在上面的例子中,只有button1和txt1註冊了焦點事件的事件監(jiān)聽者,它們共用同一個事件處理程式。如果焦點在button1或txt1上面,文本框txt2顯示焦點在哪個構(gòu)件上(focusGaned),反之則指出無焦點(focusLost)。文本框txt1內(nèi)顯示事件的參數(shù)字串,它也能指出是否有焦點。另外,程式中的setLayout(newFlowLayout())語句是控制構(gòu)件的佈局用的,關(guān)於這個問題將在後面的章節(jié)中進行討論。5.4選擇框5.4.1選擇框1.下拉列表框(Choice)2.列表框(List)3.複選框(Checkbox)4.單選框(Checkboxgroup-RadioButton)5.4.2選擇框處理事件 例5-12:選擇框檢測ItemEvent事件的例子。

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

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

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());}}運行結(jié)果見圖5-12。圖5-125.5畫布例5-13:創(chuàng)建一個畫布。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);}}運行結(jié)果見圖5-13。圖5-135.6面板與佈局

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論