第3章java電子教案_第1頁
第3章java電子教案_第2頁
第3章java電子教案_第3頁
第3章java電子教案_第4頁
第3章java電子教案_第5頁
已閱讀5頁,還剩119頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第3章java電子教案本章主要介紹編寫Java程序必須了解的若干語言基礎知識,包括Java程序的結構、數據類型、變量、常量、表達式和流程控制語句等。掌握這些基礎知識,是書寫正確的Java程序的前提條件。3.1Java程序的構成

上一章中已經介紹了幾個簡單的Java程序的例子,通過它們可以了解Java程序的一般構成規則,下面仍以例2-5中的程序為例,介紹Java程序的構成。AppletInOut.java 1:importjava.applet.*; 2:importjava.awt.*; 3:importjava.awt.event.*; 4:publicclassAppletInOutextendsApplet implementsActionListener主類類頭 5:{父類 6:Labelprompt; 7:TextFieldinput,output;靜態屬性 8: 9:publicvoidinit() 10:{ 11:prompt=newLabel(″請輸入您的名 字:″); 12:input=newTextField(6); 13:output=newTextField(20); 14:add(prompt); 15:add(input); 16:add(output); 17:input.addActionListener(this);方法1 18:} 19:publicvoidactionPerformed(ActionEvente) 20:{ 21:output.setText(input.getText()+″, 歡迎你!″); 22:}方法2 23:}主類類體Java源程序是由類定義組成的,每個程序中可以定義若干個類,但是只有一個類是主類。在JavaApplication中,這個主類是指包含main方法的類;在JavaApplet里,這個主類是一個系統類Applet的子類。主類是Java程序執行的入口點。同一個Java程序中定義的若干類之間沒有嚴格的邏輯關系要求,但它們通常是在一起協同工作的,每一個類都可能需要使用其他類中定義的靜態屬性或方法。Java程序中定義類使用關鍵字class,每個類的定義由類頭定義和類體定義兩部分組成。類體部分用來定義靜態屬性和方法這兩種類的成員,其中方法類似于其他高級語言中的函數,而靜態屬性則類似于變量。類頭部分除了聲明類名之外,還可以說明類的繼承特性,當一個類被定義為是另一個已經存在的類(稱為這個類的父類)的子類時,它就可以從其父類中繼承一些已定義好的類成員而不必自己重復編碼。語句是構成Java程序的基本單位之一。每一條Java語句都由分號(;)結束,其構成應該符合Java的語法規則。類和方法中的所有語句應該用一對大括號括起。Java程序是由類定義組成的,每個類內部包括類的靜態屬性聲明和類的方法兩部分,所以除了靜態屬性聲明語句之外,其他的執行具體操作的語句只能存在于類方法的大括號之中,而不能跳出方法孤立地直接書寫在類中。例如,例2-5中第11~17句、第21句,這些語句都不能寫在方法的外面。比語句更小的語言單位是表達式、變量、常量和關鍵字等,Java的語句就是由它們構成的。其中變量與常量關鍵字是Java語言語法規定的保留字,用戶程序定義的常量和變量的取名不能與保留字相同。3.2數據類型、變量與常量

3.2.1數據類型表列出了Java中定義的所有數據類型,可以看出Java的數據類型的設置與C語言相近。其不同之處在于:首先,Java的各種數據類型占用固定的內存長度,與具體的軟硬件平臺環境無關;其次,Java的每種數據類型都對應一個缺省的數值,使得這種數據類型的變量的取值總是確定的。這兩點分別體現了Java的跨平臺特性和安全穩定性。表3.1Java的基本數據類型數據類型關鍵字占用位數缺省數值取值范圍布爾型boolean8falsetrue,false字節型byte80-128~127字符型char16′\u0000′′\u0000′~′\uFFFF′短整型short160-32768~32767整型int320-2147483648~2147483647長整型long640-9223372036854775808~9223372036854775807浮點型float320.0F1.40129846432481707e-45~3.40282346638528860e+38雙精度型double640.0D4.94065645841246544e-324~1.79769313486231570e+308dboolean是用來表示布爾型數據的數據類型。boolean型的變量或常量的取值只有true和false兩個。其中,true代表“真”,false代表“假”。

byte是用來處理未經加工的二進制數據的數據類型,每個byte型的常量或變量中包含8位(bit)的二進制信息。

