版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第3章java電子教案本章主要介紹編寫(xiě)Java程序必須了解的若干語(yǔ)言基礎(chǔ)知識(shí),包括Java程序的結(jié)構(gòu)、數(shù)據(jù)類(lèi)型、變量、常量、表達(dá)式和流程控制語(yǔ)句等。掌握這些基礎(chǔ)知識(shí),是書(shū)寫(xiě)正確的Java程序的前提條件。3.1Java程序的構(gòu)成
上一章中已經(jīng)介紹了幾個(gè)簡(jiǎn)單的Java程序的例子,通過(guò)它們可以了解Java程序的一般構(gòu)成規(guī)則,下面仍以例2-5中的程序?yàn)槔?,介紹Java程序的構(gòu)成。AppletInOut.java 1:importjava.applet.*; 2:importjava.awt.*; 3:importjava.awt.event.*; 4:publicclassAppletInOutextendsApplet implementsActionListener主類(lèi)類(lèi)頭 5:{父類(lèi) 6:Labelprompt; 7:TextFieldinput,output;靜態(tài)屬性 8: 9:publicvoidinit() 10:{ 11:prompt=newLabel(″請(qǐng)輸入您的名 字:″); 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:}主類(lèi)類(lèi)體Java源程序是由類(lèi)定義組成的,每個(gè)程序中可以定義若干個(gè)類(lèi),但是只有一個(gè)類(lèi)是主類(lèi)。在JavaApplication中,這個(gè)主類(lèi)是指包含main方法的類(lèi);在JavaApplet里,這個(gè)主類(lèi)是一個(gè)系統(tǒng)類(lèi)Applet的子類(lèi)。主類(lèi)是Java程序執(zhí)行的入口點(diǎn)。同一個(gè)Java程序中定義的若干類(lèi)之間沒(méi)有嚴(yán)格的邏輯關(guān)系要求,但它們通常是在一起協(xié)同工作的,每一個(gè)類(lèi)都可能需要使用其他類(lèi)中定義的靜態(tài)屬性或方法。Java程序中定義類(lèi)使用關(guān)鍵字class,每個(gè)類(lèi)的定義由類(lèi)頭定義和類(lèi)體定義兩部分組成。類(lèi)體部分用來(lái)定義靜態(tài)屬性和方法這兩種類(lèi)的成員,其中方法類(lèi)似于其他高級(jí)語(yǔ)言中的函數(shù),而靜態(tài)屬性則類(lèi)似于變量。類(lèi)頭部分除了聲明類(lèi)名之外,還可以說(shuō)明類(lèi)的繼承特性,當(dāng)一個(gè)類(lèi)被定義為是另一個(gè)已經(jīng)存在的類(lèi)(稱(chēng)為這個(gè)類(lèi)的父類(lèi))的子類(lèi)時(shí),它就可以從其父類(lèi)中繼承一些已定義好的類(lèi)成員而不必自己重復(fù)編碼。語(yǔ)句是構(gòu)成Java程序的基本單位之一。每一條Java語(yǔ)句都由分號(hào)(;)結(jié)束,其構(gòu)成應(yīng)該符合Java的語(yǔ)法規(guī)則。類(lèi)和方法中的所有語(yǔ)句應(yīng)該用一對(duì)大括號(hào)括起。Java程序是由類(lèi)定義組成的,每個(gè)類(lèi)內(nèi)部包括類(lèi)的靜態(tài)屬性聲明和類(lèi)的方法兩部分,所以除了靜態(tài)屬性聲明語(yǔ)句之外,其他的執(zhí)行具體操作的語(yǔ)句只能存在于類(lèi)方法的大括號(hào)之中,而不能跳出方法孤立地直接書(shū)寫(xiě)在類(lèi)中。例如,例2-5中第11~17句、第21句,這些語(yǔ)句都不能寫(xiě)在方法的外面。比語(yǔ)句更小的語(yǔ)言單位是表達(dá)式、變量、常量和關(guān)鍵字等,Java的語(yǔ)句就是由它們構(gòu)成的。其中變量與常量關(guān)鍵字是Java語(yǔ)言語(yǔ)法規(guī)定的保留字,用戶程序定義的常量和變量的取名不能與保留字相同。3.2數(shù)據(jù)類(lèi)型、變量與常量
3.2.1數(shù)據(jù)類(lèi)型表列出了Java中定義的所有數(shù)據(jù)類(lèi)型,可以看出Java的數(shù)據(jù)類(lèi)型的設(shè)置與C語(yǔ)言相近。其不同之處在于:首先,Java的各種數(shù)據(jù)類(lèi)型占用固定的內(nèi)存長(zhǎng)度,與具體的軟硬件平臺(tái)環(huán)境無(wú)關(guān);其次,Java的每種數(shù)據(jù)類(lèi)型都對(duì)應(yīng)一個(gè)缺省的數(shù)值,使得這種數(shù)據(jù)類(lèi)型的變量的取值總是確定的。這兩點(diǎn)分別體現(xiàn)了Java的跨平臺(tái)特性和安全穩(wěn)定性。表3.1Java的基本數(shù)據(jù)類(lèi)型數(shù)據(jù)類(lèi)型關(guān)鍵字占用位數(shù)缺省數(shù)值取值范圍布爾型boolean8falsetrue,false字節(jié)型byte80-128~127字符型char16′\u0000′′\u0000′~′\uFFFF′短整型short160-32768~32767整型int320-2147483648~2147483647長(zhǎng)整型long640-9223372036854775808~9223372036854775807浮點(diǎn)型float320.0F1.40129846432481707e-45~3.40282346638528860e+38雙精度型double640.0D4.94065645841246544e-324~1.79769313486231570e+308dboolean是用來(lái)表示布爾型數(shù)據(jù)的數(shù)據(jù)類(lèi)型。boolean型的變量或常量的取值只有true和false兩個(gè)。其中,true代表“真”,false代表“假”。
byte是用來(lái)處理未經(jīng)加工的二進(jìn)制數(shù)據(jù)的數(shù)據(jù)類(lèi)型,每個(gè)byte型的常量或變量中包含8位(bit)的二進(jìn)制信息。
Java的字符數(shù)據(jù)類(lèi)型char與其他語(yǔ)言相比有較大的改進(jìn)。C語(yǔ)言等的字符類(lèi)型是采用ASCII編碼,每個(gè)數(shù)據(jù)占用8比特的長(zhǎng)度,總共可以表示256個(gè)不同的字符。ASCII編碼是國(guó)際標(biāo)準(zhǔn)的編碼方式,但是也有其一定的局限性,最典型的體現(xiàn)在處理以漢字為代表的東方文字方面。漢字的字符集大,僅用8位編碼是不夠的,所以傳統(tǒng)的處理方法是用兩個(gè)8位的字符數(shù)據(jù)來(lái)表示一個(gè)漢字。為了簡(jiǎn)化問(wèn)題,Java的字符類(lèi)型采用了一種新的國(guó)際標(biāo)準(zhǔn)編碼方案——Unicode編碼。每個(gè)Unicode碼占用16個(gè)比特位,包含的信息量比ASCII碼多了一倍,無(wú)論東方字符還是西方字符,都可以統(tǒng)一用一個(gè)字符表達(dá)。由于采用Unicode編碼方案,為Java程序在基于不同語(yǔ)言的平臺(tái)間實(shí)現(xiàn)平滑移植鋪平了道路。上面所介紹的數(shù)據(jù)類(lèi)型都是基本數(shù)據(jù)類(lèi)型,Java中還存在著一種引用數(shù)據(jù)類(lèi)型(reference),包括類(lèi)和接口等。比如,對(duì)應(yīng)基本的double類(lèi)型,還存在著一個(gè)類(lèi)Double。這些類(lèi)在包含基本數(shù)據(jù)類(lèi)型所表示的一定范圍、一定格式的數(shù)值的同時(shí),還包含了一些特定的方法,可以實(shí)現(xiàn)對(duì)數(shù)值的專(zhuān)門(mén)操作,如把字符串轉(zhuǎn)換成雙精度型數(shù)值等。嚴(yán)格的面向?qū)ο笳Z(yǔ)言中不應(yīng)該有基本數(shù)據(jù)類(lèi)型存在;但事實(shí)上這些簡(jiǎn)單數(shù)據(jù)類(lèi)型應(yīng)用得太廣太多了,為了簡(jiǎn)化編程,Java中就定義了與面向過(guò)程語(yǔ)言相似的與類(lèi)無(wú)關(guān)的基本數(shù)據(jù)類(lèi)型。從這個(gè)意義上來(lái)說(shuō),Java仍繼承了面向過(guò)程的一些東西,并不是嚴(yán)格意義上的完全面向?qū)ο蟮恼Z(yǔ)言。3.2.2標(biāo)識(shí)符任何一個(gè)變量、常量、方法、對(duì)象和類(lèi)都需要有一個(gè)名字標(biāo)志它的存在,這個(gè)名字就是標(biāo)識(shí)符。標(biāo)識(shí)符可以由編程者自由指定,但是需要遵循一定的語(yǔ)法規(guī)定。Java對(duì)于標(biāo)識(shí)符的定義有如下的規(guī)定:(1)標(biāo)識(shí)符可以由字母、數(shù)字和兩個(gè)特殊字符下劃線(-)、美元符號(hào)($)組合而成。(2)標(biāo)識(shí)符必須以字母、下劃線或美元符號(hào)開(kāi)頭。(3)Java是大小寫(xiě)敏感的語(yǔ)言,class和Class,System和system分別代表不同的標(biāo)識(shí)符,在定義和使用時(shí)要特別注意這一點(diǎn)。(4)應(yīng)該使標(biāo)識(shí)符能一定程度上反映它所表示的變量、常量、對(duì)象或類(lèi)的意義。表列出了一些合法、不合法的標(biāo)識(shí)符,讀者可以自己分析一下不合法的標(biāo)識(shí)符錯(cuò)在何處。表3.2合法與不合法的標(biāo)識(shí)符的例子合法標(biāo)識(shí)符不合法標(biāo)識(shí)符FirstJavaApplet1FirstJavaApplicationMySalary12Tree&Glasses-isTrue-isTrue-$theLastOneJavaBuilderHelloWorld273.153.2.3常量常量一經(jīng)建立,在程序運(yùn)行的整個(gè)過(guò)程中都不會(huì)改變。Java中常用的常量有布爾常量、整型常量、字符常量、字符串常量和浮點(diǎn)常量。1.布爾常量布爾常量包括true和false,分別代表真和假。2.整型常量整型常量可以用來(lái)給整型變量賦值,整型常量可以采用十進(jìn)制、八進(jìn)制和十六進(jìn)制表示。十進(jìn)制的整型常量用非0開(kāi)頭的數(shù)值表示,如100,-50;八進(jìn)制的整型常量用以0開(kāi)頭的數(shù)字表示,如017代表十進(jìn)制的數(shù)字15;十六進(jìn)制的整型常量用0x開(kāi)頭的數(shù)值表示,如0x2F代表十進(jìn)制的數(shù)字47。整型常量按照所占用的內(nèi)存長(zhǎng)度,又可分為一般整型常量和長(zhǎng)整型常量,其中一般整型常量占用32位,長(zhǎng)整型常量占用64位。長(zhǎng)整型常量的尾部有一個(gè)大寫(xiě)的L或小寫(xiě)的l,如-386L,017777l。3.浮點(diǎn)常量浮點(diǎn)常量表示的是可以含有小數(shù)部分的數(shù)值常量。根據(jù)占用內(nèi)存長(zhǎng)度的不同,可以分為一般浮點(diǎn)常量和雙精度浮點(diǎn)常量?jī)煞N。一般浮點(diǎn)常量占用32位內(nèi)存,用F、f表示,如,,;雙精度浮點(diǎn)常量占用64位內(nèi)存,用帶D或d或不加后綴的數(shù)值表示,如,,。與其他高級(jí)語(yǔ)言類(lèi)似,浮點(diǎn)常量還有一般表示法和指數(shù)表示法兩種不同的表示方法。4.字符常量字符常量用一對(duì)單引號(hào)括起的單個(gè)字符表示,這個(gè)字符可以直接是Latin字母表中的字符,如′a′,′Z′,′8′,′#′;也可以是轉(zhuǎn)義符,還可以是要表示的字符所對(duì)應(yīng)的八進(jìn)制數(shù)或Unicode碼。轉(zhuǎn)義符是一些有特殊含義、很難用一般方式表達(dá)的字符,如回車(chē)、換行等。為了表達(dá)清楚這些特殊字符,Java中引入了一些特別的定義。所有的轉(zhuǎn)義符都用反斜線(\)開(kāi)頭,后面跟著一個(gè)字符來(lái)表示某個(gè)特定的轉(zhuǎn)義符,詳見(jiàn)表。表3.3轉(zhuǎn)義符引用方法對(duì)應(yīng)Unicode碼意義′\b′′\u0008′退格′\t′′\u0009′水平制表符tab′\n′′\u000a′換行′\f′′\u000c′表格符′\r′′\u000d′回車(chē)′\″′′\u0022′雙引號(hào)′\′′′\u0027′單引號(hào)′\\′′\u005c′反斜線表中間一列表示的是一個(gè)字符的Unicode碼,還可以用八進(jìn)制表示一個(gè)字符常量。如′\101′就是用八進(jìn)制表示一個(gè)字符常量,它與′\u0047′和′A′表示的是同一個(gè)字符,作為常量它們是相同的。需要補(bǔ)充說(shuō)明的是,八進(jìn)制表示法只能表示′\000′~′\377′范圍內(nèi)的字符,即不能表示全部的Unicode字符,而只能表示其中ASCII字符集的部分。5.字符串常量字符串常量是用雙引號(hào)括起的一串若干個(gè)字符(可以是0個(gè))。字符串中可以包括轉(zhuǎn)義符,標(biāo)志字符串開(kāi)始和結(jié)束的雙引號(hào)必須在源代碼的同一行上。下面是幾個(gè)字符串常量的例子:″Hello″,″My\nJava″,″Howareyou?1234″,″″。在Java中可以使用連接操作符(+)把兩個(gè)或更多的字符串常量串接在一起,組成一個(gè)更長(zhǎng)的字符串。例如,″Howdoyoudo?″+″\n″的結(jié)果是″Howdoyoudo?\n″。3.2.4變量變量是在程序的運(yùn)行過(guò)程中數(shù)值可變的數(shù)據(jù),通常用來(lái)記錄運(yùn)算中間結(jié)果或保存數(shù)據(jù)。Java中的變量必須先聲明后使用,聲明變量包括指明變量的數(shù)據(jù)類(lèi)型和變量的名稱(chēng),必要時(shí)還可以指定變量的初始數(shù)值。如下面的語(yǔ)句: booleanm-bFlag=true;聲明了一個(gè)布爾類(lèi)型的簡(jiǎn)單變量,名字為m-bFlag,該變量的初值是邏輯真。由于聲明變量的語(yǔ)句也是Java程序中的一個(gè)完整的語(yǔ)句,所以它與其他Java語(yǔ)句一樣需要用分號(hào)結(jié)束。下面是其他幾個(gè)變量聲明的例子: charmyCharacter=′B′; longMyLong=-375; intm-iCount=65536; doublem-dScroe;聲明變量又稱(chēng)為創(chuàng)建變量,執(zhí)行變量聲明語(yǔ)句時(shí)系統(tǒng)根據(jù)變量的數(shù)據(jù)類(lèi)型在內(nèi)存中開(kāi)辟相應(yīng)的空間并登記變量名稱(chēng)、初始值等信息。Java的變量有一定的生存期和有效范圍,與C語(yǔ)言一樣,Java用大括號(hào)將若干語(yǔ)句組成語(yǔ)句塊,變量的有效范圍就是聲明它的語(yǔ)句所在的語(yǔ)句塊,一旦程序的執(zhí)行離開(kāi)了這個(gè)語(yǔ)句塊,變量就沒(méi)有意義,不能再使用了。例 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(″長(zhǎng)整型變量l= ″+l); 17:System.out.println(″字符型變量ch= ″+ch); 18:System.out.println(″浮點(diǎn)型變量f= ″+f); 19:System.out.println(″雙精度型變量d= ″+d); 20:System.out.println(″字符型對(duì)象s= ″+s); 21:} 22:}圖是例3-1的運(yùn)行結(jié)果。圖3.1例3-1的運(yùn)行結(jié)果例3-1是一個(gè)字符界面的JavaApplication程序,其中定義了若干個(gè)變量并用相應(yīng)類(lèi)型的常量為它們賦初始值。其中第10句中特別使用了浮點(diǎn)常量(有興趣的讀者可以去掉常量后面的字符′F′,再?lài)L試編譯看能得到什么結(jié)果)。第11句中的雙精度常量使用科學(xué)計(jì)數(shù)法表示。第12句定義了一個(gè)字符串對(duì)象,String不是基本數(shù)據(jù)類(lèi)型,而是一個(gè)系統(tǒng)定義的類(lèi)名,每一個(gè)字符串變量實(shí)際上都是一個(gè)字符串對(duì)象。但是由于字符串是十分常用的對(duì)象,它的聲明和創(chuàng)建可以簡(jiǎn)化成第12句那樣的形式。第13句到第20句使用System.out.println()這個(gè)系統(tǒng)已經(jīng)定義好的方法來(lái)輸出前面所定義的所有變量的數(shù)值。每個(gè)語(yǔ)句首先利用一個(gè)字符串常量作為解釋性信息,然后把各種數(shù)據(jù)類(lèi)型的數(shù)據(jù)轉(zhuǎn)化成字符串的形式,用“+”拼接在前面的字符串常量的后面,共同輸出。輸出完畢后這個(gè)方法將把光標(biāo)換到下一行,準(zhǔn)備下一次輸出。例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(″請(qǐng)輸入一個(gè)整 型數(shù):″); 12:BufferedReaderbr= 13:newBufferedReader(new InputStreamReader(System.in)); 14:s=br.readLine(); 15:i=Integer.parseInt(s); 16:}catch(IOExceptione){} 17:System.out.print(″你輸入了數(shù)字:″ +i); 18:System.out.println(″\t,對(duì)嗎?″); 19:} 20:}圖是例3-2的運(yùn)行結(jié)果。圖3.2例3-2的運(yùn)行結(jié)果例3-2接受用戶從鍵盤(pán)輸入的一個(gè)字符串,然后把它轉(zhuǎn)化成整型數(shù)據(jù)并輸出。如在圖中用戶輸入了字符串“245”,利用例3-2第15句中系統(tǒng)定義的方法Integer.parseInt()就可以把它轉(zhuǎn)化成數(shù)字245。其中Integer是系統(tǒng)定義的一個(gè)類(lèi),對(duì)應(yīng)基本數(shù)據(jù)類(lèi)型int,parseInt()是Integer類(lèi)的一個(gè)方法,可以把數(shù)字字符組成的字符串轉(zhuǎn)化成真正的整型數(shù)字。另外,第11句和第17句還使用了一個(gè)新的輸出方法System.out.print()。這個(gè)方法的用法和作用與System.out.println()基本相同,唯一的區(qū)別是輸出了數(shù)據(jù)后并不回車(chē)。第18句使用轉(zhuǎn)義符′\t′將輸出數(shù)據(jù)與字符串常量拉開(kāi)距離。例 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(″請(qǐng)輸入一個(gè)浮 點(diǎn)數(shù):″); 14:input=newTextField(10); 15:add(prompt); 16:add(input); 17:input.addActionListener(this); 18:} 19:publicvoidpaint(Graphicsg) 20:{ 21:g.drawString(″你輸入了數(shù)據(jù):″+ d,10,50); 22:} 23:publicvoidactionPerformed(ActionEvent e) 24:{ 25:d=Double.valueOf(input.getText()).doubleValue(); 26:repaint(); 27:} 28:}圖是例3-3的運(yùn)行結(jié)果。圖3.3例3-3的運(yùn)行結(jié)果例3-3是一個(gè)圖形界面下的JavaApplet程序,通過(guò)這個(gè)例子可以了解如何在圖形界面下輸入數(shù)值數(shù)據(jù)。用戶在文本框?qū)ο骾nput中輸入字符串并回車(chē)后,程序接受用戶輸入的這個(gè)字符串(在圖中是“3.1415926”),利用第25句中的方法Double.valueOf().doubleValue()將這個(gè)字符串轉(zhuǎn)化成真正的浮點(diǎn)數(shù)據(jù)賦值給雙精度變量d(在圖中是)。第26句調(diào)用Applet類(lèi)中系統(tǒng)定義好的方法repaint(),這個(gè)方法將調(diào)用第19句到22句的方法paint(),把變量d中的數(shù)據(jù)顯示出來(lái)。為體會(huì)圖形界面輸入數(shù)據(jù)的方法,讀者可以針對(duì)例3-3做如下實(shí)驗(yàn):(1)刪除第15句,編譯并運(yùn)行,觀察界面的變化。(2)恢復(fù)第15句,刪除第16句,編譯并運(yùn)行,觀察界面的變化。(3)恢復(fù)第16句,刪除第17句,編譯并運(yùn)行,觀察界面的變化。(4)恢復(fù)第17句,刪除第26句,編譯并運(yùn)行,觀察界面的變化。3.3表達(dá)式表達(dá)式是由變量、常量、對(duì)象、方法調(diào)用和操作符組成的式子。符合語(yǔ)法規(guī)則的表達(dá)式可以被編譯系統(tǒng)理解、執(zhí)行或計(jì)算,表達(dá)式的值就是對(duì)它運(yùn)算后所得的結(jié)果。組成表達(dá)式的Java操作符有很多種,代表了多種的豐富的操作運(yùn)算,包括賦值運(yùn)算、算術(shù)運(yùn)算、關(guān)系運(yùn)算和邏輯運(yùn)算等。3.3.1賦值與強(qiáng)制類(lèi)型轉(zhuǎn)換
賦值運(yùn)算符對(duì)應(yīng)了賦值運(yùn)算,即賦予程序里的變量或?qū)ο笠欢ǖ膬?nèi)容。簡(jiǎn)單的賦值運(yùn)算是把一個(gè)表達(dá)式的值直接賦給一個(gè)變量或?qū)ο?,使用的賦值運(yùn)算符是“=”,其格式如下: 變量或?qū)ο?表達(dá)式;其中賦值號(hào)右邊的表達(dá)式可以是常量、另一個(gè)變量或?qū)ο笠约胺椒ǖ姆祷刂?。下面是一些?jiǎn)單賦值運(yùn)算的例子: i=0; j=i; k=i+j*5; MyFirstString=MyDouble.toString(); MySecondString=MyFirstString;需要注意的是,當(dāng)賦值號(hào)的左邊是一個(gè)對(duì)象名時(shí),賦值運(yùn)算符將把右邊表達(dá)式所得的對(duì)象的引用賦值給它,而不是為這個(gè)對(duì)象開(kāi)辟新的內(nèi)存空間并把右邊對(duì)象的所有內(nèi)容賦值給它。在使用賦值運(yùn)算時(shí),可能會(huì)遇到等號(hào)左邊的數(shù)據(jù)類(lèi)型和等號(hào)右邊的數(shù)據(jù)類(lèi)型不一致的情況,這時(shí)需要把等號(hào)右邊的數(shù)據(jù)類(lèi)型轉(zhuǎn)化成等號(hào)左邊的數(shù)據(jù)類(lèi)型。某些情況下,系統(tǒng)可以自動(dòng)完成這種類(lèi)型轉(zhuǎn)換,另一些情況下就要用到強(qiáng)制類(lèi)型轉(zhuǎn)換。Java的類(lèi)型轉(zhuǎn)換有較嚴(yán)格的規(guī)定:凡是將變量從占用內(nèi)存較少的短數(shù)據(jù)類(lèi)型轉(zhuǎn)化成占用內(nèi)存較多的長(zhǎng)數(shù)據(jù)類(lèi)型時(shí),可以不做顯式的類(lèi)型轉(zhuǎn)換聲明;而將變量從較長(zhǎng)的數(shù)據(jù)類(lèi)型轉(zhuǎn)換成較短的數(shù)據(jù)類(lèi)型時(shí),則必須做強(qiáng)制類(lèi)型轉(zhuǎn)換。例如下面的例子中分別定義了16位的字節(jié)類(lèi)型變量MyByte和32位的整數(shù)類(lèi)型變量MyInteger: byteMyByte=10; intMyInteger=-1;如果把MyByte的值賦給MyInteger,則可以直接寫(xiě)成: MyInteger=MyByte;而把MyInteger的值賦給MyByte,則必須寫(xiě)成MyByte=(byte)MyInteger;先把變量MyInteger中保存的數(shù)值的數(shù)據(jù)類(lèi)型從int變成byte后才能賦給MyByte,其中,(byte)就是在做強(qiáng)制類(lèi)型轉(zhuǎn)換。其一般格式是: (數(shù)據(jù)類(lèi)型)變量名或表達(dá)式3.3.2算術(shù)運(yùn)算算術(shù)運(yùn)算是針對(duì)數(shù)值類(lèi)型操作數(shù)進(jìn)行的運(yùn)算,算術(shù)運(yùn)算符根據(jù)需要的操作數(shù)個(gè)數(shù)的不同,可以分為雙目運(yùn)算符和單目運(yùn)算符兩種。1.雙目運(yùn)算符
表3.4雙目算術(shù)運(yùn)算符運(yùn)算符運(yùn)算例功能+加a+b求a與b相加的和-減a-b求a與b相減的差*乘a*b求a與b相乘的積/除a/b求a除以b的商%取余a%b求a除以b所得的余數(shù)這里有兩個(gè)需要注意的問(wèn)題:(1)只有整數(shù)類(lèi)型(int,long,short)的數(shù)據(jù)才能夠進(jìn)行取余運(yùn)算,float和double不能取余。(2)兩個(gè)整數(shù)類(lèi)型的數(shù)據(jù)做除法時(shí),結(jié)果是截取商數(shù)的整數(shù)部分,而小數(shù)部分被截?cái)?。如果希望保留小?shù)部分,則應(yīng)該對(duì)除法運(yùn)算的操作數(shù)做強(qiáng)制類(lèi)型轉(zhuǎn)換。例如1/2的結(jié)果是0,而((float)1)/2的結(jié)果是。2.單目運(yùn)算符單目運(yùn)算符的操作數(shù)只有一個(gè),算術(shù)運(yùn)算中有三個(gè)單目運(yùn)算符。表3.5單目算術(shù)運(yùn)算符運(yùn)算符運(yùn)算例功能等價(jià)++自增a++或++aa=a+1--自減a--或--aa=a-1-求相反數(shù)-aa=-a單目運(yùn)算符中的自增和自減,其運(yùn)算符的位置可以在操作數(shù)的前面,也可以在操作數(shù)的后面;當(dāng)進(jìn)行單目運(yùn)算的表達(dá)式位于一個(gè)更復(fù)雜的表達(dá)式內(nèi)部時(shí),單目運(yùn)算符的位置將決定單目運(yùn)算與復(fù)雜表達(dá)式二者執(zhí)行的先后順序。如下面的例子里,單目運(yùn)算符在操作數(shù)變量的前面,則先執(zhí)行單目運(yùn)算,修改變量的值后用這個(gè)新值參與復(fù)雜表達(dá)式的運(yùn)算。 intx=2; inty=(++x)*3;運(yùn)算執(zhí)行的結(jié)果是x=3,y=9。而在下面的例子里,由于單目運(yùn)算符放在操作數(shù)變量的后面,則先計(jì)算復(fù)雜表達(dá)式的值,最后再修改變量的取值。 intx=2; inty=(x++)*3;運(yùn)算執(zhí)行的結(jié)果是x=3,y=6。可見(jiàn),單目運(yùn)算符的位置不同,雖然對(duì)操作數(shù)變量沒(méi)有影響,但卻會(huì)改變整個(gè)表達(dá)式的值。例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(″請(qǐng)輸入兩個(gè)整 型數(shù)據(jù):″); 15:input1=newTextField(5); 16:input2=newTextField(5); 17:btn=newButton(″計(jì)算″); 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程序,它利用兩個(gè)文本框?qū)ο骾nput1和input2接受用戶輸入的兩個(gè)數(shù)據(jù)。當(dāng)用戶單擊按鈕“計(jì)算”時(shí),程序?qū)堰@兩個(gè)字符串轉(zhuǎn)化為整型數(shù)據(jù)賦值給同類(lèi)的兩個(gè)變量a和b,然后通過(guò)repaint()方法調(diào)用第24行到第31行的paint()方法,以a和b為操作數(shù),計(jì)算它們四則運(yùn)算的結(jié)果并輸出。圖是例3-4運(yùn)行結(jié)果。
圖3.4例3-4的運(yùn)行結(jié)果3.3.3關(guān)系運(yùn)算關(guān)系運(yùn)算是比較兩個(gè)數(shù)據(jù)之間的大小關(guān)系的運(yùn)算,常用的關(guān)系運(yùn)算列于表中:表3.6關(guān)系運(yùn)算符運(yùn)算符運(yùn)算==等于!=不等于>大于<小于>=大于等于<=小于等于關(guān)系運(yùn)算的結(jié)果是布爾型的量,即“真”或“假”。例如: intx=5,y=7; booleanb=(x==y);則b的初始值是false。另外,需注意區(qū)分等于號(hào)和賦值號(hào),不要混淆。例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的運(yùn)行結(jié)果。例3-5在例3-4的基礎(chǔ)上修改了第24句到第31句的paint()方法,比較用戶輸入的兩個(gè)整型數(shù)之間的關(guān)系并把比較結(jié)果輸出。圖3.5例3-5的運(yùn)行結(jié)果3.3.4邏輯運(yùn)算邏輯運(yùn)算是針對(duì)布爾型數(shù)據(jù)進(jìn)行的運(yùn)算,運(yùn)算的結(jié)果仍然是布爾型量。常用的邏輯運(yùn)算符見(jiàn)表。表3.7邏輯運(yùn)算符運(yùn)算符運(yùn)算例運(yùn)算規(guī)則&非簡(jiǎn)潔與x&yx,y都真時(shí)結(jié)果才為真|非簡(jiǎn)潔或x|yx,y都假時(shí)結(jié)果才為假!取反!xx真時(shí)為假,x假時(shí)為真^異或x^yx,y同真假時(shí)結(jié)果為假&&簡(jiǎn)潔與x&&yx,y都真時(shí)結(jié)果才為真||簡(jiǎn)潔或x||yx,y都假時(shí)結(jié)果才為假“&”和“|”被稱(chēng)為非簡(jiǎn)潔運(yùn)算符,因?yàn)樵诶盟鼈冏雠c、或運(yùn)算時(shí),運(yùn)算符左右兩邊的表達(dá)式總會(huì)被運(yùn)算執(zhí)行,然后再對(duì)兩表達(dá)式的結(jié)果進(jìn)行與、或運(yùn)算;而在利用“&&”和“||”做簡(jiǎn)潔運(yùn)算時(shí),運(yùn)算符右邊的表達(dá)式有可能被忽略而不加執(zhí)行。例如: intx=3,y=5; booleanb=x>y&&x++==y--;在計(jì)算布爾型的變量b的取值時(shí),先計(jì)算&&左邊的關(guān)系表達(dá)式x>y,得結(jié)果為假,根據(jù)邏輯與運(yùn)算的規(guī)則,只有參加與運(yùn)算的兩個(gè)表達(dá)式都為真時(shí),最后的結(jié)果才為真;所以不論&&右邊的表達(dá)式結(jié)果如何,整個(gè)式子的值都為假,右邊的表達(dá)式就不予計(jì)算執(zhí)行了;最后三個(gè)變量的取值分別是:x為3,y為5,b為false。如果把上題中的簡(jiǎn)潔與(&&)換為非簡(jiǎn)潔與(&),則與號(hào)兩邊的兩個(gè)表達(dá)式都會(huì)被運(yùn)算,最后三個(gè)變量的取值分別是:x為4,y為4,b為false。同理,對(duì)于簡(jiǎn)潔或(|),若左邊的表達(dá)式的運(yùn)算結(jié)果為真,則整個(gè)或運(yùn)算的結(jié)果一定為真,右邊的表達(dá)式就不會(huì)再運(yùn)算執(zhí)行了。例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的運(yùn)行結(jié)果。例3-6在例3-4的基礎(chǔ)上修改了第10句,使a,b兩個(gè)變量可以接受布爾型數(shù)據(jù);修改了第33到第38句的事件處理方法,利用系統(tǒng)定義的方法Boolean.valueOf().booleanValue()將用戶輸入的字符串轉(zhuǎn)化成布爾型數(shù)據(jù);修改了第24行到第32行的paint()方法,使之顯示兩個(gè)布爾型量邏輯運(yùn)算的結(jié)果。圖3.6例3-6的運(yùn)行結(jié)果3.3.5位運(yùn)算運(yùn)算是對(duì)操作數(shù)以二進(jìn)制比特位為單位進(jìn)行的操作和運(yùn)算,位運(yùn)算的操作數(shù)和結(jié)果都是整型量。幾種位運(yùn)算符和相應(yīng)的運(yùn)算規(guī)則列于表中。表3.8位運(yùn)算符運(yùn)算符運(yùn)算例運(yùn)算規(guī)則~位反~x將x按比特位取反>>右移x>>ax各比特位右移a位<<左移x<<ax各比特位左移a位>>>不帶符號(hào)的右移x>>>ax各比特位右移a位左邊的空位一律填零移位運(yùn)算是將某一變量所包含的各比特位按指定的方向移動(dòng)指定的位數(shù),表是三個(gè)移位運(yùn)算符的例子。表3.9移位運(yùn)算X(十進(jìn)制表示)二進(jìn)制補(bǔ)碼表示x<<2x>>2x>>>23000011110011110000000011100000111-17111011111011110011111011001110113.3.6其他運(yùn)算符
1.三目條件運(yùn)算符?:Java中的三目條件運(yùn)算符與C語(yǔ)言完全相同,使用形式是: x?y:z其規(guī)則是,先計(jì)算表達(dá)式x的值,若x為真,則整個(gè)三目運(yùn)算的結(jié)果為表達(dá)式y(tǒng)的值;若x為假,則整個(gè)運(yùn)算結(jié)果為表達(dá)式z的值。參看下面的例子: intx=5,y=8,z=2; intk=x<3?y:z;//x<3為假,所以k取z的值,結(jié)果為2 inty=x>0?x:-x;//y為x的絕對(duì)值2.復(fù)雜賦值運(yùn)算符復(fù)雜賦值運(yùn)算符是在先進(jìn)行某種運(yùn)算之后,再把運(yùn)算的結(jié)果做賦值。表列出了所有的復(fù)雜賦值運(yùn)算。表3.10復(fù)雜賦值運(yùn)算符運(yùn)算符例子等價(jià)于+=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.括號(hào)與方括號(hào)括號(hào)運(yùn)算符()在某些情況下起到改變表達(dá)式運(yùn)算先后順序的作用;在另一些情況下代表方法或函數(shù)的調(diào)用。它的優(yōu)先級(jí)在所有的運(yùn)算符中是最高的。方括號(hào)運(yùn)算符[]是數(shù)組運(yùn)算符,它的優(yōu)先級(jí)也很高,其具體使用方法將在后面介紹。4.對(duì)象運(yùn)算符對(duì)象運(yùn)算符instanceof用來(lái)測(cè)定一個(gè)對(duì)象是否屬于某一個(gè)指定類(lèi)或其子類(lèi)的實(shí)例,如果是則返回true,否則返回false。例如: booleanb=MyObjectinstanceofTextField;3.3.7運(yùn)算符的優(yōu)先級(jí)與結(jié)合性
運(yùn)算符的優(yōu)先級(jí)決定了表達(dá)式中不同運(yùn)算執(zhí)行的先后順序。如關(guān)系運(yùn)算符的優(yōu)先級(jí)高于邏輯運(yùn)算符,x>y&&!z相當(dāng)于(x>y)&&(!z)。運(yùn)算符的結(jié)合性決定了并列的相同運(yùn)算的先后執(zhí)行順序。如對(duì)于左結(jié)合的“+”,x+y+z等價(jià)于(x+y)+z,對(duì)于右結(jié)合的“!”,!!x等價(jià)于!(!x)。表列出了Java主要運(yùn)算符的優(yōu)先級(jí)和結(jié)合性。表3.11Java運(yùn)算符的優(yōu)先級(jí)與結(jié)合性?xún)?yōu)先級(jí)描述運(yùn)算符結(jié)合性1最高優(yōu)先級(jí).[]()左/右2單目運(yùn)算-~!++--強(qiáng)制類(lèi)型轉(zhuǎn)換符右3算術(shù)乘除運(yùn)算*/%左4算術(shù)加減運(yùn)算+-左5移位運(yùn)算>><<>>>左6大小關(guān)系運(yùn)算<<=>>=左7相等關(guān)系運(yùn)算==!=左8按位與,非簡(jiǎn)潔與&左9按位異或運(yùn)算^左10按位或,非簡(jiǎn)潔或|左11簡(jiǎn)潔與&&左12簡(jiǎn)潔或||左13三目條件運(yùn)算?:右14簡(jiǎn)單、復(fù)雜賦值=運(yùn)算符=右3.3.8注釋
注釋是程序不可少的部分。Java的注釋符有兩種。一種是行注釋符“//”,以“//”開(kāi)頭到本行末的所有字符被系統(tǒng)理解為注釋?zhuān)挥杈幾g。如: //Thisatestprogramofwhatistobedone另一種注釋符是塊注釋符“/*”和“*/”,其中“/*”標(biāo)志著注釋塊的開(kāi)始,“*/”標(biāo)志著注釋塊的結(jié)束。“/*”和“*/”可以括起若干個(gè)注釋行。如: /*程序名: 項(xiàng)目名: 編寫(xiě)時(shí)間: 功能: 輸入/輸出:*/3.4流程控制語(yǔ)句
流程控制語(yǔ)句是用來(lái)控制程序中各語(yǔ)句執(zhí)行順序的語(yǔ)句,是程序中非常關(guān)鍵和基本的部分。流程控制語(yǔ)句可以把單個(gè)的語(yǔ)句組合成有意義的,能完成一定功能的小邏輯模塊,能否熟練地運(yùn)用流程控制語(yǔ)句往往很大程度上影響所編寫(xiě)程序的質(zhì)量。最主要的流程控制方式是結(jié)構(gòu)化程序設(shè)計(jì)中規(guī)定的三種基本流程結(jié)構(gòu)。3.4.1結(jié)構(gòu)化程序設(shè)計(jì)的三種基本流程結(jié)構(gòu)化程序設(shè)計(jì)原則是公認(rèn)的面向過(guò)程編程應(yīng)遵循的原則,它使得程序段的邏輯結(jié)構(gòu)清晰、層次分明,有效地改善了局部程序段的可讀性和可靠性,保證了其質(zhì)量,提高了開(kāi)發(fā)效率。結(jié)構(gòu)化程序設(shè)計(jì)的最基本的原則是:任何程序都可以且只能由三種基本流程結(jié)構(gòu)構(gòu)成,即順序結(jié)構(gòu)、分支結(jié)構(gòu)和循環(huán)結(jié)構(gòu)。這三種結(jié)構(gòu)的構(gòu)成參見(jiàn)圖。圖3.7結(jié)構(gòu)化程序設(shè)計(jì)的三種基本結(jié)構(gòu)順序結(jié)構(gòu)是三種結(jié)構(gòu)中最簡(jiǎn)單的一種,即語(yǔ)句按照書(shū)寫(xiě)的順序依次執(zhí)行;分支結(jié)構(gòu)又稱(chēng)為選擇結(jié)構(gòu),它將根據(jù)計(jì)算所得的表達(dá)式的值來(lái)判斷應(yīng)選擇執(zhí)行哪一個(gè)流程的分支;循環(huán)結(jié)構(gòu)則是在一定條件下反復(fù)執(zhí)行一段語(yǔ)句的流程結(jié)構(gòu)。這三種結(jié)構(gòu)構(gòu)成了程序局部模塊的基本框架。
Java語(yǔ)言雖然是面向?qū)ο蟮恼Z(yǔ)言,但是在局部的語(yǔ)句塊內(nèi)部,仍然需要借助于結(jié)構(gòu)化程序設(shè)計(jì)的基本流程結(jié)構(gòu)來(lái)組織語(yǔ)句,完成相應(yīng)的邏輯功能。Java的語(yǔ)句塊是由一對(duì)大括號(hào)括起的若干語(yǔ)句的集合。Java中,有專(zhuān)門(mén)負(fù)責(zé)實(shí)現(xiàn)分支結(jié)構(gòu)的條件分支語(yǔ)句和負(fù)責(zé)實(shí)現(xiàn)循環(huán)結(jié)構(gòu)的循環(huán)語(yǔ)句。3.4.2分支語(yǔ)句Java中的分支語(yǔ)句有兩個(gè),一個(gè)是負(fù)責(zé)實(shí)現(xiàn)雙分支的if語(yǔ)句,另一個(gè)是負(fù)責(zé)實(shí)現(xiàn)多分支的開(kāi)關(guān)語(yǔ)句switch。1.if語(yǔ)句if語(yǔ)句的一般形式是: if(條件表達(dá)式) 語(yǔ)句塊;//if分支 else 語(yǔ)句塊;//else分支其中條件表達(dá)式用來(lái)選擇判斷程序的流程走向,在程序的實(shí)際執(zhí)行過(guò)程中,如果條件表達(dá)式的取值為真,則執(zhí)行if分支的語(yǔ)句塊,否則執(zhí)行else分支的語(yǔ)句塊。在編寫(xiě)程序時(shí),也可以不書(shū)寫(xiě)else分支,此時(shí)若條件表達(dá)式的取值為假,則繞過(guò)if分支直接執(zhí)行if語(yǔ)句后面的其他語(yǔ)句。語(yǔ)法格式如下: if(條件表達(dá)式) 語(yǔ)句塊;//if分支 其他語(yǔ)句;下面是一個(gè)if語(yǔ)句的簡(jiǎn)單例子,是實(shí)現(xiàn)求某數(shù)的絕對(duì)值功能的程序片段。 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(″請(qǐng)先輸入三個(gè)待比 較的整數(shù)″); 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(″三數(shù)中最大值是:″+ max); 42:} 43:}例3-7中的程序接受用戶輸入的三個(gè)整數(shù),在用戶單擊“比較”按鈕后程序調(diào)用方法actionPerformed()比較并輸出其中的最大值。第31句到第40句使用if語(yǔ)句的嵌套比較并得到三數(shù)中的最大值。第41句中使用了Label類(lèi)對(duì)象result的一個(gè)系統(tǒng)定義好的方法setText()把原來(lái)顯示的提示信息變換成輸出信息。圖是例3-7程序運(yùn)行的結(jié)果。圖3.8例3-7的運(yùn)行結(jié)果2.switch語(yǔ)句switch語(yǔ)句是多分支的開(kāi)關(guān)語(yǔ)句,它的一般格式如下: switch(表達(dá)式) {case判斷值1:語(yǔ)句塊1//分支1 case判斷值2:語(yǔ)句塊2//分支2 …… case判斷值n:語(yǔ)句塊n//分支n default:語(yǔ)句塊n+1//分支n+1 }switch語(yǔ)句在執(zhí)行時(shí),首先計(jì)算表達(dá)式的值,這個(gè)值必須是整型或字符型,同時(shí)應(yīng)與各個(gè)case分支的判斷值的類(lèi)型相一致。計(jì)算出表達(dá)式的值之后,將它先與第一個(gè)case分支的判斷值相比較,若相同,則程序的流程轉(zhuǎn)入第一個(gè)case分支的語(yǔ)句塊;否則,再將表達(dá)式的值與第二個(gè)case分支相比較……依此類(lèi)推。如果表達(dá)式的值與任何一個(gè)case分支都不相同,則轉(zhuǎn)而執(zhí)行最后的default分支;在default分支不存在的情況下,則跳出整個(gè)switch語(yǔ)句。需要注意的是,switch語(yǔ)句的每一個(gè)case判斷,都只負(fù)責(zé)指明流程分支的入口點(diǎn),而不負(fù)責(zé)指定分支的出口點(diǎn),分支的出口點(diǎn)需要編程人員用相應(yīng)的跳轉(zhuǎn)語(yǔ)句來(lái)標(biāo)明??聪旅娴睦樱?/p>
switch(MyGrade) {case′A′:MyScore=5; case′B′:MyScore=4; case′C′:MyScore=3; default:MyScore=0;}假設(shè)變量MyGrade的值為“A”,執(zhí)行完switch語(yǔ)句后,變量MyScore的值被賦成0,而不是5!因?yàn)閏ase判斷只負(fù)責(zé)指明分支的入口點(diǎn),表達(dá)式的值與第一個(gè)case分支的判斷值相匹配后,程序的流程進(jìn)入第一個(gè)分支,將MyScore的值置為5。由于沒(méi)有專(zhuān)門(mén)的分支出口,所以流程將繼續(xù)沿著下面的分支逐個(gè)執(zhí)行,MyScore的值被依次置為4,3,最后變成0。如果希望程序的邏輯結(jié)構(gòu)正常完成分支的選擇,則需要為每一個(gè)分支另外編寫(xiě)退出語(yǔ)句。
修改后的例子如下: switch(MyGrade) {case′A′:MyScore=5; break; case′B′:MyScore=4; break;case′C′:MyScore=3; break; default:MyScore=0;}break是流程跳轉(zhuǎn)語(yǔ)句。通過(guò)引入break語(yǔ)句,定義了各分支的出口,多分支開(kāi)關(guān)語(yǔ)句的結(jié)構(gòu)就完整了。在某些情況下,switch語(yǔ)句的這個(gè)只有分支入口、沒(méi)有出口的功能也有它獨(dú)特的適用場(chǎng)合。如在若干判斷值共享同一個(gè)分支時(shí),就可以實(shí)現(xiàn)由不同的判斷語(yǔ)句流入相同的分支。下面的例子是該例的進(jìn)一步修改,僅劃分及格與不及格。 switch(MyGrade) {case′A′: case′B′: case′C′:MyScore=1;//及格 break; default:MyScore=0;//不及格}3.4.3循環(huán)語(yǔ)句循環(huán)結(jié)構(gòu)是在一定條件下,反復(fù)執(zhí)行某段程序的流程結(jié)構(gòu),被反復(fù)執(zhí)行的程序被稱(chēng)為循環(huán)體。循環(huán)結(jié)構(gòu)是程序中非常重要和基本的一種結(jié)構(gòu),它是由循環(huán)語(yǔ)句來(lái)實(shí)現(xiàn)的。Java的循環(huán)語(yǔ)句共有三種:while語(yǔ)句、do-while語(yǔ)句和for語(yǔ)句。它們的結(jié)構(gòu)如圖所示。圖3-9Java的三種循環(huán)語(yǔ)句流程1.while語(yǔ)句while語(yǔ)句的一般語(yǔ)法格式如下: while(條件表達(dá)式) 循環(huán)體其中條件表達(dá)式的返回值為布爾型,循環(huán)體可以是單個(gè)語(yǔ)句,也可以是復(fù)合語(yǔ)句塊。while語(yǔ)句的執(zhí)行過(guò)程是先判斷條件表達(dá)式的值,若為真,則執(zhí)行循環(huán)體,循環(huán)體執(zhí)行完之后再無(wú)條件轉(zhuǎn)向條件表達(dá)式再做計(jì)算與判斷;當(dāng)計(jì)算出條件表達(dá)式為假時(shí),跳過(guò)循環(huán)體執(zhí)行while語(yǔ)句后面的語(yǔ)句。下面是一個(gè)使用while語(yǔ)句的例子:例 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+++″個(gè)水仙花數(shù):″+n); 14:n++; 15:} 16:} 17:}例3-8是一個(gè)字符界面的JavaApplication程序,其功能是找出所有的水仙花數(shù)并輸出。水仙花數(shù)是三位數(shù),它的各位數(shù)字的立方和等于這個(gè)三位數(shù)本身,例如371=33+73+13,則371就是一個(gè)水仙花數(shù)。第7句到第15句定義了一個(gè)while循環(huán),每輪循環(huán)檢查100到999中的一個(gè)三位數(shù)n,取出n的個(gè)位、十位和百位數(shù)分別存入k,j,i三個(gè)整型變量;第12句利用系統(tǒng)定義好的方法Math.pow()計(jì)算i,j,k的三次方并相加,若所得的和等于n,則輸出這個(gè)水仙花數(shù);否則n加1檢查下一個(gè)三位數(shù)。循環(huán)結(jié)束時(shí)所有的三位數(shù)都將被檢查到。圖是例3-8的運(yùn)行結(jié)果。圖3.10例3-8的運(yùn)行結(jié)果2.do-while語(yǔ)句do-while語(yǔ)句的一般語(yǔ)法結(jié)構(gòu)如下: do循環(huán)體 while(條件表達(dá)式);do-while語(yǔ)句的使用與while語(yǔ)句很類(lèi)似,不同的是它不像while語(yǔ)句是先計(jì)算條件表達(dá)式的值,而是無(wú)條件地先執(zhí)行一遍循環(huán)體,再來(lái)判斷條件表達(dá)式。若表達(dá)式的值為真,則再運(yùn)行循環(huán)體,否則跳出do-while循環(huán),執(zhí)行下面的語(yǔ)句。可以看出,do-while語(yǔ)句的特點(diǎn)是它的循環(huán)體將至少被執(zhí)行一次。下面是使用do-while語(yǔ)句的例子。例 1:importjava.io.*; 2: 3:publicclassshowCharValue 4:{ 5:publicstaticvoidmain(Stringargs[]) 6:{ 7:charch; 8: 9:try 10:{ 11:System.out.println(″請(qǐng)輸入一個(gè)字符, 以′#′結(jié)束″); 12:do 13:{ 14:ch=(char)System.in.read(); 15:System.out.println(″字符 ″+ch+″的整數(shù)值為″+(int)ch); 16:System.in.skip(2);//跳過(guò)回車(chē)鍵 17:}while(ch!=′#′); 18:} 19:catch(IOExceptione) 20:{ 21:System.err.println(e.toString()); 22:} 23:} 24:}例3-9是字符界面的JavaApplication程序,它接受用戶輸入的一個(gè)字符后輸出這個(gè)字符整型數(shù)值。第12句到第17句是do-while循環(huán)。第14句從系統(tǒng)標(biāo)準(zhǔn)輸入(即鍵盤(pán))讀入一個(gè)整型數(shù)據(jù),經(jīng)強(qiáng)制類(lèi)型轉(zhuǎn)換變換成字符型賦值給字符變量ch。第15句輸出ch和其整型值。第16句略過(guò)用戶輸入字符后鍵入的回車(chē)鍵。第17句檢查用戶輸入的字符是否是“#”,是則結(jié)束循環(huán),否則跳回第14句繼續(xù)接受用戶的輸入。圖是例3-9的一次運(yùn)行結(jié)果。圖3.11例3-9的運(yùn)行結(jié)果3.for語(yǔ)句for語(yǔ)句是Java語(yǔ)言三個(gè)循環(huán)語(yǔ)句中功能較強(qiáng),使用較廣泛的一個(gè),它的流程結(jié)構(gòu)可參看圖3.9(c)。for語(yǔ)句的一般語(yǔ)法格式如下: for(表達(dá)式1;表達(dá)式2;表達(dá)式3) 循環(huán)體其中表達(dá)式2是返回布爾值的條件表達(dá)式,用來(lái)判斷循環(huán)是否繼續(xù);表達(dá)式1完成初始化循環(huán)變量和其他變量的工作;表達(dá)式3用來(lái)修整循環(huán)變量,改變循環(huán)條件,三個(gè)表達(dá)式之間用分號(hào)隔開(kāi)。for語(yǔ)句的執(zhí)行過(guò)程是這樣的:首先計(jì)算表達(dá)式1,完成必要的初始化工作;再判斷表達(dá)式2的值,若為真,則執(zhí)行循環(huán)體,執(zhí)行完循環(huán)體后再返回表達(dá)式3,計(jì)算并修改循環(huán)條件,這樣一輪循環(huán)就結(jié)束了。第二輪循環(huán)從計(jì)算并判斷表達(dá)式2開(kāi)始,若表達(dá)式的值仍為真,則繼續(xù)循環(huán),否則跳出整個(gè)for語(yǔ)句執(zhí)行下面的句子。for語(yǔ)句的三個(gè)表達(dá)式都可以為空,但若表達(dá)式2也為空,則表示當(dāng)前循環(huán)是一個(gè)無(wú)限循環(huán),需要在循環(huán)體中書(shū)寫(xiě)另外的跳轉(zhuǎn)語(yǔ)句終止循環(huán)。例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之內(nèi)的所有完全數(shù)。完全數(shù)是指等于其所有因子和(包括1但不包括這個(gè)數(shù)本
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年溫州大客車(chē)從業(yè)資格證考試試題
- 2024年迪慶客運(yùn)資格證考試題庫(kù)下載
- 人教部編版二年級(jí)語(yǔ)文上冊(cè)第22課《狐假虎威》精美課件
- 吉首大學(xué)《建筑設(shè)計(jì)Ⅴ》2021-2022學(xué)年第一學(xué)期期末試卷
- 吉首大學(xué)《場(chǎng)景設(shè)計(jì)》2021-2022學(xué)年第一學(xué)期期末試卷
- 《機(jī)床夾具設(shè)計(jì)》試卷17
- 吉林藝術(shù)學(xué)院《藝術(shù)批評(píng)寫(xiě)作》2021-2022學(xué)年第一學(xué)期期末試卷
- 吉林藝術(shù)學(xué)院《全媒體文案創(chuàng)意寫(xiě)作》2021-2022學(xué)年第一學(xué)期期末試卷
- 簽訂宴會(huì)廳協(xié)議書(shū)范本范本
- 吉林藝術(shù)學(xué)院《CG模型設(shè)計(jì)》2021-2022學(xué)年第一學(xué)期期末試卷
- IEEE1588學(xué)習(xí)筆記
- 危險(xiǎn)化學(xué)品企業(yè)安全風(fēng)險(xiǎn)智能化管控平臺(tái)建設(shè)指南(試行)
- 亞龍YL-335B實(shí)訓(xùn)項(xiàng)目書(shū)
- 鋼管落地卸料平臺(tái)
- 日語(yǔ)授受關(guān)系PPT演示課件
- 殯儀服務(wù)試題——
- 淺析全面深化改革的背景和特點(diǎn)
- 骨齡及其測(cè)評(píng)方法
- (完整版)初三化學(xué)計(jì)算題專(zhuān)題練習(xí)題
- 2010年度重慶市高等學(xué)校精品課程申報(bào)表 高電壓技術(shù)
- 中日英刀具照表
評(píng)論
0/150
提交評(píng)論