第三章 JAVA 語言基礎(chǔ) 本章的目的在于讓讀者對數(shù)據(jù)類型、表達(dá)式、控制流程等Java語言的基本內(nèi)容有一個(gè)深入的了解,這些內(nèi)容是任何一門程序設(shè)計(jì)語言都必須包含的部分,也是我們編程的基礎(chǔ)。 對于那些熟悉編程特別是用C和C++語言編程的人來說,本章的內(nèi)容將會是非常熟悉的,除了Java在一些地方更偏重于面向?qū)ο蟮乃枷胪?,幾乎所有的基本?nèi)容都與C++語言相同或是類似的。對那些把Java語言作為自己的第一門編程語言的人來說,應(yīng)該仔細(xì)閱讀本章。本章內(nèi)容雖然比較簡單,介大家務(wù)必仔細(xì)弄清楚每一個(gè)環(huán)節(jié)。在這方面花點(diǎn)時(shí)間,會使以后的程序設(shè)計(jì)更為簡單。 3.1 Java語言的基本組成 Java語言主要由以下五種元素組成:標(biāo)識符、關(guān)鍵字、文字、運(yùn)算符和分隔符。這五種元素有著不同的語法含義和組成規(guī)則,它們互相配合,共同完成Java語言的語意表達(dá)。下面我們分別予以講解。 3.1.1 標(biāo)識符 變量,以及我們后面將要講到的類和方法都需要一定的名稱,我們將這種名稱叫做標(biāo)識符。佬是一個(gè)有效的標(biāo)識符呢?在Java中,所有的標(biāo)識符都必須以一個(gè)字母、下劃線_或美元符¥作開頭。后面的字符包括數(shù)字(0--9),所有從A--Z的大寫字母和a--z的小寫字母,以及所有在十六進(jìn)制0xc0前的ASCII碼。 以上只是標(biāo)識符命名的基本規(guī)則,以下是一個(gè)正誤對照表,通過它會對標(biāo)識符的命名規(guī)則有一個(gè)具體的了解: 合法標(biāo)識符 非法標(biāo)識符 try try# group_7 7group opendoor open-door boolean_1 boolean 表4-11 注:boolean 為關(guān)鍵字 3.1.2 關(guān)鍵字 關(guān)鍵字是Java語言本身使用的標(biāo)識符,它有其特定的語法含義。所有的Java關(guān)鍵字將不能被用作標(biāo)識符,如:for、while、boolean等都是Java語言的關(guān)鍵字。本書后附有Java語言關(guān)鍵字列表。 3.1.3 文字 文字,其實(shí)就是我們通常所說的數(shù)據(jù)。文字的不同表現(xiàn)形式,也就是不同的數(shù)據(jù)類型,Java的數(shù)據(jù)類型有:整型、浮點(diǎn)型、布爾型、字符型、字符串型。 整型數(shù)據(jù)是最普通的數(shù)據(jù)類型,它的表現(xiàn)方式有:十進(jìn)制、十六進(jìn)制和八進(jìn)制?;鶖?shù)為10的十進(jìn)制是我們最熟悉的?;鶌錇?6的十六進(jìn)制表示法,也是程序設(shè)計(jì)中常常用到的,在十六進(jìn)制中,每一位數(shù)字相當(dāng)于4個(gè)二進(jìn)制0和1的組合。十六進(jìn)制整數(shù)用0--9的10個(gè)數(shù)字和字母A--F代表10--15這些整數(shù),十六進(jìn)制整數(shù)必須以0X作為開頭。 每一個(gè)整型數(shù)據(jù)占有32位的存儲空間,即四個(gè)字節(jié)。這意味著整型數(shù)據(jù)所表示,的范圍在-2,147,483,648和2,147,483,648之間,假如由于某些原因,你必須表示一個(gè)更大的數(shù),64位的長整型應(yīng)該是足夠的。如果你想把一個(gè)整數(shù)強(qiáng)制存為一個(gè)長型(long),你可以在數(shù)字后面加字母l。 浮點(diǎn)數(shù)據(jù)用來代表一個(gè)帶小數(shù)的十進(jìn)制數(shù)。例如1.5或43.7。它父或者是標(biāo)準(zhǔn)形式,或者是用科學(xué)計(jì)數(shù)法的形式,下面是一些例子: 3.1415 0.1 .6 .02243 2.997E8 標(biāo)準(zhǔn)的浮點(diǎn)數(shù)叫做單精度浮點(diǎn)數(shù),它的存儲空間為32位,也就是四個(gè)字節(jié)。也有64位的雙精度浮點(diǎn)數(shù)。你可以用D后綴確定你想使用這種雙精度浮點(diǎn)數(shù)。 布爾類型是最簡單的一種數(shù)據(jù)類型,布爾數(shù)據(jù)只有兩種狀態(tài):真和假,通常用關(guān)鍵字true和false來表示這兩種狀態(tài)。 字符型數(shù)據(jù)是由一對單引號括起來的單個(gè)字符。它可以是字符集中的任意一個(gè)字符,如:'a','b'。 字符串?dāng)?shù)據(jù)類型是用一對雙引號括起來的字符序列,字符串?dāng)?shù)據(jù)實(shí)際上是由String類所實(shí)現(xiàn)(類這個(gè)概念我們將在后續(xù)章節(jié)中詳細(xì)講解),而不是C語言中所用的字符數(shù)組。每一個(gè)字符串?dāng)?shù)據(jù)將產(chǎn)生一個(gè)String類的新的實(shí)例,讀者不必對字符串與類這個(gè)概念發(fā)生關(guān)系而感到擔(dān)心,由于類的特性,你不必?fù)?dān)心如何去實(shí)現(xiàn)它們,它們會自己照顧好自己,需要說明的是字符串在Java里作為類只是出于安全的考慮。 表4-2給出了幾個(gè)字符串的例子。
字符串描述 對應(yīng)值 "" "Let's go" Let's go "Two" Two Lines 表 4-2 幾個(gè)例子 注:''在這里表示回車換行。 3.1.4 運(yùn)算符 任何語言都有自己的運(yùn)算符,Java語言也不例外,如+、-、*、/等都是運(yùn)算符,運(yùn)算符的作用是與一定的運(yùn)算數(shù)據(jù)組成表達(dá)式來完成相應(yīng)的運(yùn)算。對不同的數(shù)據(jù)類型,有著不同的運(yùn)算符,我們將在下一節(jié)中對不同類型的運(yùn)算符分別討論。 3.1.5 分隔符 分隔符用來使編譯器確認(rèn)代碼在何處分隔。‘’‘’‘;’‘:’都是Java語言的分隔符。 3.2 變量 為了在Java中存儲一個(gè)數(shù)據(jù),必須將它容納在一個(gè)變量之中。定義一個(gè)變量的兩個(gè)基本要素是:類型和標(biāo)識符,通常你可以用如下語法去說明變量: type identifer[,identifer]; 該語句告訴編譯器用“type”的類型和以“identifer”為名字建立一個(gè)變量,這里的分號將告訴編譯器這是一個(gè)說明語句的結(jié)束;方格中的逗號和標(biāo)識符表示你可以把幾個(gè)類型相同的變量放在同一語句進(jìn)行說明,變量名中間用逗號分隔。 在你創(chuàng)建了一個(gè)變量以后,你可以給它賦值,或者用運(yùn)算符對它進(jìn)行一些運(yùn)算。如同上一節(jié)內(nèi)容中所提到的一樣,類型將決定變量所代表的不同種類的數(shù)據(jù),在Java語言中有兩種變量。最基本的是簡單類型變量,他們不建立在任何其他類型上,整數(shù)、浮點(diǎn)、布爾和字符類型都是這類型;另外Java可以定義構(gòu)造另一種變量類型:類,這些類型建立在簡單類型之上,它包括數(shù)值、變量和方法,是一種數(shù)據(jù)與代碼相結(jié)合的復(fù)合結(jié)構(gòu)。 3.2.1 整型變量的說明 整型變量按所占內(nèi)存大小的不同可分為四種不同的類型,最短的整型是byte,它只有八位長,然后是短整型short,它有16位,int類型有32位,長整型long是64位,下面是這些整型變量的說明示例。 byte a; short row; int numberOfSportor; long treeCount; int x,y,z; 3.2.2 浮點(diǎn)變量的說明 浮點(diǎn)類型可用關(guān)鍵字float或double來說明,float型的浮點(diǎn)變量用來表示一個(gè)32位的單精度浮點(diǎn)數(shù),而double型的浮點(diǎn)變量用來表示一個(gè)64位的雙精度浮點(diǎn)數(shù)。double型所表示的浮點(diǎn)數(shù)比float型更精確。 float alpha; double speed; 3.2.3 字符變量說明 Java使用16位的Unicode字符集。因此Java字符是一個(gè)16位的無符號整數(shù),字符變量用來存放單個(gè)字符,它不是完整的字符串。示例如下: char a; a='c'; 3.2.4 布爾變量說明 布爾型有真和假兩個(gè)邏輯值,另外,邏輯運(yùn)算符也將返回布爾類型的值,示例如下: boolean mouseOn; mouseOn=true; 布爾型是一個(gè)獨(dú)立的類型,它不像C語言中的布爾型代表0和1兩個(gè)整數(shù),由于這個(gè)原因,Java中的布爾類型不能轉(zhuǎn)換成數(shù)字。 3.2.5 變量的使用范圍 當(dāng)你說明了一個(gè)變量后,它將被引入到一個(gè)范圍當(dāng)中,也就是說,該名字只能在程序的特定范圍內(nèi)使用。變量的使用范圍是從它被說明的地方到它所在那個(gè)塊的結(jié)束處,塊是由兩個(gè)大括號所定義的,例如:
class Example public static void main(String args[]) int i; ...... public void function() char c; ...... 整型變量i在方法main中說明,因?yàn)閙ain的塊不包括function塊,所以任何在function塊中對i的引用都是錯(cuò)誤的。對字符型變量c也同樣如此。 在某一個(gè)特定情形中,變量能被別的變量所隱藏,如:在一個(gè)塊中說明一個(gè)變量,而在這個(gè)塊中建立一個(gè)新塊并且在其中定義相同名字的變量,這樣在第二個(gè)塊中,程序?qū)υ撟兞康氖褂镁侵傅诙味x的那個(gè)變量。這樣我們說,第一個(gè)變量被隱藏了。變量隱藏的示例如下: class Example public static void main(String args[]) int i; // * * * boolean try=true; while(try) int i; //以下對變量i的引用均指這里定義的i ...... //以下對變量i的引用均指* * *處定義的i ...... 當(dāng)你定義一個(gè)變量時(shí),首先必須明確它的活動范圍,并根據(jù)它的實(shí)際功能來命名,此外還應(yīng)盡量使用詳細(xì)的注釋,這些辦法可以使你能夠清晰地區(qū)分變量,變量被隱藏的問題也會大大減少。 3.2.6 類型轉(zhuǎn)換 系統(tǒng)方法System.in.read返回一個(gè)整型數(shù)值,但你卻常常想要把它當(dāng)作一個(gè)字符來使用?,F(xiàn)在的問題是,當(dāng)有一個(gè)整數(shù)而你需要把變成一個(gè)字符時(shí)應(yīng)當(dāng)去做些什么呢?你需要去做一個(gè)類型轉(zhuǎn)換為一個(gè)字符。從一種類型轉(zhuǎn)換到另一種類型可以使用下面的語句: int a; char b; a=(int)b; 加括號的int告訴編譯器你想把字符變成整型并把它放在a里,另一方面,如果你想做相反的轉(zhuǎn)換,你可以使用: b=(char)a; 記住整型和字符型變量位長不同是非常重要的,整型是32位長,字符型是16長,所以當(dāng)你從整型轉(zhuǎn)換到字符型可能會丟失信息。同樣,當(dāng)你把64位的長整型數(shù)轉(zhuǎn)換為整型時(shí),由于長整型可能有比32位更多的信息,你也很可能會丟失信息。即使兩個(gè)量具有相同的位數(shù),比如整和浮點(diǎn)型(都是32位),你在轉(zhuǎn)換小數(shù)時(shí)也會丟失信息,Java不象c/c++那樣允許自動類型轉(zhuǎn)換,當(dāng)你進(jìn)行類型轉(zhuǎn)換要注意使目標(biāo)類型能夠容納原類型的所有信息,不會丟失信息的類型轉(zhuǎn)換有:
原始類型 目標(biāo)類型 byte short,char,int,long,float,double short int,long,float,double char int,long,float,double int long,float,double long float,double float double 表3-3 不會丟失信息的類型轉(zhuǎn)換列表 需要說明的是,當(dāng)你執(zhí)行一個(gè)這里并未列出的類型轉(zhuǎn)換時(shí)可能并不總會丟失信息,不過進(jìn)行這樣一個(gè)理論上并不安全的轉(zhuǎn)換總是很危險(xiǎn)的。 3.3 運(yùn)算符 在你定義了的變量之后,通常都要對變量賦值、改變變量的值和使用變量進(jìn)行計(jì)算,這都是運(yùn)算符的作用。 3.3.1 優(yōu)先級 表3-4按從高到低的優(yōu)先級列出了運(yùn)算符。同一行中的運(yùn)算符優(yōu)先級相同。
. [] () ++ -- ! ~ * / % + - << >> >>> < > <= >= == != & ^ && || ?: = 表3-4 運(yùn)算符的優(yōu)先級 優(yōu)先級是指同一式子中多個(gè)運(yùn)算符被執(zhí)行和次序,同一級里的操作符具有相同的優(yōu)先級,例如對于表達(dá)式: a=b+c*d/(c^d) Java處理時(shí)將會按照表3-4從最高優(yōu)先級到最低的次序進(jìn)行,在本例中,因?yàn)槔ㄌ杻?yōu)先級最高,所以先計(jì)算c^d,接著是c*d,然后除以c^d,最后,把上述結(jié)果與b的和存儲到變量a中,不論任何時(shí)候,當(dāng)你一時(shí)無法確定某種計(jì)算的執(zhí)行次序時(shí),可以使用加括號的方法明確為編譯器指定運(yùn)算順序,這也是提高程序可讀性的一個(gè)重要方法。 3.3.2 整型運(yùn)算符 整型運(yùn)算符按操作數(shù)的多少可分為一元和二元兩類,一元運(yùn)算符一次對一個(gè)變量進(jìn)行操作,二元運(yùn)算符一次對兩個(gè)變量進(jìn)行操作。對于運(yùn)算來說,如果有一個(gè)變量或操作數(shù)是長整型的,那么結(jié)果就肯定是長整型的,否則即使操作數(shù)還沒有確定是字節(jié)型、短整型或字符型,運(yùn)算結(jié)果都是整型,表3-5是一元運(yùn)算符的列表。
運(yùn)算符 實(shí)際操作 例子 - 改變整型數(shù)符號 -i ~ 位運(yùn)算:非 ~i ++ 加1 i++ -- 減1 i-- 表3-5 一元運(yùn)算符列表 注:一元取反運(yùn)算符(-)用來改變整數(shù)的正負(fù)號,逐位求反把所變量所有是1的位變成0,是0的位變成1,加加和減減(++,--)把變量的值加1或減1。 以下是一個(gè)具體例子: int i=0; int j=1=; for (i=1;i<10;i++) j--; System.out.println(i+""+j+""); 這個(gè)程序的一行執(zhí)行加運(yùn)算,另一行執(zhí)行減運(yùn)算,注意“++”和“--”的使用,每次遇到“++”或“--”的時(shí)候,系統(tǒng)就把操作數(shù)的值相應(yīng)地加1或減1,一元運(yùn)算符執(zhí)行的方式是改變它們所作用的變量的值,對一元取反和逐位求反來說,變量的值并不改變,而對加和減運(yùn)算(++,--)來說,就量的值被改變了,下面的代碼給出了這種工作方式的一個(gè)例子: int i=10,j=10,k=10,l=10; System.out.println(i+""+j+""+k+""+l+""); j++; i--; ~k; -l; System.out.println(i+""+j+""+k+""+l+""); 注意j和i被改變并打印出它們的新值,可是k和l仍然為原來的數(shù)值,當(dāng)在復(fù)合表達(dá)式中使用一元取反和逐位求余運(yùn)算時(shí),你實(shí)際上是在用一個(gè)臨時(shí)存貯操作數(shù)的新值。 ++和--既是前置運(yùn)算符也是后置運(yùn)算符,這就是說,它們既可以放在操作數(shù)前面(++x),也可以放在后面(x++),如果它們被用在復(fù)合語句中如: i=x++; 或 i=++x; 那么第一個(gè)語句中x把值賦給i以后再加1,而第二個(gè)語句先把x加1,再把新的x值賦給i。 整型運(yùn)算符的第二種類型是二元運(yùn)算符,這種運(yùn)算并不改變操作數(shù)的值,而是返回一個(gè)必須賦給變量的值,表3-6列出了二元運(yùn)算符。 運(yùn)算符 實(shí)際操作 例子 + 加運(yùn)算 a+b - 減運(yùn)算 a-b * 乘運(yùn)算 a*b / 除運(yùn)算 a/b % 取模運(yùn)算 a%b & 與運(yùn)算 a&b | 或運(yùn)算 a|b ^ 異或運(yùn)算 a^b << 左移 a<<b >> 右移 a>>b >>> 右移 a>>>b 表3-6 二元運(yùn)算符列表 注意:>>與>>>的基本功能都是右移,但>>是用符號位來填充右移后所留下的空位,而>>>則是用零來填充右移后所留下的空位。 還有一類運(yùn)算,它們形如:j-=i,這里-=是二元運(yùn)算-和賦值運(yùn)算=的復(fù)合運(yùn)算,它等價(jià)于j=j-i,這種復(fù)合方式適用于所有的二元運(yùn)算符。 這里有幾點(diǎn)關(guān)于整型運(yùn)算進(jìn)一步說明,首先,整數(shù)除法向靠近0的方向取整;其次,如果你除以0或者對0取模,程序就會在運(yùn)行時(shí)被強(qiáng)行中止,如果你的運(yùn)算結(jié)果超出最小極限,或者說是下溢,結(jié)果將為0,如果超出了最大極限,就將會導(dǎo)致結(jié)果的回繞。 3.3.3 布爾運(yùn)算符 另外還有一些運(yùn)算符能產(chǎn)生布爾類型的結(jié)果,我們把它們稱為布爾運(yùn)算符,表4-7列出了這些運(yùn)算符。
運(yùn)算符 實(shí)際操作 例子 < 小于 a<b > 大于 a>b <= 小于等于 a<=b > 大于等于 a>=b == 等于 a==b != 不等于 a!=b 表3-7 產(chǎn)生布爾類型結(jié)果的運(yùn)算符 在這里要指出的是相等運(yùn)算符==可能會給你帶來許多麻煩,很多人在比較兩個(gè)值時(shí)往往錯(cuò)用了等號=,以致于變成了賦值操作,所以在編程中一定要注意你在比較數(shù)值時(shí)用的是==。布爾類型本身還有幾個(gè)邏輯運(yùn)算符,它們可以對布爾類型的數(shù)據(jù)進(jìn)行運(yùn)算: !,&&,// 其實(shí)如果你把布爾類型的值true等效地看成1,false看成0,那么對于相同的運(yùn)算符,整型運(yùn)算的法則對布爾類型也是適用的。 布爾運(yùn)算符中還有一種三元運(yùn)算符,它的格式如下: Operand ? Statement1:Statement2 在這個(gè)式子中,先計(jì)算Operand的真假,若為真,則執(zhí)行Statement1,若為假,則執(zhí)行Statement2。下面的代碼給出了這種運(yùn)算的一個(gè)例子: (a>b)?a:b; 這個(gè)表達(dá)式將返回a和b中較大的那個(gè)數(shù)值。 3.3.4 浮點(diǎn)型運(yùn)算符 傳統(tǒng)的浮點(diǎn)型二元運(yùn)算除了賦值運(yùn)算符(+=,-=.*=./)取模(%)和取模賦值(%=0)使浮點(diǎn)數(shù)值等價(jià)于整數(shù)除法,同樣,++和--使變量的值增加或減小1。 同整型變量相似,結(jié)果被放在最大長度的類型里,如果運(yùn)算包括兩個(gè)浮點(diǎn)類型,結(jié)果也是個(gè)浮點(diǎn)類型,如果有一個(gè)或幾個(gè)是雙精度浮點(diǎn)型,結(jié)果就是雙精度浮點(diǎn)型,當(dāng)你使用關(guān)系運(yùn)算符:>、<、>=、<=、==和!=時(shí),注意浮點(diǎn)變量與整型的不同,只有a==b成立并不能說明a<b和a>b不成立,這是因?yàn)楦↑c(diǎn)類型數(shù)值次序同整型不同,當(dāng)你寫程序,對浮點(diǎn)型數(shù)值進(jìn)行假設(shè)時(shí)要小心,浮點(diǎn)型數(shù)值也包括inf,代表無窮大,溢出產(chǎn)生無窮大inf,下溢產(chǎn)生0。 3.3.5 字符串運(yùn)算符 +運(yùn)算符可以把字符串并置起來,如果哪一個(gè)操作數(shù)不是字符串,在并置之前它會被轉(zhuǎn)換成字符串,另外,+=運(yùn)算符把兩個(gè)字符串并置的結(jié)果放進(jìn)第一個(gè)字符串里,在前面的例子里,當(dāng)你想把幾項(xiàng)打印在同一行里時(shí)使用的是+運(yùn)算符,試著在解釋器里用System.out.println和+運(yùn)算符來造成不同的組合輸出。 3.4 數(shù)組 3.4.1 說明數(shù)組 數(shù)組是Java語言中的特殊類型。它們存放能通過索引來引用的一系列對象,另外,你可以定義數(shù)組的數(shù)組,下面是一些示例:
int i[]; char c[]; float f[][]; 4.4.2 數(shù)組運(yùn)算符 同C/C++不同,數(shù)組的分配是通過使用new運(yùn)算符建立數(shù)組然后把它賦給變量,如: int a[]=new int[10]; 前面這個(gè)例子建立了一個(gè)包括10個(gè)整型變量的數(shù)組并把它賦給a,你將得到按數(shù)字順序的變量a[0],a[1],......,a[8],a[9],注意下標(biāo)是從第一個(gè)元素的0開始,到數(shù)組個(gè)數(shù)減1。 數(shù)組的使用與變量相同,每一個(gè)數(shù)組成員都可以被用在同類變量被使用的地方,Java也支持多維數(shù)組。 char c[][]=new char[10][10]; float f[][]=new float[5][]; 清注意在第二個(gè)說明中只有一維的尺度被確定,Java要求在編譯時(shí)(即在源代碼中)至少有一維的尺度被確定了,其余維的尺度可以在以后分配。 數(shù)組主要用于你有大量相關(guān)數(shù)據(jù)想要存貯在一起而且能夠簡單地通過數(shù)字訪問它們,數(shù)組是非常強(qiáng)有力的,在后面有章節(jié)中我們還會進(jìn)一步討論它。 4.5 循環(huán): for,while和do 前面四節(jié)我們已經(jīng)學(xué)習(xí)了Java語言的基本組成,下面三節(jié),我們將學(xué)習(xí)如何運(yùn)用這些基本元素去構(gòu)成Java程序。 首先我們學(xué)習(xí)最簡單和最常用的循環(huán)語句。 Java的循環(huán)語句分為三種: for、while和do,它們的語法定義如下:
for: for(expression1;expression2;expression3) statement; while: while(boolean)statement; do-while: do statement while(boolean); 4.5.1 for循環(huán) Java語言的for語句與C語言的用法完全一致,這一點(diǎn)通過下面的講解可以看出。 for循環(huán)結(jié)構(gòu)在實(shí)現(xiàn)順序遞增直到達(dá)到某一極限的循環(huán)時(shí)是一個(gè)強(qiáng)有力的工具,for語句的格式要求你把一個(gè)變量和一個(gè)確定的極限作比較,當(dāng)達(dá)到極限時(shí),中止循環(huán),如: for(i=0;i<10;i++)......; 下面解釋變元的格式,在(ex1;ex2;ex3)中,第一個(gè)表達(dá)式指出for循環(huán)的變量初值,在這個(gè)例子中變量i被設(shè)為0;第二個(gè)表達(dá)式,i<10,指出循環(huán)何時(shí)結(jié)束,在這個(gè)例子中,對0-9的數(shù)值表達(dá)式都為真(這就是說循環(huán)應(yīng)該繼續(xù));最后的表達(dá)式指出循環(huán)每次對變量做什么,在例子中,循環(huán)使i從0到9,你可以使用這樣的語句來順序訪問數(shù)組的各個(gè)成員; int i,a[]=new int[10]; for (i=0,i<10;i++)a[i]=0; 這段代碼把整型數(shù)組a中的所有元素都賦成0。 你可以在for循環(huán)的頭部說明你的變量,而且最后一個(gè)表達(dá)式可以省略,不過要確定在語句中對變量的值有所改變,如: for(int i=10;i>=0;)i--; 下面for循環(huán)的例子將按5度的增量打印出一個(gè)從攝氏度到華氏度的轉(zhuǎn)換表:
class TempConversion public static void main (String args[]) int fahr,cels; System.out.println("Celsius Fahrenheit"); for(cels=0;cels<=100;cels+=5) fahr=cels*9/5+32; System.out.println(cels+""+fahr); 4.5.2 while和while--do循環(huán)結(jié)構(gòu) while循環(huán)檢查表達(dá)式的值是否為真,若為真,則執(zhí)行給定語句,直到表達(dá)式的值為假,另一個(gè)while--do循環(huán)則執(zhí)行給定的語句,再檢查表達(dá)式,若表達(dá)式值為真則跳出循環(huán),前面你已經(jīng)使用過while循環(huán)來表示加法運(yùn)算,你應(yīng)該記得你一定改變了循環(huán)判斷中的表達(dá)式的值,否則的話,如果它的值為真,你將進(jìn)入一個(gè)死循環(huán),因?yàn)樗偸钦?,正如下面的例子?br> boolean test=true; while(test) System.out.println("Hey!.get me out of here!:); 你可以試著運(yùn)行一下這些代碼,這過千萬不要等它結(jié)束(Ctrl-C可以中斷程序運(yùn)行),否則它會一直循環(huán)下去的。有些情況下,不管條件表達(dá)式的值是為真還是假,你都希望把指定的語句至少執(zhí)行一次,那么就應(yīng)使用do--while循環(huán),下面是個(gè)例子: boolean test=false; do ...... while(test); 這種控制并不是很常用,但有時(shí)卻非常重要,使用時(shí)注意結(jié)尾處while語句后的分號。 4.6 條件控制:if和switch 4.6.1 if語句 if語句通常都與else語句配套使用,所以我們一般都把它叫做if--else語句,它的語法結(jié)構(gòu)如下:
if--else: if(boolean)statement1 else statement2 當(dāng)表達(dá)式boolean為真時(shí),執(zhí)行statement1,否則執(zhí)行statement2。 下面是一個(gè)用if--else語句構(gòu)造多分支程序的例子: if(a>5) b=1 else if(a>4) b=2 else if(a>3) b=3 ... else b=-1; 4.6.2 switch分支結(jié)構(gòu) switch分支結(jié)構(gòu)實(shí)際上也是一種if--else結(jié)構(gòu),不過它使你在編碼時(shí)很容易寫出判斷條件,特別是有很多選項(xiàng)的時(shí)候,它把括號里變量的值同每種情況列出的值做比較,如果相等,就執(zhí)行后面的語句,如果不等,就執(zhí)行default語句。在switch語句中,你通常在每一種case情況后都應(yīng)使用break語句,否則,第一個(gè)相等情況后面所有的語句都會被執(zhí)行,這種情況叫做落空。你可以試著分別加上去和去掉break語句來執(zhí)行下面的例子:
class Switch Test public static void main(String args[]) throws java.io.IOException char a; System.out.println("Enter a number from 1--3:"); a=(char)System.in.read(); switch(a) case'1':System.out.println("win a Car!");break; case'2':System.out.println("picked the goat");break case'3':System.out.println("get to keep your 100"); break; default:System.out.println("entry"); 在代碼中加break語句后,你應(yīng)明確知道程序?qū)l(fā)生的變化,并要確認(rèn)程序沒有轉(zhuǎn)移到你不想執(zhí)行的代碼上。 掌握了以上這些基本語句之后,你可以寫更加實(shí)際點(diǎn)的程序了,下面這個(gè)程序計(jì)算從終端輸入的數(shù)字和字符的數(shù)量。 class SwitchTest public static void main (String args[]) throws java.io.IOException int numberOfDigits=0,numberOfSpaces=0,numberOfOthers=0; char c; while((c=(char)System.in.read())!='') switch(c) case'0': case'1': ... ... case'8': case'9':numberOfDigits++;break; case' ':numberOfSpaces++;break; default:numberOfOthers++;break; System.out.println(":"); System.out.println("Number of digits="+numberOfDigits+""); System.out.println("Number of spaces="+numberOfSpaces+""); System.out.println("Number of others="+numberOfOthers+""); 代碼的while循環(huán)從鍵盤讀入字符直至輸入一個(gè)回車符,循環(huán)內(nèi)部的switch語句先把它和數(shù)字比較,當(dāng)發(fā)現(xiàn)相等時(shí),它就使對應(yīng)的統(tǒng)計(jì)變量的值加1,然后break語句結(jié)束switch語句,程序回到等待鍵盤輸入的狀態(tài)。程序中,在default語句中的break是不必要的,不過加上它可以使程序風(fēng)格保持一致。 4.7 break和label 4.7.1 break break語句提供了一種方便的跳出循環(huán)的方法。
boolean test=true; int i=0; while(test) i++; if(i>=10) break; 執(zhí)行這段程序時(shí),盡管while條件表達(dá)式始終為真,全循環(huán)只運(yùn)行10次。 4.7.2 標(biāo)號label 標(biāo)號提供了一種簡單的break語句所不能實(shí)現(xiàn)的控制循環(huán)的方法,當(dāng)在循環(huán)語句中遇到break時(shí),不管其它控制變量,都會終止。但是,當(dāng)你嵌套在幾層循環(huán)中想退出循環(huán)時(shí)又會怎樣呢?正常的break只退出一重循環(huán),你可以用標(biāo)號標(biāo)出你想退出哪一個(gè)語句。
char a; outer://this is the label for the outer loop for(int i=0;i<10;i++) for(int j=0;j<10;j++) a=(char)System.in.read(); if(a=='b') breakouter; if(a=='c') continue outer; 在這個(gè)例子中,循環(huán)從鍵盤接受100個(gè)輸入字符,輸入“b”字符時(shí),breakouter語句會結(jié)束兩重循環(huán),注意continue outer語句,它告訴計(jì)算機(jī)退出現(xiàn)在的循環(huán)并繼續(xù)執(zhí)行outer循環(huán)。 讀者可能會注意到Java語言沒有g(shù)oto語句,這對于那些習(xí)慣使用它的程序員來講可能會有些不適應(yīng),但有經(jīng)驗(yàn)的程序員一定會明白,goto語句實(shí)際上是程序結(jié)構(gòu)混亂的重要根源之一,它最終所引起的問題比它可能帶來的好處要大得多。它一般用于比較特殊的問題,但卻使你在日后花大量時(shí)間去找出一個(gè)程序是干什么的。正由于這些原因,Java的設(shè)計(jì)者果斷地刪去了它。 |