Java的字符數據類型char與其他語言相比有較大的改進。C語言等的字符類型是采用ASCII編碼,每個數據占用8比特的長度,總共可以表示256個不同的字符。ASCII編碼是國際標準的編碼方式,但是也有其一定的局限性,最典型的體現在處理以漢字為代表的東方文字方面。漢字的字符集大,僅用8位編碼是不夠的,所以傳統的處理方法是用兩個8位的字符數據來表示一個漢字。為了簡化問題,Java的字符類型采用了一種新的國際標準編碼方案——Unicode編碼。每個Unicode碼占用16個比特位,包含的信息量比ASCII碼多了一倍,無論東方字符還是西方字符,都可以統一用一個字符表達。由于采用Unicode編碼方案,為Java程序在基于不同語言的平臺間實現平滑移植鋪平了道路。上面所介紹的數據類型都是基本數據類型,Java中還存在著一種引用數據類型(reference),包括類和接口等。比如,對應基本的double類型,還存在著一個類Double。這些類在包含基本數據類型所表示的一定范圍、一定格式的數值的同時,還包含了一些特定的方法,可以實現對數值的專門操作,如把字符串轉換成雙精度型數值等。嚴格的面向對象語言中不應該有基本數據類型存在;但事實上這些簡單數據類型應用得太廣太多了,為了簡化編程,Java中就定義了與面向過程語言相似的與類無關的基本數據類型。從這個意義上來說,Java仍繼承了面向過程的一些東西,并不是嚴格意義上的完全面向對象的語言。3.2.2標識符任何一個變量、常量、方法、對象和類都需要有一個名字標志它的存在,這個名字就是標識符。標識符可以由編程者自由指定,但是需要遵循一定的語法規定。Java對于標識符的定義有如下的規定:(1)標識符可以由字母、數字和兩個特殊字符下劃線(-)、美元符號($)組合而成。(2)標識符必須以字母、下劃線或美元符號開頭。(3)Java是大小寫敏感的語言,class和Class,System和system分別代表不同的標識符,在定義和使用時要特別注意這一點。(4)應該使標識符能一定程度上反映它所表示的變量、常量、對象或類的意義。表列出了一些合法、不合法的標識符,讀者可以自己分析一下不合法的標識符錯在何處。表3.2合法與不合法的標識符的例子合法標識符不合法標識符FirstJavaApplet1FirstJavaApplicationMySalary12Tree&Glasses-isTrue-isTrue-$theLastOneJavaBuilderHelloWorld273.153.2.3常量常量一經建立,在程序運行的整個過程中都不會改變。Java中常用的常量有布爾常量、整型常量、字符常量、字符串常量和浮點常量。1.布爾常量布爾常量包括true和false,分別代表真和假。2.整型常量整型常量可以用來給整型變量賦值,整型常量可以采用十進制、八進制和十六進制表示。十進制的整型常量用非0開頭的數值表示,如100,-50;八進制的整型常量用以0開頭的數字表示,如017代表十進制的數字15;十六進制的整型常量用0x開頭的數值表示,如0x2F代表十進制的數字47。整型常量按照所占用的內存長度,又可分為一般整型常量和長整型常量,其中一般整型常量占用32位,長整型常量占用64位。長整型常量的尾部有一個大寫的L或小寫的l,如-386L,017777l。3.浮點常量浮點常量表示的是可以含有小數部分的數值常量。根據占用內存長度的不同,可以分為一般浮點常量和雙精度浮點常量兩種。一般浮點常量占用32位內存,用F、f表示,如,,;雙精度浮點常量占用64位內存,用帶D或d或不加后綴的數值表示,如,,。與其他高級語言類似,浮點常量還有一般表示法和指數表示法兩種不同的表示方法。4.字符常量字符常量用一對單引號括起的單個字符表示,這個字符可以直接是Latin字母表中的字符,如′a′,′Z′,′8′,′#′;也可以是轉義符,還可以是要表示的字符所對應的八進制數或Unicode碼。轉義符是一些有特殊含義、很難用一般方式表達的字符,如回車、換行等。為了表達清楚這些特殊字符,Java中引入了一些特別的定義。所有的轉義符都用反斜線(\)開頭,后面跟著一個字符來表示某個特定的轉義符,詳見表。表3.3轉義符引用方法對應Unicode碼意義′\b′′\u0008′退格′\t′′\u0009′水平制表符tab′\n′′\u000a′換行′\f′′\u000c′表格符′\r′′\u000d′回車′\″′′\u0022′雙引號′\′′′\u0027′單引號′\\′′\u005c′反斜線表中間一列表示的是一個字符的Unicode碼,還可以用八進制表示一個字符常量。如′\101′就是用八進制表示一個字符常量,它與′\u0047′和′A′表示的是同一個字符,作為常量它們是相同的。需要補充說明的是,八進制表示法只能表示′\000′~′\377′范圍內的字符,即不能表示全部的Unicode字符,而只能表示其中ASCII字符集的部分。5.字符串常量字符串常量是用雙引號括起的一串若干個字符(可以是0個)。字符串中可以包括轉義符,標志字符串開始和結束的雙引號必須在源代碼的同一行上。下面是幾個字符串常量的例子:″Hello″,″My\nJava″,″Howareyou?1234″,″″。在Java中可以使用連接操作符(+)把兩個或更多的字符串常量串接在一起,組成一個更長的字符串。例如,″Howdoyoudo?″+″\n″的結果是″Howdoyoudo?\n″。3.2.4變量變量是在程序的運行過程中數值可變的數據,通常用來記錄運算中間結果或保存數據。Java中的變量必須先聲明后使用,聲明變量包括指明變量的數據類型和變量的名稱,必要時還可以指定變量的初始數值。如下面的語句: booleanm-bFlag=true;聲明了一個布爾類型的簡單變量,名字為m-bFlag,該變量的初值是邏輯真。由于聲明變量的語句也是Java程序中的一個完整的語句,所以它與其他Java語句一樣需要用分號結束。下面是其他幾個變量聲明的例子: charmyCharacter=′B′; longMyLong=-375; intm-iCount=65536; doublem-dScroe;聲明變量又稱為創建變量,執行變量聲明語句時系統根據變量的數據類型在內存中開辟相應的空間并登記變量名稱、初始值等信息。Java的變量有一定的生存期和有效范圍,與C語言一樣,Java用大括號將若干語句組成語句塊,變量的有效范圍就是聲明它的語句所在的語句塊,一旦程序的執行離開了這個語句塊,變量就沒有意義,不能再使用了。例 1:publicclassUseVariable 2:{ 3:publicstaticvoidmain(Stringargs[]) 4:{ 5:booleanb=true; 6:shortsi=128; 7:inti=-99; 8:longl=123456789L; 9:charch=′J′; 10:floatf=3.1415925F; 11:doubled=-1.04E-5; 12:Strings=″你好!″; 13:System.out.println(″布爾型變量b= ″+b); 14:System.out.println(″短整型變量si= ″+si); 15:System.out.println(″整型變量i=″ +i); 16:System.out.println(″長整型變量l= ″+l); 17:System.out.println(″字符型變量ch= ″+ch); 18:System.out.println(″浮點型變量f= ″+f); 19:System.out.println(″雙精度型變量d= ″+d); 20:System.out.println(″字符型對象s= ″+s); 21:} 22:}圖是例3-1的運行結果。圖3.1例3-1的運行結果例3-1是一個字符界面的JavaApplication程序,其中定義了若干個變量并用相應類型的常量為它們賦初始值。其中第10句中特別使用了浮點常量(有興趣的讀者可以去掉常量后面的字符′F′,再嘗試編譯看能得到什么結果)。第11句中的雙精度常量使用科學計數法表示。第12句定義了一個字符串對象,String不是基本數據類型,而是一個系統定義的類名,每一個字符串變量實際上都是一個字符串對象。但是由于字符串是十分常用的對象,它的聲明和創建可以簡化成第12句那樣的形式。第13句到第20句使用System.out.println()這個系統已經定義好的方法來輸出前面所定義的所有變量的數值。每個語句首先利用一個字符串常量作為解釋性信息,然后把各種數據類型的數據轉化成字符串的形式,用“+”拼接在前面的字符串常量的后面,共同輸出。輸出完畢后這個方法將把光標換到下一行,準備下一次輸出。例3-2getNumber.java 1:importjava.io.*; 2: 3:publicclassgetNumber 4:{ 5:publicstaticvoidmain(Stringargs[]) 6:{ 7:inti=0; 8:Strings; 9: 10:try{ 11:System.out.print(″請輸入一個整 型數:″); 12:BufferedReaderbr= 13:newBufferedReader(new InputStreamReader(System.in)); 14:s=br.readLine(); 15:i=Integer.parseInt(s); 16:}catch(IOExceptione){} 17:System.out.print(″你輸入了數字:″ +i); 18:System.out.println(″\t,對嗎?″); 19:} 20:}圖是例3-2的運行結果。圖3.2例3-2的運行結果例3-2接受用戶從鍵盤輸入的一個字符串,然后把它轉化成整型數據并輸出。如在圖中用戶輸入了字符串“245”,利用例3-2第15句中系統定義的方法Integer.parseInt()就可以把它轉化成數字245。其中Integer是系統定義的一個類,對應基本數據類型int,parseInt()是Integer類的一個方法,可以把數字字符組成的字符串轉化成真正的整型數字。另外,第11句和第17句還使用了一個新的輸出方法System.out.print()。這個方法的用法和作用與System.out.println()基本相同,唯一的區別是輸出了數據后并不回車。第18句使用轉義符′\t′將輸出數據與字符串常量拉開距離。例 1:importjava.applet.*; 2:importjava.awt.*; 3:importjava.awt.event.*; 4: 5:publicclassgetDoubleextendsApplet implementsActionListener 6:{ 7:Labelprompt; 8:TextFieldinput; 9:doubled=0.0; 10: 11:publicvoidinit() 12:{ 13:prompt=newLabel(″請輸入一個浮 點數:″); 14:input=newTextField(10); 15:add(prompt); 16:add(input); 17:input.addActionListener(this); 18:} 19:publicvoidpaint(Graphicsg) 20:{ 21:g.drawString(″你輸入了數據:″+ d,10,50); 22:} 23:publicvoidactionPerformed(ActionEvent e) 24:{ 25:d=Double.valueOf(input.getText()).doubleValue(); 26:repaint(); 27:} 28:}圖是例3-3的運行結果。圖3.3例3-3的運行結果例3-3是一個圖形界面下的JavaApplet程序,通過這個例子可以了解如何在圖形界面下輸入數值數據。用戶在文本框對象input中輸入字符串并回車后,程序接受用戶輸入的這個字符串(在圖中是“3.1415926”),利用第25句中的方法Double.valueOf().doubleValue()將這個字符串轉化成真正的浮點數據賦值給雙精度變量d(在圖中是)。第26句調用Applet類中系統定義好的方法repaint(),這個方法將調用第19句到22句的方法paint(),把變量d中的數據顯示出來。為體會圖形界面輸入數據的方法,讀者可以針對例3-3做如下實驗:(1)刪除第15句,編譯并運行,觀察界面的變化。(2)恢復第15句,刪除第16句,編譯并運行,觀察界面的變化。(3)恢復第16句,刪除第17句,編譯并運行,觀察界面的變化。(4)恢復第17句,刪除第26句,編譯并運行,觀察界面的變化。3.3表達式表達式是由變量、常量、對象、方法調用和操作符組成的式子。符合語法規則的表達式可以被編譯系統理解、執行或計算,表達式的值就是對它運算后所得的結果。組成表達式的Java操作符有很多種,代表了多種的豐富的操作運算,包括賦值運算、算術運算、關系運算和邏輯運算等。3.3.1賦值與強制類型轉換

賦值運算符對應了賦值運算,即賦予程序里的變量或對象一定的內容。簡單的賦值運算是把一個表達式的值直接賦給一個變量或對象,使用的賦值運算符是“=”,其格式如下: 變量或對象=表達式;其中賦值號右邊的表達式可以是常量、另一個變量或對象以及方法的返回值。下面是一些簡單賦值運算的例子: i=0; j=i; k=i+j*5; MyFirstString=MyDouble.toString(); MySecondString=MyFirstString;需要注意的是,當賦值號的左邊是一個對象名時,賦值運算符將把右邊表達式所得的對象的引用賦值給它,而不是為這個對象開辟新的內存空間并把右邊對象的所有內容賦值給它。在使用賦值運算時,可能會遇到等號左邊的數據類型和等號右邊的數據類型不一致的情況,這時需要把等號右邊的數據類型轉化成等號左邊的數據類型。某些情況下,系統可以自動完成這種類型轉換,另一些情況下就要用到強制類型轉換。Java的類型轉換有較嚴格的規定:凡是將變量從占用內存較少的短數據類型轉化成占用內存較多的長數據類型時,可以不做顯式的類型轉換聲明;而將變量從較長的數據類型轉換成較短的數據類型時,則必須做強制類型轉換。例如下面的例子中分別定義了16位的字節類型變量MyByte和32位的整數類型變量MyInteger: byteMyByte=10; intMyInteger=-1;如果把MyByte的值賦給MyInteger,則可以直接寫成: MyInteger=MyByte;而把MyInteger的值賦給MyByte,則必須寫成MyByte=(byte)MyInteger;先把變量MyInteger中保存的數值的數據類型從int變成byte后才能賦給MyByte,其中,(byte)就是在做強制類型轉換。其一般格式是: (數據類型)變量名或表達式3.3.2算術運算算術運算是針對數值類型操作數進行的運算,算術運算符根據需要的操作數個數的不同,可以分為雙目運算符和單目運算符兩種。1.雙目運算符

表3.4雙目算術運算符運算符運算例功能+加a+b求a與b相加的和-減a-b求a與b相減的差*乘a*b求a與b相乘的積/除a/b求a除以b的商%取余a%b求a除以b所得的余數這里有兩個需要注意的問題:(1)只有整數類型(int,long,short)的數據才能夠進行取余運算,float和double不能取余。(2)兩個整數類型的數據做除法時,結果是截取商數的整數部分,而小數部分被截斷。如果希望保留小數部分,則應該對除法運算的操作數做強制類型轉換。例如1/2的結果是0,而((float)1)/2的結果是。2.單目運算符單目運算符的操作數只有一個,算術運算中有三個單目運算符。表3.5單目算術運算符運算符運算例功能等價++自增a++或++aa=a+1--自減a--或--aa=a-1-求相反數-aa=-a單目運算符中的自增和自減,其運算符的位置可以在操作數的前面,也可以在操作數的后面;當進行單目運算的表達式位于一個更復雜的表達式內部時,單目運算符的位置將決定單目運算與復雜表達式二者執行的先后順序。如下面的例子里,單目運算符在操作數變量的前面,則先執行單目運算,修改變量的值后用這個新值參與復雜表達式的運算。 intx=2; inty=(++x)*3;運算執行的結果是x=3,y=9。而在下面的例子里,由于單目運算符放在操作數變量的后面,則先計算復雜表達式的值,最后再修改變量的取值。 intx=2; inty=(x++)*3;運算執行的結果是x=3,y=6。可見,單目運算符的位置不同,雖然對操作數變量沒有影響,但卻會改變整個表達式的值。例3-4TestArithmetic.java 1:importjava.applet.*; 2:importjava.awt.*; 3:importjava.awt.event.*; 4: 5:publicclassUseArithmeticextendsApplet implementsActionListener 6:{ 7:Labelprompt; 8:TextFieldinput1,input2; 9:Buttonbtn; 10:inta=0,b=1; 11: 12:publicvoidinit() 13:{ 14:prompt=newLabel(″請輸入兩個整 型數據:″); 15:input1=newTextField(5); 16:input2=newTextField(5); 17:btn=newButton(″計算″); 18:add(prompt); 19:add(input1); 20:add(input2); 21:add(btn); 22:btn.addActionListener(this); 23:} 24:publicvoidpaint(Graphicsg) 25:{ 26:g.drawString(a+″+″+b+″=″ +(a+b),10,50); 27:g.drawString(a+″-″+b+″=″ +(a-b),10,70); 28:g.drawString(a+″*″+b+″=″ +(a*b),10,90); 29:g.drawString(a+″/″+b+″=″ +(a/b),10,110); 30:g.drawString(a+″%″+b+″= ″+(a%b),10,130); 31:} 32:publicvoidactionPerformed(ActionEvent e) 33:{ 34:a=Integer.parseInt(input1.getText()); 35:b=Integer.parseInt(input2.getText()); 36:repaint(); 37:} 38:}例3-4是圖形界面中的JavaApplet程序,它利用兩個文本框對象input1和input2接受用戶輸入的兩個數據。當用戶單擊按鈕“計算”時,程序將把這兩個字符串轉化為整型數據賦值給同類的兩個變量a和b,然后通過repaint()方法調用第24行到第31行的paint()方法,以a和b為操作數,計算它們四則運算的結果并輸出。圖是例3-4運行結果。

圖3.4例3-4的運行結果3.3.3關系運算關系運算是比較兩個數據之間的大小關系的運算,常用的關系運算列于表中:表3.6關系運算符運算符運算==等于!=不等于>大于<小于>=大于等于<=小于等于關系運算的結果是布爾型的量,即“真”或“假”。例如: intx=5,y=7; booleanb=(x==y);則b的初始值是false。另外,需注意區分等于號和賦值號,不要混淆。例3-5UseRelation.java 24:publicvoidpaint(Graphicsg) 25:{ 26:g.drawString(a+″>″+b+″=″+ (a>b),10,50); 27:g.drawString(a+″<″+b+″=″+ (a<b),10,70); 28:g.drawString(a+″>=″+b+″=″+ (a>=b),10,90); 29:g.drawString(a+″<=″+b+″=″+ (a<=b),10,110); 30:g.drawString(a+″==″+b+″=″+ (a==b),10,130); 31:g.drawString(a+″!=″+b+″=″+ (a!=b),10,150); 32:}圖是例3-5的運行結果。例3-5在例3-4的基礎上修改了第24句到第31句的paint()方法,比較用戶輸入的兩個整型數之間的關系并把比較結果輸出。圖3.5例3-5的運行結果3.3.4邏輯運算邏輯運算是針對布爾型數據進行的運算,運算的結果仍然是布爾型量。常用的邏輯運算符見表。表3.7邏輯運算符運算符運算例運算規則&非簡潔與x&yx,y都真時結果才為真|非簡潔或x|yx,y都假時結果才為假!取反!xx真時為假,x假時為真^異或x^yx,y同真假時結果為假&&簡潔與x&&yx,y都真時結果才為真||簡潔或x||yx,y都假時結果才為假“&”和“|”被稱為非簡潔運算符,因為在利用它們做與、或運算時,運算符左右兩邊的表達式總會被運算執行,然后再對兩表達式的結果進行與、或運算;而在利用“&&”和“||”做簡潔運算時,運算符右邊的表達式有可能被忽略而不加執行。例如: intx=3,y=5; booleanb=x>y&&x++==y--;在計算布爾型的變量b的取值時,先計算&&左邊的關系表達式x>y,得結果為假,根據邏輯與運算的規則,只有參加與運算的兩個表達式都為真時,最后的結果才為真;所以不論&&右邊的表達式結果如何,整個式子的值都為假,右邊的表達式就不予計算執行了;最后三個變量的取值分別是:x為3,y為5,b為false。如果把上題中的簡潔與(&&)換為非簡潔與(&),則與號兩邊的兩個表達式都會被運算,最后三個變量的取值分別是:x為4,y為4,b為false。同理,對于簡潔或(|),若左邊的表達式的運算結果為真,則整個或運算的結果一定為真,右邊的表達式就不會再運算執行了。例3-6UseLogical.java … 10:booleana=true,b=false; … 24:publicvoidpaint(Graphicsg) 25:{ 26:g.drawString(a+″&″+b+″=″+ (a&b),10,50); 27:g.drawString(a+″&&″+b+″=″ +(a&&b),10,70); 28:g.drawString(a+″|″+b+″=″+ (a|b),10,90); 29:g.drawString(a+″||″+b+″=″+ (a||b),10,110); 30:g.drawString(a+″^″+b+″=″+ (a^b),10,130); 31:g.drawString(″!″+b+″=″+ (!b),10,150); 32:} 33:publicvoidactionPerformed(ActionEvente) 34:{ 35:a=Boolean.valueOf(input1.getText()).booleanValue(); 36:b=Boolean.valueOf(input2.getText()).booleanValue(); 37:repaint(); 38:} …圖是例3-6的運行結果。例3-6在例3-4的基礎上修改了第10句,使a,b兩個變量可以接受布爾型數據;修改了第33到第38句的事件處理方法,利用系統定義的方法Boolean.valueOf().booleanValue()將用戶輸入的字符串轉化成布爾型數據;修改了第24行到第32行的paint()方法,使之顯示兩個布爾型量邏輯運算的結果。圖3.6例3-6的運行結果3.3.5位運算運算是對操作數以二進制比特位為單位進行的操作和運算,位運算的操作數和結果都是整型量。幾種位運算符和相應的運算規則列于表中。表3.8位運算符運算符運算例運算規則~位反~x將x按比特位取反>>右移x>>ax各比特位右移a位<<左移x<<ax各比特位左移a位>>>不帶符號的右移x>>>ax各比特位右移a位左邊的空位一律填零移位運算是將某一變量所包含的各比特位按指定的方向移動指定的位數,表是三個移位運算符的例子。表3.9移位運算X(十進制表示)二進制補碼表示x<<2x>>2x>>>23000011110011110000000011100000111-17111011111011110011111011001110113.3.6其他運算符

1.三目條件運算符?:Java中的三目條件運算符與C語言完全相同,使用形式是: x?y:z其規則是,先計算表達式x的值,若x為真,則整個三目運算的結果為表達式y的值;若x為假,則整個運算結果為表達式z的值。參看下面的例子: intx=5,y=8,z=2; intk=x<3?y:z;//x<3為假,所以k取z的值,結果為2 inty=x>0?x:-x;//y為x的絕對值2.復雜賦值運算符復雜賦值運算符是在先進行某種運算之后,再把運算的結果做賦值。表列出了所有的復雜賦值運算。表3.10復雜賦值運算符運算符例子等價于+=x+=ax=x+a-=x-=ax=x-a*=x*=ax=x*a/=x/=ax=x/a%=x%=ax=x%a&=x&=ax=x&a|=x|=ax=x|a^=x^=ax=x^a<<=x<<=ax=x<<a>>=x>>=ax=x>>a<<<=x<<<=ax=x<<<a3.括號與方括號括號運算符()在某些情況下起到改變表達式運算先后順序的作用;在另一些情況下代表方法或函數的調用。它的優先級在所有的運算符中是最高的。方括號運算符[]是數組運算符,它的優先級也很高,其具體使用方法將在后面介紹。4.對象運算符對象運算符instanceof用來測定一個對象是否屬于某一個指定類或其子類的實例,如果是則返回true,否則返回false。例如: booleanb=MyObjectinstanceofTextField;3.3.7運算符的優先級與結合性

運算符的優先級決定了表達式中不同運算執行的先后順序。如關系運算符的優先級高于邏輯運算符,x>y&&!z相當于(x>y)&&(!z)。運算符的結合性決定了并列的相同運算的先后執行順序。如對于左結合的“+”,x+y+z等價于(x+y)+z,對于右結合的“!”,!!x等價于!(!x)。表列出了Java主要運算符的優先級和結合性。表3.11Java運算符的優先級與結合性優先級描述運算符結合性1最高優先級.[]()左/右2單目運算-~!++--強制類型轉換符右3算術乘除運算*/%左4算術加減運算+-左5移位運算>><<>>>左6大小關系運算<<=>>=左7相等關系運算==!=左8按位與,非簡潔與&左9按位異或運算^左10按位或,非簡潔或|左11簡潔與&&左12簡潔或||左13三目條件運算?:右14簡單、復雜賦值=運算符=右3.3.8注釋

注釋是程序不可少的部分。Java的注釋符有兩種。一種是行注釋符“//”,以“//”開頭到本行末的所有字符被系統理解為注釋,不予編譯。如: //Thisatestprogramofwhatistobedone另一種注釋符是塊注釋符“/*”和“*/”,其中“/*”標志著注釋塊的開始,“*/”標志著注釋塊的結束。“/*”和“*/”可以括起若干個注釋行。如: /*程序名: 項目名: 編寫時間: 功能: 輸入/輸出:*/3.4流程控制語句

流程控制語句是用來控制程序中各語句執行順序的語句,是程序中非常關鍵和基本的部分。流程控制語句可以把單個的語句組合成有意義的,能完成一定功能的小邏輯模塊,能否熟練地運用流程控制語句往往很大程度上影響所編寫程序的質量。最主要的流程控制方式是結構化程序設計中規定的三種基本流程結構。3.4.1結構化程序設計的三種基本流程結構化程序設計原則是公認的面向過程編程應遵循的原則,它使得程序段的邏輯結構清晰、層次分明,有效地改善了局部程序段的可讀性和可靠性,保證了其質量,提高了開發效率。結構化程序設計的最基本的原則是:任何程序都可以且只能由三種基本流程結構構成,即順序結構、分支結構和循環結構。這三種結構的構成參見圖。圖3.7結構化程序設計的三種基本結構順序結構是三種結構中最簡單的一種,即語句按照書寫的順序依次執行;分支結構又稱為選擇結構,它將根據計算所得的表達式的值來判斷應選擇執行哪一個流程的分支;循環結構則是在一定條件下反復執行一段語句的流程結構。這三種結構構成了程序局部模塊的基本框架。

Java語言雖然是面向對象的語言,但是在局部的語句塊內部,仍然需要借助于結構化程序設計的基本流程結構來組織語句,完成相應的邏輯功能。Java的語句塊是由一對大括號括起的若干語句的集合。Java中,有專門負責實現分支結構的條件分支語句和負責實現循環結構的循環語句。3.4.2分支語句Java中的分支語句有兩個,一個是負責實現雙分支的if語句,另一個是負責實現多分支的開關語句switch。1.if語句if語句的一般形式是: if(條件表達式) 語句塊;//if分支 else 語句塊;//else分支其中條件表達式用來選擇判斷程序的流程走向,在程序的實際執行過程中,如果條件表達式的取值為真,則執行if分支的語句塊,否則執行else分支的語句塊。在編寫程序時,也可以不書寫else分支,此時若條件表達式的取值為假,則繞過if分支直接執行if語句后面的其他語句。語法格式如下: if(條件表達式) 語句塊;//if分支 其他語句;下面是一個if語句的簡單例子,是實現求某數的絕對值功能的程序片段。 if(x<=0) x=-x;例 1:importjava.applet.*; 2:importjava.awt.*; 3:importjava.awt.event.*; 4: 5:publicclassFindMaxextendsApplet implementsActionListener 6:{ 7:Labelresult; 8:TextFieldin1,in2,in3; 9:Buttonbtn; 10:inta=0,b=0,c=0,max 11: 12:publicvoidinit() 13:{ 14:result=newLabel(″請先輸入三個待比 較的整數″); 15:in1=newTextField(5); 16:in2=newTextField(5); 17:in3=newTextField(5); 18:btn=newButton(″比較″); 19:add(in1); 20:add(in2); 21:add(in3); 22:add(btn); 23:add(result); 24:btn.addActionListener(this); 25:} 26:publicvoidactionPerformed(ActionEvente) 27:{ 28:a=Integer.parseInt(in1.getText()); 29:b=Integer.parseInt(in2.getText()); 30:c=Integer.parseInt(in3.getText()); 31:if(a>b) 32:if(a>c) 33:max=a; 34:else 35:max=c; 36:else 37:if(b>c) 38:max=b; 39:else 40:max=c; 41:result.setText(″三數中最大值是:″+ max); 42:} 43:}例3-7中的程序接受用戶輸入的三個整數,在用戶單擊“比較”按鈕后程序調用方法actionPerformed()比較并輸出其中的最大值。第31句到第40句使用if語句的嵌套比較并得到三數中的最大值。第41句中使用了Label類對象result的一個系統定義好的方法setText()把原來顯示的提示信息變換成輸出信息。圖是例3-7程序運行的結果。圖3.8例3-7的運行結果2.switch語句switch語句是多分支的開關語句,它的一般格式如下: switch(表達式) {case判斷值1:語句塊1//分支1 case判斷值2:語句塊2//分支2 …… case判斷值n:語句塊n//分支n default:語句塊n+1//分支n+1 }switch語句在執行時,首先計算表達式的值,這個值必須是整型或字符型,同時應與各個case分支的判斷值的類型相一致。計算出表達式的值之后,將它先與第一個case分支的判斷值相比較,若相同,則程序的流程轉入第一個case分支的語句塊;否則,再將表達式的值與第二個case分支相比較……依此類推。如果表達式的值與任何一個case分支都不相同,則轉而執行最后的default分支;在default分支不存在的情況下,則跳出整個switch語句。需要注意的是,switch語句的每一個case判斷,都只負責指明流程分支的入口點,而不負責指定分支的出口點,分支的出口點需要編程人員用相應的跳轉語句來標明。看下面的例子:

switch(MyGrade) {case′A′:MyScore=5; case′B′:MyScore=4; case′C′:MyScore=3; default:MyScore=0;}假設變量MyGrade的值為“A”,執行完switch語句后,變量MyScore的值被賦成0,而不是5!因為case判斷只負責指明分支的入口點,表達式的值與第一個case分支的判斷值相匹配后,程序的流程進入第一個分支,將MyScore的值置為5。由于沒有專門的分支出口,所以流程將繼續沿著下面的分支逐個執行,MyScore的值被依次置為4,3,最后變成0。如果希望程序的邏輯結構正常完成分支的選擇,則需要為每一個分支另外編寫退出語句。

修改后的例子如下: switch(MyGrade) {case′A′:MyScore=5; break; case′B′:MyScore=4; break;case′C′:MyScore=3; break; default:MyScore=0;}break是流程跳轉語句。通過引入break語句,定義了各分支的出口,多分支開關語句的結構就完整了。在某些情況下,switch語句的這個只有分支入口、沒有出口的功能也有它獨特的適用場合。如在若干判斷值共享同一個分支時,就可以實現由不同的判斷語句流入相同的分支。下面的例子是該例的進一步修改,僅劃分及格與不及格。 switch(MyGrade) {case′A′: case′B′: case′C′:MyScore=1;//及格 break; default:MyScore=0;//不及格}3.4.3循環語句循環結構是在一定條件下,反復執行某段程序的流程結構,被反復執行的程序被稱為循環體。循環結構是程序中非常重要和基本的一種結構,它是由循環語句來實現的。Java的循環語句共有三種:while語句、do-while語句和for語句。它們的結構如圖所示。圖3-9Java的三種循環語句流程1.while語句while語句的一般語法格式如下: while(條件表達式) 循環體其中條件表達式的返回值為布爾型,循環體可以是單個語句,也可以是復合語句塊。while語句的執行過程是先判斷條件表達式的值,若為真,則執行循環體,循環體執行完之后再無條件轉向條件表達式再做計算與判斷;當計算出條件表達式為假時,跳過循環體執行while語句后面的語句。下面是一個使用while語句的例子:例 1:publicclassNarcissus 2:{ 3:publicstaticvoidmain(Stringargs[]) 4:{ 5:inti,j,k,n=100,m=1; 6: 7:while(n<1000) 8:{ 9:i=n/100; 10:j=(n-i*100)/10; 11:k=n%10; 12:if((Math.pow(i,3)+Math.pow(j,3)+ Math.pow(k,3))==n) 13:System.out.println(″找到第″+ m+++″個水仙花數:″+n); 14:n++; 15:} 16:} 17:}例3-8是一個字符界面的JavaApplication程序,其功能是找出所有的水仙花數并輸出。水仙花數是三位數,它的各位數字的立方和等于這個三位數本身,例如371=33+73+13,則371就是一個水仙花數。第7句到第15句定義了一個while循環,每輪循環檢查100到999中的一個三位數n,取出n的個位、十位和百位數分別存入k,j,i三個整型變量;第12句利用系統定義好的方法Math.pow()計算i,j,k的三次方并相加,若所得的和等于n,則輸出這個水仙花數;否則n加1檢查下一個三位數。循環結束時所有的三位數都將被檢查到。圖是例3-8的運行結果。圖3.10例3-8的運行結果2.do-while語句do-while語句的一般語法結構如下: do循環體 while(條件表達式);do-while語句的使用與while語句很類似,不同的是它不像while語句是先計算條件表達式的值,而是無條件地先執行一遍循環體,再來判斷條件表達式。若表達式的值為真,則再運行循環體,否則跳出do-while循環,執行下面的語句。可以看出,do-while語句的特點是它的循環體將至少被執行一次。下面是使用do-while語句的例子。例 1:importjava.io.*; 2: 3:publicclassshowCharValue 4:{ 5:publicstaticvoidmain(Stringargs[]) 6:{ 7:charch; 8: 9:try 10:{ 11:System.out.println(″請輸入一個字符, 以′#′結束″); 12:do 13:{ 14:ch=(char)System.in.read(); 15:System.out.println(″字符 ″+ch+″的整數值為″+(int)ch); 16:System.in.skip(2);//跳過回車鍵 17:}while(ch!=′#′); 18:} 19:catch(IOExceptione) 20:{ 21:System.err.println(e.toString()); 22:} 23:} 24:}例3-9是字符界面的JavaApplication程序,它接受用戶輸入的一個字符后輸出這個字符整型數值。第12句到第17句是do-while循環。第14句從系統標準輸入(即鍵盤)讀入一個整型數據,經強制類型轉換變換成字符型賦值給字符變量ch。第15句輸出ch和其整型值。第16句略過用戶輸入字符后鍵入的回車鍵。第17句檢查用戶輸入的字符是否是“#”,是則結束循環,否則跳回第14句繼續接受用戶的輸入。圖是例3-9的一次運行結果。圖3.11例3-9的運行結果3.for語句for語句是Java語言三個循環語句中功能較強,使用較廣泛的一個,它的流程結構可參看圖3.9(c)。for語句的一般語法格式如下: for(表達式1;表達式2;表達式3) 循環體其中表達式2是返回布爾值的條件表達式,用來判斷循環是否繼續;表達式1完成初始化循環變量和其他變量的工作;表達式3用來修整循環變量,改變循環條件,三個表達式之間用分號隔開。for語句的執行過程是這樣的:首先計算表達式1,完成必要的初始化工作;再判斷表達式2的值,若為真,則執行循環體,執行完循環體后再返回表達式3,計算并修改循環條件,這樣一輪循環就結束了。第二輪循環從計算并判斷表達式2開始,若表達式的值仍為真,則繼續循環,否則跳出整個for語句執行下面的句子。for語句的三個表達式都可以為空,但若表達式2也為空,則表示當前循環是一個無限循環,需要在循環體中書寫另外的跳轉語句終止循環。例3-10PerfectNum.java 1:publicclassPerfectNum 2:{ 3:publicstaticvoidmain(Stringargs[]) 4:{ 5:intcount=1; 6:for(inti=1;i<10000;i++) 7:{ 8:inty=0; 9: 10:for(intj=1;j<i;j++) 11:if(i%j==0) 12:y+=j; 13:if(y==i) 14:{ 15:(′\t′)); 16:count++; 17:if(count%3==0) 18:System.out.println(); 19:} 20:} 21:} 22:}例3-10是字符界面的JavaApplication程序,其功能是輸出10000之內的所有完全數。完全數是指等于其所有因子和(包括1但不包括這個數本

溫馨提示

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

評論

0/150

提交評論