Decode360's Blog

          業(yè)精于勤而荒于嬉 QQ:150355677 MSN:decode360@hotmail.com

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 ::  :: 管理 ::
            302 隨筆 :: 26 文章 :: 82 評論 :: 0 Trackbacks
          ?
          JAVA語言基礎(chǔ)

          ?
          ?
          1、標識符

          ??? Java語言的字符使用Unicode編碼標準。Unicode字符集中的每個字符為16位編碼。這樣,Java語言的字符就不僅可以表示常用的ASCII字符,即數(shù)字0~9、英文字母A~Z、a~z以及+、-、*、/等常用符號,還可以表示如漢字、拉丁語、希臘語等其他語言文字。
          ??? 標識符是由字母、數(shù)字、下劃線(_)、美元符($)組成的、必須以字母、下劃線或美元符開頭的、字符個數(shù)有限的字符序列。如i、count、myStack、GetValue、_length等都是合法的標識符。Java語言在定義標識符時,其字母符號區(qū)分大小寫(或稱是大小寫敏感的),所以count、Count、COUNT表示不同的標識符。標識符可以用來命名變量名、常量名、類名等。
          ??? Java語言中有固定含義的標識符稱作關(guān)鍵字。用戶不允許用關(guān)鍵字定義標識符。Java語言中的關(guān)鍵字共有47個,如下表所示。

          abstract?? boolean??? break??????? byte????? case?????? catch
          char?????? class????? continue?????default?? do???????? double
          else?????? extends??? false??????? final???? finally??? float
          for??????? if???????? implements??import??? instanceof?int
          interface?long?????? native?????? new?????? null?????? package
          private??? protected?public?????? return??? short????? static
          super????? switch???? synchronized?this????? throw????? throws
          transient?true?????? try????????? void????? while
          注:goto也是保留的關(guān)鍵字,雖然不能在java中使用?
          ?

          2、變量和常量

          ??? 程序通常要處理數(shù)據(jù),處理數(shù)據(jù)首先要保存數(shù)據(jù)。程序中要保存的數(shù)據(jù)都需要系統(tǒng)分配內(nèi)存空間。變量和常量都需要系統(tǒng)分配內(nèi)存空間。

          變量:
          ??? 變量是一個保存數(shù)據(jù)的內(nèi)存區(qū)域的名字。變量在使用時必須先定義(或稱聲明),然后才能用賦值語句(或其他形式)來為其賦值。
          ??? 變量定義是指示編譯器為特定數(shù)據(jù)類型的數(shù)值保存在內(nèi)存中分配適當?shù)膬?nèi)存空間。這樣,在隨后的程序中就可以用賦值語句(或其他形式,如在變量定義時直接給出初始值)為該變量賦值。變量名的命名必須符合2.1節(jié)所說的標識符的命名規(guī)定。
          ??? 變量聲明的格式為:
          ??? <數(shù)據(jù)類型名><變量名表>;
          ??? 隨著程序規(guī)模的擴大,經(jīng)常是多人合作完成一個程序的編寫。為了防止變量使用的混亂,變量的使用范圍是受限的,每個變量只在自己的使用范圍內(nèi)有效。變量的使用范圍稱作變量的作用域。變量的使用范圍是定義該變量的程序塊。
          ?
          【例2.1】關(guān)于變量作用域的示例
          public class Example2_1
          {
          ??? public static void main(String args[])
          ??? {
          ??????? int i = 10, j;
          ??????? j? = 20;
          ???????? {
          ??????????? int k = 100;
          ??????????? System.out.println("k = " + k );
          ??????? }
          //????? System.out.println("i = " + i + "? j = " + j + "??? k = " + k);?
          ??????? System.out.println("i = " + i + "??j = " + j );
          ??? }
          }

          程序運行結(jié)果:
          ?k = 100
          ?i = 10?j = 20

          ??? 程序說明:
          ??? 在main函數(shù)中,定義了int類型的變量i和j,變量i在定義時給了初始化值10,變量j隨后用賦值語句賦了數(shù)值20。在此程序塊中,輸出語句輸出了變量i和j的當前數(shù)值。在下一層程序塊(即下一層的花括號所括的范圍)內(nèi),又定義了int類型的變量k,由于此變量k的作用范圍只限于下一層程序塊內(nèi),所以輸出語句中如果包括了變量k(即如果使用了注釋掉的語句),則編譯器將指示錯誤。
          ??? 在程序設(shè)計中,例子中所示的程序塊形式并不多見。常見的程序塊形式是if語句、while語句、for語句等后面跟隨的一對花括號。以此類推,可以知道,在一個函數(shù)中定義的變量只在該函數(shù)內(nèi)有效。

          常量:
          ??? 在程序設(shè)計中,有時需要定義一個變量,并要求該變量在整個程序運行期間保持不變,這種在整個程序運行期間保持不變的變量稱作常量。常量也是一種標識符,所以定義常量時也要符合標識符的規(guī)定。
          ??? 定義常量的方法是在定義變量的語句最前面加上關(guān)鍵字final
          ??? 和變量類同,常量定義也是指示編譯器為特定數(shù)據(jù)類型的數(shù)值保存在內(nèi)存中分配適當?shù)膬?nèi)存空間。常量和變量惟一的不同之處是,常量只允許在定義時給出其數(shù)值,并不允許在隨后的程序中改變其數(shù)值。在習(xí)慣上,常量名通常為全大寫字母。例如:final int MAXSIZE = 100; 就定義了常量MAXSIZE等于100。
          ?
          ?
          3、基本數(shù)據(jù)類型

          ??? 數(shù)據(jù)類型規(guī)定了一類數(shù)據(jù)的數(shù)據(jù)位長度(或稱字符個數(shù))、取值范圍以及對該類數(shù)據(jù)所能進行的操作。
          ??? Java語言中共定義了8種基本數(shù)據(jù)類型,其中4種為整型數(shù),2種為浮點型數(shù),1種為字符型數(shù),1種為布爾型數(shù)。數(shù)據(jù)類型不同,所定義的變量占用的內(nèi)存空間、取值范圍以及對該類數(shù)據(jù)所能進行的操作也不同。
          ??? Java語言定義的8種基本數(shù)據(jù)類型及相應(yīng)的關(guān)鍵字如下:
          ??? 型:byte 、short、 int、 long
          ??浮點型:float、double
          ??邏輯型:boolean
          ??字符型:char

          1.整型
          ??? 整型數(shù)是零和有限范圍的正整數(shù)和負整數(shù)。由于4種不同整型數(shù)的數(shù)據(jù)位不同,所以相應(yīng)的正整數(shù)和負整數(shù)的范圍也不同。
          ??? Java的整數(shù)類型
          ??? 類型???????? 數(shù)據(jù)位?????數(shù)值范圍
          ??? 字節(jié)型byte???8?bits???? -128——127(即-2^7——2^7-1)
          ??? 短整型short?16 bits???? -32768——32767(即-2^15——2^15-1)
          ??? ? int????32 bits???? -2147483648——2147483647(即-2^31——2^31-1)
          ??? 長整型long?? 64 bits???? -9223372036854775808——9223372036854775807(即-2^63——2^63-1)

          ??? Java的整型數(shù)可以表示為十進制、八進制或十六進制。具體表示方法為:
          ??十進制:用若干個0~9之間的數(shù)字表示,并規(guī)定首位不能為0,如123。
          ??八進制:以0打頭,后跟若干個0~7之間的數(shù)字,如0123。
          ??十六進制:以0x或0X打頭,后跟若干個0~9之間的數(shù)字以及a~f之間的小寫字母或A~F之間的大寫字母,a~f或A~F分別表示數(shù)值10~15,如0X123E。
          ??? 注:字面值是在程序中用到的顯式數(shù)據(jù)值,如123就是一個字面值。
          ??????? Java語言規(guī)定,所有的整型字面值都隱含為int型。
          ??????? 若要將一個整數(shù)字面值明確地表示為long型時,需在后面加L或l,如21474836470L或12345l。

          2.浮點型
          ??? 浮點型數(shù)由整數(shù)部分和小數(shù)部分組成。浮點型數(shù)用來表示實數(shù)。浮點數(shù)有兩種表示方式:
          ??標準記數(shù)法:由整數(shù)部分、小數(shù)點和小數(shù)部分構(gòu)成。如123.123,123.0。
          ??科學(xué)記數(shù)法:由整數(shù)、小數(shù)點、小數(shù)和指數(shù)部分構(gòu)成,指數(shù)部分由一個e或E后跟帶正負號的整數(shù)表示。如123.123用科學(xué)記數(shù)法可表示為1.23123E+2。需要注意的是,科學(xué)記數(shù)法中,一個浮點型數(shù)的整數(shù)部分不一定是小數(shù)點前的整數(shù)。
          ??? 浮點型數(shù)可以表示精度很高的或帶有小數(shù)部分的數(shù)值。當一個變量要保存此類數(shù)值時,該變量必須定義為浮點型變量。
          ??? Java語言的浮點型有float和double兩種。浮點數(shù)類型的類型、數(shù)據(jù)位和數(shù)值范圍如下:
          ??? Java的浮點數(shù)類型
          ??? 類型????????????數(shù)據(jù)位???數(shù)值范圍
          ??? 單精度浮點float?? 32 bits?? 3.4e-038——3.4e+038
          ??? 雙精度浮點double?64 bits?? 1.7e-308——1.7e+308

          ??? Java語言規(guī)定,所有的浮點型字面值都隱含為double型。若要將一個浮點型字面值明確地表示為float型時,需在后面加F或f,如123.123F或1.23123E+2f。
          ??? 在定義變量時,對于整型變量或浮點型變量,要認真分析變量可能的取值范圍,并選擇合適的數(shù)據(jù)類型來定義變量,以免造成內(nèi)存空間浪費,或由于超出數(shù)值范圍或數(shù)值精度不夠而造成出錯。例如,如果一個變量的取值為確定的1到1000,則該變量應(yīng)定義成short類型。又例如,如果一個變量的可能取值無法準確估計,則應(yīng)按該變量可能的最大數(shù)值、并保留相當?shù)膶捲3潭葋磉x擇該變量的數(shù)據(jù)類型。
          ?
          3.邏輯型
          ??? 邏輯型用來定義保存邏輯值的變量。邏輯型也稱為布爾型。邏輯值只有真(true)和假(false)兩個值。
          ??? 所有邏輯運算(如a<b)的運算結(jié)果值都是邏輯值,如當a = 4,b = 6時,邏輯運算a<b的結(jié)果值就是true。
          ??? 邏輯型數(shù)值主要用在流程控制語句中的條件表達式,如if、while、for等語句的條件表達式都是邏輯型數(shù)值。
          ?
          4.字符型
          ??? Java語言中,一個Unicode標準下的編碼稱作一個字符。Unicode標準用16位編碼表示一個字符。字符型用來表示字符型變量和字符型字面值。
          ??? Java語言中,字符型字面值用一對單引號括起來,如'a''A''#'等都是字符型字面值。由于一些控制字符不能在屏幕上直接顯示,以及字符串中特殊符號的表示等問題,需要有特殊方法表示這些符號。不能直接顯示的控制字符字面值、或字符串中特殊符號表示使用轉(zhuǎn)義字符的表示方法。
          ??? 轉(zhuǎn)義字符類型
          ??? 轉(zhuǎn)義字符???含義
          ??? \n???????? 換行,將光標移至下一行的開始
          ??? \t???????? 水平制表,將光標移至下個制表符位置
          ??? \r???????? 回車,將光標移至當前行的開始
          ??? \\???????? 反斜杠,輸出一個反斜杠
          ??? \’??????? 單引號,輸出一個單引號
          ??? \”??????? 雙引號,輸出一個雙引號

          ??? 如系統(tǒng)標準輸出語句System.out.print()表示輸出字符串后不換行,下面的輸出語句:
          ??? System.out.print("Hello!\n");表示輸出字符串"Hello!"后換行。
          ?
          ?
          4、賦值語句

          ??? 賦值語句的語法形式是:
          ??? <變量> = <表達式>;
          ??? 賦值語句中,等號(稱作賦值號)是賦值語句的標識,<表達式>可以是一個常量,或另一個已賦過值的變量,或是由運算符組成的一個表達式。是把一個常量或另一個已賦過值的變量中的數(shù)值賦給另一個變量。當一個變量被用賦值語句重新賦值時,該變量原先的賦值就被沖掉了,即該變量原先的賦值就沒有了。
          ??? Java語言是一種強類型語言,所謂強類型語言是指數(shù)據(jù)類型的匹配要求十分嚴格。如果一個表達式的數(shù)據(jù)類型不一致等問題出現(xiàn),則編譯器給出類型不一致的出錯信息。關(guān)于賦值語句的類型匹配有以下兩種情況:
          ??? (1)類型相同。類型相同是指賦值號左端的數(shù)據(jù)類型和賦值號右端的數(shù)據(jù)類型完全一致。此種情況可以正確賦值。例如:
          ???????? int?smallValue =100;???//類型相同
          ???????? long bigValue?? = 100L;???//類型相同
          ??? (2)類型兼容。類型兼容是指賦值號左端的數(shù)據(jù)類型比賦值號右端的數(shù)據(jù)類型長。此時系統(tǒng)會自動將賦值號右端的數(shù)據(jù)類型轉(zhuǎn)化成和賦值號左端一樣的數(shù)據(jù)類型。這里所說的數(shù)據(jù)類型長,是指數(shù)據(jù)類型的位數(shù)長,如long類型就比int類型的位數(shù)長。例如:
          ???????? long bigval = 100;???//100是int類型,將自動轉(zhuǎn)化為100L
          ???????? double x = 12.345F;???//12.345F是float類型,將自動轉(zhuǎn)化為12.345
          ??? (3)類型不兼容若賦值號右端的數(shù)據(jù)類型比賦值號左端的數(shù)據(jù)類型長則類型不兼容。此時系統(tǒng)在編譯時會產(chǎn)生“可能存在精度損失”的編譯錯誤。例如:
          ???????? int smallValuel = 100L;??// 100L 是long類型,不兼容
          ???????? float x = 12.345;??????? //12.345是double類型,不兼容
          ??? 當出現(xiàn)類型不兼容錯誤時,有兩種解決方法:
          ??重新定義賦值號左端變量的數(shù)據(jù)類型,使之變成滿足要求的較長的數(shù)據(jù)類型。
          ??強制類型轉(zhuǎn)換方法把賦值號右端的數(shù)據(jù)類型轉(zhuǎn)換成和賦值號左端相同的數(shù)據(jù)類型。但要注意,強制類型轉(zhuǎn)換可能丟失數(shù)據(jù)或損失數(shù)據(jù)的精度。
          ??? 強制類型轉(zhuǎn)換的格式為:
          ??? (<目標類型>)<表達式>
          ??? 例如:
          ??? int i;
          ??? long k = 100L;
          ??? i = (int) k; ???//把變量k中的數(shù)值強制轉(zhuǎn)換成int類型后賦給變量i

          ?
          5、運算符和表達式

          ??? 在Java語言之前,C語言和C++語言是最為廣泛使用的高級程序設(shè)計語言,為了使Java語言能盡快被程序設(shè)計人員接受,Java語言設(shè)計者采用了把基本關(guān)鍵字和基本語句設(shè)計成和C/C++語言相同形式的方法。因此,對于已經(jīng)掌握C\C++語言的人來說,Java語言在基本關(guān)鍵字、運算符、表達式、賦值語句、流程控制語句等方面,是和C/C++語言基本相同的。
          ??? Java的運算符可分為4類:算術(shù)運算符、關(guān)系運算符、邏輯運算符和位運算符
          ?
          1.算術(shù)運算符
          ??? Java的算術(shù)運算符分為一元運算符和二元運算符。一元運算符只有一個操作數(shù);二元運算符有兩個操作數(shù),運算符位于兩個操作數(shù)之間。算術(shù)運算符的操作數(shù)必須是數(shù)值類型。
          ??? (1)一元運算符:
          ??? 一元運算符有:正(+)、負(-)、加1(++)和減1(--)4個。
          ??? 加1、減1運算符只允許用于數(shù)值類型的變量,不允許用于表達式中。加1、減1運算符既可放在變量之前(如++i),也可放在變量之后(如i++),兩者的差別是:如果放在變量之前(如++i),則變量值先加1或減1,然后進行其他相應(yīng)的操作(主要是賦值操作);如果放在變量之后(如i++),則先進行其他相應(yīng)的操作,然后再進行變量值加1或減1。
          ??? 例如:
          ??? int i=6,j,k,m,n;
          ??? j = +i;????//取原值,即j=6
          ??? k = -i;????//取負值,即k=-6
          ??? m = i++;????//先m=i,再i=i+1,即m=6,i=7
          ??? m = ++i;????//先i=i+1,再m=i,即i=7,m=7
          ??? n = j--;????//先n=j,再j=j-1,即n=6,j=5
          ??? n = --j;????//先j=j-1,再n=j,即j=5,n=5
          ??? 在書寫時還要注意的是:一元運算符與其前后的操作數(shù)之間不允許有空格,否則編譯時會出錯。
          ??? (2)二元運算符
          ??? 二元運算符有:加(+)、減(-)、乘(*)、除(/)、取余(%)。其中+、-、*、/完成加、減、乘、除四則運算,%是求兩個操作數(shù)相除后的余數(shù)。
          ?
          ??? %求余操作舉例:
          ??? a % b = a - (a / b) * b
          ??? 取余運算符既可用于兩個操作數(shù)都是整數(shù)的情況,也可用于兩個操作數(shù)都是浮點數(shù)(或一個操作數(shù)是浮點數(shù))的情況。當兩個操作數(shù)都是浮點數(shù)時,例如7.6 % 2.9時,計算結(jié)果為:7.6 - 2 * 2.9 = 1.8。
          ??? 當兩個操作數(shù)都是int類型數(shù)時,a%b的計算公式為:
          ??? a % b = a - (int)(a / b) * b
          ??? 當兩個操作數(shù)都是long類型(或其他整數(shù)類型)數(shù)時,a%b的計算公式可以類推。

          ??? 當參加二元運算的兩個操作數(shù)的數(shù)據(jù)類型不同時,所得結(jié)果的數(shù)據(jù)類型與精度較高(或位數(shù)更長)的那種數(shù)據(jù)類型一致。
          ?
          ??? 例如:
          ????7 / 3???? //整除,運算結(jié)果為2
          ??? 7.0 / 3???//除法,運算結(jié)果為2.33333,即結(jié)果與精度較高的類型一致
          ??? 7 % 3???? //取余,運算結(jié)果為1
          ??? 7.0 % 3???//取余,運算結(jié)果為1.0
          ??? -7 % 3???//取余,運算結(jié)果為-1,即運算結(jié)果的符號與左操作數(shù)相同
          ??? 7 % -3???//取余,運算結(jié)果為1,即運算結(jié)果的符號與左操作數(shù)相同

          2.關(guān)系運算符
          ??? 關(guān)系運算符用于比較兩個數(shù)值之間的大小,其運算結(jié)果為一個邏輯類型的數(shù)值。關(guān)系運算符有六個:等于(==)、不等于(!=)、大于(>)、大于等于(>=)、小于(<)、小于等于(<=)。
          ?
          ??? 例如:
          ??? 9 <= 8????? //運算結(jié)果為false
          ??? 9.9 >= 8.8??//運算結(jié)果為true
          ????'A' <?'a' ??//運算結(jié)果為true,因字符'A'的Unicode編碼值小于字符'a'
          ??? 要說明的是,對于大于等于(或小于等于)關(guān)系運算符來說,只有大于和等于兩種關(guān)系運算都不成立時其結(jié)果值才為false,只要有一種(大于或等于)關(guān)系運算成立其結(jié)果值即為true。例如,對于9 <= 8,9既不小于8也不等于8,所以9 <= 8?的運算結(jié)果為false。對于9 >= 9,因9等于9,所以9 >= 9的運算結(jié)果為true。
          ?
          3.邏輯運算符
          ??? 邏輯運算符要求操作數(shù)的數(shù)據(jù)類型為邏輯型,其運算結(jié)果也是邏輯型值。邏輯運算符有:邏輯與(&&)、邏輯或(||)、邏輯非(!)、邏輯異或(^)、邏輯與(&)、邏輯或(|)。
          ??? 真值表是表示邏輯運算功能的一種直觀方法,其具體方法是把邏輯運算的所有可能值用表格形式全部羅列出來。Java語言邏輯運算符的真值表如下:
          ??? 邏輯運算符的真值表
          ??? A????? B????? A&&B?? A||B ?!A???? A^B??? A&B??? A|B
          ??? false?false?false?false?true?? false?false?false
          ??? true?? false?false?true?false?true?? false?true
          ??? false?true?? false?true?true?? true?? false?true
          ??? true?? true?? true?? true?false?false?true?? true

          ??? 前兩列是參與邏輯運算的兩個邏輯變量,共有4種可能,所以表2.5共有4行。后6列分別是6個邏輯運算符在邏輯變量A和邏輯變量B取不同數(shù)值時的運算結(jié)果值。
          ??? 要說明的是,兩種邏輯與(&&和&)的運算規(guī)則基本相同,兩種邏輯或(||和|)的運算規(guī)則也基本相同。其區(qū)別是:&和|運算是把邏輯表達式全部計算完,而&&和||運算具有短路計算功能。所謂短路計算,是指系統(tǒng)從左至右進行邏輯表達式的計算,一旦出現(xiàn)計算結(jié)果已經(jīng)確定的情況,則計算過程即被終止。對于&&運算來說,只要運算符左端的值為false,則因無論運算符右端的值為true或為false,其最終結(jié)果都為false。所以,系統(tǒng)一旦判斷出&&運算符左端的值為false,則系統(tǒng)將終止其后的計算過程;對于 || 運算來說,只要運算符左端的值為true,則因無論運算符右端的值為true或為false,其最終結(jié)果都為true。所以,系統(tǒng)一旦判斷出|| 運算符左端的值為true,則系統(tǒng)將終止其后的計算過程。
          ?
          ??? 例如,有如下邏輯表達式:
          ??? (i>=1) && (i<=100)
          ??? 此時,若i等于0,則系統(tǒng)判斷出i>=1的計算結(jié)果為false后,系統(tǒng)馬上得出該邏輯表達式的最終計算結(jié)果為false,因此,系統(tǒng)不繼續(xù)判斷i<=100的值。短路計算功能可以提高程序的運行速度。
          ??? 作者建議讀者:在程序設(shè)計時使用&&和||運算符,不使用&和|運算符。

          ??? 用邏輯與(&&)、邏輯或(||)和邏輯非(!)可以組合出各種可能的邏輯表達式。邏輯表達式主要用在 if、while等語句的條件組合上。
          ??? 例如:
          ??? int i = 1;
          ??? while(i>=1) && (i<=100) i++;????//循環(huán)過程
          ??? 上述程序段的循環(huán)過程將i++語句循環(huán)執(zhí)行100次。

          ?
          4.位運算符
          ??? 位運算是以二進制位為單位進行的運算,其操作數(shù)和運算結(jié)果都是整型值。
          ??? 位運算符共有7個,分別是:位與(&)、位或(|)、位非(~)、位異或(^)、右移(>>)、左移(<<)、0填充的右移(>>>)。
          ??? 位運算的位與(&)、位或(|)、位非(~)、位異或(^)與邏輯運算的相應(yīng)操作的真值表完全相同,其差別只是位運算操作的操作數(shù)和運算結(jié)果都是二進制整數(shù),而邏輯運算相應(yīng)操作的操作數(shù)和運算結(jié)果都是邏輯值。
          ?
          ??? 位運算示例
          ???運算符??名稱???示例????說明
          ??? &?????? 位與??? x&y???? 把x和y按位求與
          ??? |?????? 位或??? x|y???? 把x和y按位求或
          ??? ~?????? 位非??? ~x????? 把x按位求非
          ??? ^?????? 位異或?x^y?????把x和y按位求異或
          ??? >>????? 右移??? x>>y??? 把x的各位右移y位
          ??? <<????? 左移??? x<<y??? 把x的各位左移y位
          ??? >>>???? 右移??? x>>>y?? 把x的各位右移y位,左邊填0

          ??? 舉例說明:
          ??? (1)有如下程序段:
          ??? int x = 64;???//x等于二進制數(shù)的01000000
          ??? int y = 70;???//y等于二進制數(shù)的01000110
          ??? int z = x&y???//z等于二進制數(shù)的01000000
          ??? 即運算結(jié)果為z等于二進制數(shù)01000000。位或、位非、位異或的運算方法類同。
          ??? (2)右移是將一個二進制數(shù)按指定移動的位數(shù)向右移位,移掉的被丟棄,左邊移進的部分或者補0(當該數(shù)為正時),或者補1(當該數(shù)為負時)。這是因為整數(shù)在機器內(nèi)部采用補碼表示法,正數(shù)的符號位為0,負數(shù)的符號位為1。例如,對于如下程序段:
          ??? int x = 70;???//x等于二進制數(shù)的01000110
          ??? int y = 2;
          ??? int z = x>>y??//z等于二進制數(shù)的00010001
          ??? 即運算結(jié)果為z等于二進制數(shù)00010001,即z等于十進制數(shù)17。
          ??? 對于如下程序段:
          ??? int x = -70;??//x等于二進制數(shù)的11000110
          ??? int y = 2;
          ??? int z = x>>y??//z等于二進制數(shù)的11101110
          ??? 即運算結(jié)果為z等于二進制數(shù)11101110,即z等于十進制數(shù)-18。要透徹理解右移和左移操作,讀者需要掌握整數(shù)機器數(shù)的補碼表示法。
          ??? (3)0填充的右移(>>>)是不論被移動數(shù)是正數(shù)還是負數(shù),左邊移進的部分一律補0。

          ?
          5.其他運算符

          ??? (1)賦值運算符與其他運算符的簡捷使用方式
          ??? 賦值運算符可以與二元算術(shù)運算符、邏輯運算符和位運算符組合成簡捷運算符,從而可以簡化一些常用表達式的書寫。
          ??? 賦值運算符與其他運算符的簡捷使用方式
          ???運算符?用法???等價于??? 說明
          ??? +=???? s+=i????s=s+i???? s,i是數(shù)值型
          ??? -=???? s-=i????s=s-i???? s,i是數(shù)值型
          ??? *=???? s*=i????s=s*i???? s,i是數(shù)值型
          ??? /=???? s/=i????s=s/i???? s,i是數(shù)值型
          ??? %=???? s%=i????s=s%i???? s,i是數(shù)值型
          ??? &=???? a&=b????a=a&b???? a,b是邏輯型或整型
          ??? |=???? a|=b????a=a|b???? a,b是邏輯型或整型
          ??? ^=???? A^=b????a=a^b???? a,b是邏輯型或整型
          ??? <<=????s<<=i?? s=s<<i????s,i是整型
          ??? >>=????s>>=i?? s=s>>i??? s,i是整型
          ??? >>>=???s>>>=i?s=s>>>i?? s,i是整型

          ??? (2)方括號[]和圓括號()運算符
          ??? 方括號[]是數(shù)組運算符,方括號[]中的數(shù)值是數(shù)組的下標,整個表達式就代表數(shù)組中該下標所在位置的元素值。
          ??? 圓括號()運算符用于改變表達式中運算符的優(yōu)先級。
          ?
          ??? (3)字符串加(+)運算符
          ??? 當操作數(shù)是字符串時,加(+)運算符用來合并兩個字符串;當加(+)運算符的一邊是字符串,另一邊是數(shù)值時,機器將自動將數(shù)值轉(zhuǎn)換為字符串,這種情況在輸出語句中很常見。如對于如下程序段:
          ??? int max = 100;
          ??? System.out.println("max = "+max);
          ??? 計算機屏幕的輸出結(jié)果為:max = 100,即此時是把變量max中的整數(shù)值100轉(zhuǎn)換成字符串100輸出的。
          ?
          ??? (4)條件運算符(?:)
          ??? 條件運算符(?:)的語法形式為:
          ????<表達式1> <表達式2> : <表達式3>
          ??? 條件運算符的運算方法是:先計算<表達式1>的值,當<表達式1>的值為true時,則將<表達式2>的值作為整個表達式的值;當<表達式1>的值為false時,則將<表達式3>的值作為整個表達式的值。如:
          ??? int a=1,b=2,max;
          ??? max = a>b?a:b;???//max等于2
          ?
          ??? (5)強制類型轉(zhuǎn)換符
          ???
          強制類型轉(zhuǎn)換符能將一個表達式的類型強制轉(zhuǎn)換為某一指定數(shù)據(jù)類型,其語法形式為:
          ??? (<類型>)<表達式>
          ?
          ??? (6)對象運算符instanceof
          ??? 對象運算符instanceof用來測試一個指定對象是否是指定類(或它的子類)的實例,若是則返回true,否則返回false。
          ?
          ??? (7)點運算符
          ??? 點運算符“.”的功能有兩個:一是引用類中成員,二是指示包的層次等級。
          ?
          6.運算符的優(yōu)先級
          ??? 以下按優(yōu)先級從高到低的次序列出Java語言中的所有運算符,表中結(jié)合性一列中的“左?右”表示其運算次序為從左向右,“右?左”表示其運算次序為從右向左。

          ??? 優(yōu)先級?運算符?????????????????????????????????????????結(jié)合性
          ??? 1?????? .? []? ()? ;? ,?
          ??? 2?????? ++? ――? +=??!??~? +(一元)?-(一元)??????????????????右?左
          ??? 3?????? *? /? %????????????????????????????????????????????? 左?右
          ??? 4?????? +(二元)??-(二元)????????????????????????????????????? 左?右
          ??? 5?????? <<? >>? >>>????????????????????????????????????????? 左?右
          ??? 6?????? <? >? <=? >=? instanceof???????????????????????????? 左?右
          ??? 7?????? = =? !=????????????????????????????????????????????? 左?右
          ??? 8?????? &??????????????????????????????????????????????????? 左?右
          ??? 9?????? ^??????????????????????????????????????????????????? 左?右
          ??? 10??????|??????????????????????????????????????????????????? 左?右
          ??? 11????? &&?????????????????????????????????????????????????? 左?右
          ??? 12????? ||?????????????????????????????????????????????????? 左?右
          ??? 13????? ?:????????????????????????????????????????????????? 右?左
          ??? 14????? =? *=? /=? %=? +=? -=? <<=? >>=? >>>=? &=? ^=? |=?? 右?左

          ?
          7.表達式
          ??? 用運算符和圓括號把運算對象連接起來的、符合Java語言語法規(guī)則的式子稱作表達式。運算符是算術(shù)運算符的表達式稱作算術(shù)表達式,運算符是關(guān)系運算符的表達式稱作關(guān)系表達式,運算符是邏輯運算符的表達式稱作邏輯表達式,運算符是位運算符的表達式稱作位表達式。算術(shù)表達式中的運算對象必須是數(shù)值量,關(guān)系表達式中的運算對象必須是數(shù)值量,邏輯表達式中的運算對象必須是邏輯量,位表達式中的運算對象必須是整數(shù)數(shù)值量。
          ??? 運算符都有優(yōu)先級,表達式按照運算符的優(yōu)先級進行逐個計算,最后求得整個表達式的值。運算符中圓括號的優(yōu)先級最高,圓括號還可以多層嵌套。在同一級括號內(nèi)(或一個括號也沒有時),表達式按照運算符優(yōu)先級高的先運算、同一運算符優(yōu)先級的按照運算符的結(jié)合性(即從左向右還是從右向左)的次序進行運算。大多數(shù)運算符的結(jié)合性是從左向右,少數(shù)運算符的結(jié)合性(如賦值、條件運算等)是從右向左。
          由于運算對象是有數(shù)據(jù)類型的,所以最終得到的計算結(jié)果也是有數(shù)據(jù)類型的,表達式結(jié)果的數(shù)據(jù)類型不一定和運算對象相同,它還取決于表達式的運算符。如:
          ??? int i=5;
          ??? (i<0)&(i>100)??? //結(jié)果為boolean型?
          ??? (i-2)*8+5??????? //結(jié)果為int型
          ??? "Abcde"+"12345"??//結(jié)果為String型

          ??? Java表達式既可以單獨組成語句,也可出現(xiàn)在循環(huán)語句、條件語句的條件部分,還可以出現(xiàn)在函數(shù)的實際參數(shù)調(diào)用等場合。
          ??? 實際上,從表達式的角度看,整個賦值語句是一個表達式,其運算方法是先計算出賦值運算符右邊的表達式的值(因賦值運算符的優(yōu)先級最低),然后把該值賦給賦值運算符左邊的變量(因賦值運算符的結(jié)合性是先右后左)。
          ??? 最后,我們給出一個例子,用來說明上面討論過的Java語言基本要素。
          ?
          【例2.2】求4x2 + 5x + 1 = 0方程的根。已知b2 – 4ac > 0。
          public class Exam2_2?
          {
          ??? public static void main(String args[])
          ??? {
          ??????? double a = 4, b = 5, c = 1, disc, x1, x2, p, q;
          ??????? disc = b * b - 4 * a * c;
          ??????? p = - b / (2 * a);
          ??????? q = Math.sqrt(disc) / (2 * a);
          ??????? x1 = p + q;
          ??????? x2 = p - q;
          ??????? System.out.println("x1 = " + x1 + "????? x2 = " + x2);
          ??? }
          }
          其中,表達式Math.sqrt()為調(diào)用Math類的sqrt()方法,該表達式完成某個數(shù)的開平方。此例還說明,表達式還可以是某個類的方法調(diào)用(當然,數(shù)據(jù)類型要符合要求)。
          程序運行結(jié)果為:
          x1 = -0.25????? x2 = -1.0
          ?

          6、流程控制語句

          ??? 流程控制語句用來控制程序的執(zhí)行流程。流程控制語句有條件選擇語句、循環(huán)語句和轉(zhuǎn)移語句三種。
          ??? 任何程序的結(jié)構(gòu)都是由三種基本的結(jié)構(gòu)組成的。這三種基本結(jié)構(gòu)是:順序結(jié)構(gòu)、分支結(jié)構(gòu)和循環(huán)結(jié)構(gòu)。在Java程序中,通常一個以分號(;)結(jié)束的符號串稱為一條語句。在順序結(jié)構(gòu)的程序或程序段中,程序是按語句次序、下一條語句接上一條語句順序被執(zhí)行的。
          ??? 在分支結(jié)構(gòu)或循環(huán)結(jié)構(gòu)的程序或程序段中,程序不是按語句次序順序執(zhí)行的,而是按分支結(jié)構(gòu)語句或循環(huán)結(jié)構(gòu)語句所規(guī)定的執(zhí)行流程來執(zhí)行的。為了滿足實際應(yīng)用問題的設(shè)計需要,分支結(jié)構(gòu)和循環(huán)結(jié)構(gòu)有各種各樣的變形。另外,實際的程序設(shè)計中,經(jīng)常需要轉(zhuǎn)移語句與分支語句或循環(huán)語句結(jié)合使用。
          ??? Java語言的流程控制語句有:
          ??分支語句:if,switch
          ??循環(huán)語句:for ,while,do-while
          ??轉(zhuǎn)移語句:break,continue

          ??? 另外,函數(shù)或類的成員函數(shù)在運行結(jié)束后,需要返回原調(diào)用處,并可能需要帶回函數(shù)或成員函數(shù)的返回值,這種流程控制用return語句來實現(xiàn)。
          ?
          1、分支語句

          ??? 分支結(jié)構(gòu)是指程序按照當前的分支條件控制程序流程的執(zhí)行。
          ??? 有:if語句和switch語句
          ??? if語句實現(xiàn)二路分支,switch語句實現(xiàn)多路分支。
          ?
          1.if語句
          ????
          (1)基本的if 語句
          ????if 語句的語法形式為:
          ????if? (<邏輯表達式>)
          ????<語句組1>;
          ????[else?<語句組2>;]

          ??? 其中,邏輯表達式的計算值是一個只可能是true或false的邏輯值。if語句的含義是:當<邏輯表達式>的值為true時,執(zhí)行if 后面的<語句組1>;當<邏輯表達式>的值為false時,執(zhí)行else后面的<語句組2>。當執(zhí)行的語句組中的語句多于一條時,語句組必須用一對花括號“{}”括起來。在Java語言的語法中,一對方括號“[]”括起來的部分,表示該部分(除數(shù)組定義外)是任選的。因此,else語句是任選的,當沒有else語句時,若<邏輯表達式>的值為false時就執(zhí)行if 語句后邊的語句。
          ?
          【例2.3】找出a、b兩個數(shù)中的較大者并輸出。
          方法一:用if-else結(jié)構(gòu)實現(xiàn)。
          public class Exam2_3?
          {
          ??? public static void main(String args[])
          ??? {
          ??????? int a = 5, b = 6, max;
          ??????? if( a > b )
          ??????? {
          ??????????? max = a;
          ??????????? System.out.println("max = " + max);
          ??????? }
          ??????? else
          ??????? {
          ??????????? max = b;
          ??????????? System.out.println("max = " + max);
          ??????? }
          ??? }
          }
          ?
          方法二:用沒有else的if結(jié)構(gòu)實現(xiàn)。
          public class Exam2_3_2?
          {
          ??? public static void main(String args[])
          ??? {
          ??????? int a = 5, b = 6, max;
          ??????? max = a;
          ??????? if( b > a )
          ??????????? max = b;
          ??????? System.out.println("max = " + max);
          ??? }
          }

          例2.3中if語句的邏輯表達式中只有一個條件。當問題復(fù)雜時,if語句的邏輯表達式中的條件可能多于一個,這稱為復(fù)合條件。
          復(fù)合條件需要用邏輯運算符——邏輯與(&&)、邏輯或(||)、邏輯非(!)、邏輯異或(^)等邏輯運算符來組合條件。
          例如下面的if語句條件為,判斷n是否為一個1至100區(qū)間的數(shù):
          if (n >= 1 && n <= 100)
          如果n既大于等于1又小于等于100,則條件為true,否則條件為false。
          ?
          (2)if語句嵌套
          ??? 如果if語句中又包括另一個if語句,則稱為if語句嵌套。
          ??? if (n >= 1)
          ??? {
          ????? if (n <= 100)?……
          ??? }
          ??? else?……

          ??? 在兩個嵌套的if語句中,如果有一個if語句省略了else語句,會產(chǎn)生二義性。如:
          ??? if (n >= 1)
          ??? if (n <= 100)?……
          ??? else?……
          ??? 此時,else是和哪個if語句匹配容易產(chǎn)生混淆。Java語言規(guī)定:else總是與最近的一個if語句匹配。
          ??? 所以此處else應(yīng)理解為是與第二個if語句匹配(注意:書寫的縮進格式與匹配無關(guān))。如果要求else是與第一個if語句匹配,則程序應(yīng)寫為:
          ??? 一個if語句可以有兩個分支,利用if語句嵌套可以組合出多于兩個的分支。

          【例2.4】找出三個整數(shù)中的最大數(shù)并輸出。
          方法一:用if語句嵌套方法。
          public class Exam2_4
          {
          ??? public static void main(String args[])
          ??? {
          ??????? int a = 3, b = 1, c = 2, max;
          ?
          ??????? if(a < b)
          ??????????? if (b < c)
          ??????????????? max = c;
          ??????????? else
          ??????????????? max = b;
          ??????? else
          ??????????? if (a < c)
          ??????????????? max = c;
          ??????????? else
          ??????????????? max = a;
          ??????? System.out.println("max = " + max);
          ??? }
          }
          程序運行結(jié)果:
          max = 3

          方法二:用條件的邏輯組合方法。
          public class Exam2_4_2
          {
          ??? public static void main(String args[])
          ??? {
          ??????? int a = 3, b = 1, c = 2, max;
          ?
          ??????? if(a < b && b < c)
          ??????????? max = c;
          ??????? else if(a < b && c < b)
          ??????????? max = b;
          ??????? else if (a > b && a < c)
          ??????????? max = c;
          ??????? else???????????????????????//即(a > b && a > c)
          ??????????? max = a;
          ??????? System.out.println("max = " + max);
          ??? }
          }
          說明:條件兩兩組合,所以條件的邏輯組合共有四種情況。此問題可不考慮兩個數(shù)相等的情況。
          ?

          2.switch語句
          ??? switch語句是多個分支的流程控制語句
          ??? 語法形式為:
          ??? switch (<表達式>)
          ??? {
          ??? case<常量1>:<語句組1>;
          ????????[break;]
          ??? case<常量2>:<語句組2>;
          ????????[break;]
          ??? ……;
          ??? [default;<語句組>]
          ??? }

          ??? 其中switch、case 、default是關(guān)鍵字,default語句是任選的。
          ??? switch語句的語義是:將<表達式>的值按照從上至下的順序與case語句中給出的常量值進行比較,當表達式的值與某個case語句中的常量值相等時,就執(zhí)行相應(yīng)case后的語句序列;若沒有一個常量值與表達式的值相等,則執(zhí)行default語句。如果沒有default語句,并且表達式與所有case的常量都不相等時,則不做任何操作。
          ??? switch表達式和case常量值的類型可以是byte、short、int、long和char,但不能為boolean,并且要求兩者的數(shù)據(jù)類型必須一致。
          ?
          3.switch語句中的break語句
          ??? switch語句本身并不能保證執(zhí)行完一組case后的語句或語句組后,跳過隨后的case判斷,通常情況下,此時需要用break語句來跳過隨后的case語句。
          ??? break語句的語法形式是:
          ??? break;
          ??? switch語句中的break語句的語義是:跳過break語句所在位置隨后所有的case語句,即結(jié)束switch語句的執(zhí)行。

          【例2.5】?? 把數(shù)值表示的星期轉(zhuǎn)換成相應(yīng)的英文表示并顯示。
          public class Exam2_5
          {
          ??? public static void main(String args[])
          ??? {
          ??????? int week = 5;
          ??????? System.out.print("week = " + week + "?? ");
          ??????? switch (week)
          ??????? {
          ??????????? case 0: System.out.println("Sunday");?? break;
          ??????????? case 1: System.out.println("Monday");?? break;
          ??????????? case 2: System.out.println("Tuesday");? break;
          ??????????? case 3: System.out.println("Wednesday");break;
          ??????????? case 4: System.out.println("Thursday"); break;
          ??????????? case 5: System.out.println("Friday");?? break;
          ??????????? case 6: System.out.println("Saturday"); break;
          ??????????? default: System.out.println("Data Error!");
          ??????? }
          ??? }
          }
          程序運行結(jié)果:
          week = 5?? Friday

          ?
          2、循環(huán)語句

          ??? 循環(huán)結(jié)構(gòu)是指程序按照當前的循環(huán)條件控制程序流程的執(zhí)行。Java語言有三種循環(huán)結(jié)構(gòu)的語句:for語句、while語句和do-while語句。這三種循環(huán)語句雖然控制循環(huán)的方式不同,但實現(xiàn)循環(huán)的功能相同。換句話說,對于任何一個循環(huán)問題,這三種循環(huán)語句都可以實現(xiàn)。但是,不同的循環(huán)問題,使用這三種循環(huán)語句的簡便程度不同。因此,一個好的程序設(shè)計者,應(yīng)該學(xué)會針對不同的循環(huán)問題,選擇最簡便的循環(huán)語句。
          ?
          1.for語句
          ??? for語句的語法形式為:
          ??? for ([<表達式1>];[<表達式2>];[<表達式3>])
          ????<循環(huán)體>;

          ??? for語句的語義是:首先計算<表達式1>的值,然后計算<表達式2>的值,如果<表達式2>值為true時,執(zhí)行一次<循環(huán)體>,再計算<表達式3>的值,并進行下一次循環(huán)過程;當<表達式2>的值為false時,循環(huán)過程結(jié)束。
          ??? 在for語句中,<表達式1>是給循環(huán)變量賦初值,因此,<表達式1>通常是一個賦值表達式;<表達式2>是給出循環(huán)結(jié)束條件,因此,<表達式2>必須是一個關(guān)系表達式或邏輯表達式;<表達式3>是改變循環(huán)變量,因此,<表達式3>必須是一個賦值表達式(或類似i++形式的改變變量i的數(shù)值的語句);<循環(huán)體>可以是一條語句,也可以是多條語句,當為多條語句時,必須用一對花括號“{}”括起來。
          ??? 說明:無論是<表達式1>還是<表達式2>或者是<表達式3>,都可以任選。
          ?
          【例2.6】?? 求1到10的累加和。
          for語句最適合于循環(huán)次數(shù)已知的循環(huán)結(jié)構(gòu)。此問題的循環(huán)次數(shù)已知,因此,此問題適合于用for語句實現(xiàn)。
          public class Exam2_6
          {
          ??? public static void main(String args[])
          ??? {
          ??????? int i, n = 10, sum = 0;
          ???????
          ??????? for(i = 1; i <= n; i++)
          ??????????? sum = sum + i;
          ??????? System.out.println("Sum = " + sum);
          ??? }
          }
          程序運行結(jié)果為:
          Sum = 55
          上述for語句循環(huán)過程也可以設(shè)計成遞減形式的,此時的for語句為:
          for(i = n; i >= 1; i--)
          sum = sum + i;

          2.while語句
          ??? while語句的語法形式為:
          ?? ?while (<邏輯表達式>)
          ????<循環(huán)體>;

          ??? while語句的語義是:如果<邏輯表達式>的計算結(jié)果為true時,則執(zhí)行循環(huán)體;如果<邏輯表達式>的計算結(jié)果為false時,則結(jié)束while語句的執(zhí)行。同樣,當<循環(huán)體>中的語句多于一條時,需要用一對花括號“{}”括起來。
          ??? 例如用while語句實現(xiàn)求1到10累加和的程序段如下:
          ??? int i = 1,n = 10,sum = 0;
          ??? while (i <= n)
          ??? {
          ??????? sum = sum + i;
          ??????? i++;
          ??? }

          ??? 和for語句相比,while語句循環(huán)中的循環(huán)變量賦初值(i = 1)、循環(huán)過程結(jié)束判斷(i <= n)和循環(huán)變量修改(i++)三個部分都有,只是放在了不同的地方。
          ??? 在while語句的循環(huán)結(jié)構(gòu)中,初學(xué)者最容易犯的一個錯誤是,忘記在循環(huán)體中修改循環(huán)變量的值,此時循環(huán)過程將永不結(jié)束,俗稱為“死循環(huán)”。如上面的程序段中如果沒有i++語句,則循環(huán)過程將永不結(jié)束。
          ??? 死循環(huán)的另一種情況是,循環(huán)結(jié)束條件永遠無法滿足。例如:
          ??? int i = 1,n = 10,sum = 0;
          ??? while (i >= 0)
          ??? {
          ???? ?? sum = sum + i;
          ??????? i++;
          ??? }

          ??? 上述程序段的循環(huán)體中雖然有i++語句改變循環(huán)變量i的值,但i值的變化永遠都滿足i >= 0,即循環(huán)結(jié)束條件永遠不會滿足,因此造成死循環(huán)。
          ??? while語句適合于循環(huán)次數(shù)不確定的情況。如上所示,雖然while語句也可以用來構(gòu)造循環(huán)次數(shù)已知的循環(huán)過程,但是,很顯然,此種情況用for語句構(gòu)造循環(huán)過程更簡單、更明了一些。
          ?
          【例2.7】求兩個不為0的正整數(shù)的最大公約數(shù)。
          對于求兩個不為0的正整數(shù)的最大公約數(shù)問題,歐幾里德提出了輾轉(zhuǎn)相除算法,其算法思想是:
          (1)令m為兩個整數(shù)中的較大者,n為兩個整數(shù)中的較小者;
          (2)用m除以n,令r為m除以n的余數(shù);
          (3)若r不等于0,則令m等于n,n等于r,返回步驟(2)繼續(xù);若r等于0,則n中的數(shù)值就是兩個整數(shù)的最大公約數(shù)。
          從上述算法思想可知,該算法是一個循環(huán)過程,并且該循環(huán)過程的循環(huán)次數(shù)事先無法知道,因此,該問題適合于用while語句構(gòu)造循環(huán)過程。
          public class Exam2_7
          {
          public static void main(String args[])
          {
          int m = 48, n = 32, r = 0, temp;
          ???????
          ??????? ?if(m <= 0 || n <= 0)
          ??????? ?{
          ????????? ?System.out.println("數(shù)據(jù)錯誤!");
          ??????????? ?return;
          ??????? ?}
          ???????
          ??????? ?if(m < n)????????????????????? ?//保證m >= n
          {
          ???? ??temp = m;
          ???? ??m = n;
          ???? ??n = temp;
          ??}
          ?
          ??r = m % n;????????????????????? ?//循環(huán)初始化
          ??while(r != 0)????????????? ?//循環(huán)條件判斷
          ??{
          ???? ??m = n;
          ???? ??n = r;
          ???? ??r = m % n;????????? ???//循環(huán)變量修改
          ??}
          ?
          ??????? ?System.out.print("最大公約數(shù) = " + n);
          ??? ?}
          }
          程序運行結(jié)果:
          最大公約數(shù) = 16
          當然,上面程序中的循環(huán)過程也可以用for語句構(gòu)造,用for語句構(gòu)造循環(huán)過程相應(yīng)的程序段如下:
          for(r = m % n; r != 0; r = m % n)???? //for循環(huán)????
          {
          ??? m = n;
          ??? n = r;???
          }

          for語句的循環(huán)過程中,也必須有循環(huán)初始化(r = m % n)、循環(huán)條件判斷(r != 0)和循環(huán)變量修改(r = m % n),只是處于不同的位置而已。顯然,在循環(huán)次數(shù)不知時,用for語句構(gòu)造的循環(huán)過程不及用while語句構(gòu)造的循環(huán)過程清晰。
          ?
          3.do-while語句
          ??? do-while語句的語法形式為:
          ??? do
          ??? {
          ????????<語句組>;
          ??? }? while (<邏輯表達式>)?;

          ??? do-while語句的語義是:首先執(zhí)行語句組(或稱循環(huán)體),然后計算<邏輯表達式>的值,當<邏輯表達式>的值為true時,執(zhí)行一次循環(huán)體;當<邏輯表達式>的值為false時,結(jié)束循環(huán)。
          ??? 從語義看,do-while語句和while語句的惟一差別是:do-while語句至少執(zhí)行一次循環(huán)體(因其結(jié)束條件判斷在后面進行);而對于while語句來說,當一開始循環(huán)條件就不滿足時,循環(huán)體將一次也不執(zhí)行。
          ??? 例2.7求最大公約數(shù)程序的循環(huán)部分也可以用do-while語句構(gòu)造。用do-while語句的相應(yīng)程序段如下:
          ??? r = m % n;??????????????//循環(huán)初始化
          ??? if(r != 0)??????????????//判斷初始時r是否為0
          ??? ??? do???
          ??? ??? {
          ??? ??????? m = n;
          ??? ??????? n = r;
          ??? ??????? r = m % n;??????//循環(huán)變量修改????????
          ??? } while(r != 0);??????? //循環(huán)結(jié)束條件判斷

          ??? 由于語句r = m % n的計算結(jié)果可能使r等于0,而do語句在第一次執(zhí)行循環(huán)體時,并不做任何判斷,這將可能造成因r等于0使n等于0,因n等于0使語句r = m % n的運算出現(xiàn)除數(shù)等于0的錯誤,因此要在do語句之前判斷r是否等于0。只有在r不等于0時才執(zhí)行do語句;在r等于0時最大公約數(shù)已經(jīng)得到。
          顯然,對于求最大公約數(shù)問題,用while語句比用do-while語句簡單一些。但在有些情況下,用do-while語句構(gòu)造循環(huán)過程比用while語句簡單一些。

          4.多重循環(huán)
          ??? 如果循環(huán)語句的循環(huán)體內(nèi)又有循環(huán)語句,則構(gòu)成多重循環(huán)結(jié)構(gòu)。多重循環(huán)結(jié)構(gòu)中的循環(huán)語句,可以是前面討論過的for語句、while語句或do-while語句中的任何一種。
          【例2.8】輸出九九乘法表。
          程序如下:
          public class Exam2_8
          {
          ??? public static void main(String args[])
          ??? {
          ??????? int i,j,n = 9;
          ??????? for(i = 1; i <= n; i++)???????????????? //外層循環(huán)
          ??????? {
          ??????????? for(j = 1; j <= i; j++)???????????? //內(nèi)層循環(huán)
          ??????????????? System.out.print("? " + i*j);?? //輸出
          ??????????? System.out.println();?????????????? //每行結(jié)束時換行
          ??????? }
          ??? }
          }
          說明:這個問題中,兩重循環(huán)的循環(huán)次數(shù)都已知,因此兩重循環(huán)都用for語句構(gòu)造循環(huán)過程。外層for語句的循環(huán)變量是i,控制總共打印多少行,內(nèi)層for語句的循環(huán)變量是j,控制每行顯示多少列。
          程序運行結(jié)果為:
          1
          2? 4
          3? 6? 9
          4? 8? 12? 16
          5? 10? 15? 20? 25
          6? 12? 18? 24? 30? 36
          7? 14? 21? 28? 35? 42? 49
          8? 16? 24? 32? 40? 48? 56? 64
          9? 18? 27? 36? 45? 54? 63? 72? 81
          當應(yīng)用問題復(fù)雜時,程序一般需要有多重循環(huán)結(jié)構(gòu),此時最重要的是要把程序設(shè)計的思路梳理清楚,而其中的每一重循環(huán)結(jié)構(gòu)都可以按單重循環(huán)結(jié)構(gòu)設(shè)計。

          ?
          3、break語句和continue語句

          ??? break語句通常是和switch語句或循環(huán)語句配合使用,continue語句通常是和循環(huán)語句配合使用。
          ?
          1.break語句
          ??? break語句的語法形式是:
          ??? break;
          ??? 在上節(jié)討論switch語句時,我們已結(jié)合介紹了switch語句中的break語句使用方法。這里我們主要介紹循環(huán)語句中的break語句使用方法。在循環(huán)語句中,break語句的功能是跳出循環(huán)體。特別需要說明的是,當break語句位于多重循環(huán)語句的內(nèi)層時, break語句只能跳出它當前所處的那層循環(huán)體。
          【例2.9】循環(huán)語句中break語句使用方法示例。
          public class Exam2_9
          {
          ??? public static void main(String args[])
          ??? {
          ???????? int i, j, k;
          ????????
          ???????? for(i = 1; i <= 6; i++)?????//第1層循環(huán)
          ???????? {
          ???????????? for(j = 1; j <= 6; j++)????//第2層循環(huán)
          ???????????? {
          ??????????????? for(k = 1; k <= 6; k++)???//第3層循環(huán)
          ??????????????? {
          ??????????????????? System.out.println("k = " + k + "???? ");
          ??????????????????? if(k == 2) break;?????????????? //跳出第3層循環(huán)
          ??????????????? }
          ??????????????? System.out.println("j = " + j + "???? ");
          ??????????????? if(j == 2) break;????????????????? ?//跳出第2層循環(huán)
          ???????????? }
          ??????????? System.out.println("i = " + i + "???? ");
          ??????????? if(i == 2) break;?????????????????????? ?//跳出第1層循環(huán)
          ???????? }
          ??? }
          }

          由于break語句的作用,此程序的第3層的輸出語句(輸出k)只執(zhí)行了8次,第2層的輸出語句(輸出j)只執(zhí)行了4次,第1層的輸出語句(輸出i)只執(zhí)行了2次。

          2.continue語句
          ??? continue語句的語法形式為:
          ????
          continue;
          ??? continue語句主要用于循環(huán)語句中,continue語句的語義是:若循環(huán)體中遇到continue語句,則本次循環(huán)體的后續(xù)語句被忽略,回到循環(huán)條件判斷處,判斷是否執(zhí)行下一次循環(huán)體。換句話說,continue語句僅跳過當前層循環(huán)體的剩余語句。
          【例2.10】continue語句使用方法示例。
          public class Exam2_10
          {
          ??? public static void main(String args[])
          ??? {
          ???????? int i, j;
          ????????
          ???????? for(i = 1; i <= 6; i++)
          ???????? {
          ???????????? for(j = 1; j <= 6; j++)
          ???????????? {
          ???????????????? if(j >= 3) continue;????//continue語句
          ???????????????? System.out.println("j = " + j + "???? ");
          ???????????? }
          ???????? }
          ??? }
          }
          由于continue語句的作用,第2層的輸出語句只執(zhí)行了12次。

          ?
          4、return語句
          ?
          ??? return語句的語法形式為:
          ??? return? [<返回值>];
          ??? return語句的語義是:使函數(shù)返回原調(diào)用處,且?guī)Щ胤祷刂怠H绻瘮?shù)為void類型,則return語句后沒有<返回值>;如果函數(shù)為非void類型,則return語句后需要有<返回值>,并且<返回值>的類型必須和函數(shù)的類型一致。
          ??? 當return語句不帶<返回值>,并且位于函數(shù)的最后時,return語句可以省略。
          ??? return語句的具體使用方法可參見隨后各章的程序設(shè)計舉例。
          ?
          ?
          7、程序注釋
          ??? Java語言允許在程序中添加注釋,以增加程序的可讀性。前面的例子中已經(jīng)多次使用了程序注釋。注釋主要是給人閱讀的,所以系統(tǒng)不會對注釋的內(nèi)容進行編譯。
          ??? Java語言有三種形式的注釋:
          ??? 單行注釋?????? // 注釋內(nèi)容

          ??? 多行注釋???????/* ……
          ???????????????????多行注釋內(nèi)容
          ???????????????????……*/

          ????文件注釋?????? /**……
          ?????????????????? 文件注釋內(nèi)容
          ???????????????????*/
          ?

          8、數(shù)組

          ??? 數(shù)組是連續(xù)內(nèi)存單元中一組名字和數(shù)據(jù)類型相同的數(shù)據(jù)元素的有限集合。數(shù)組可以用來保存和處理一組數(shù)據(jù)類型相同的數(shù)據(jù)元素。數(shù)組中的每個數(shù)據(jù)元素稱作一個數(shù)組元素。
          當把一維數(shù)組中的每個數(shù)據(jù)元素定義為一個一維數(shù)組時,就構(gòu)成了Java語言的二維數(shù)組,以此類推,還可以有三維數(shù)組甚至更多維數(shù)組。另外,Java語言可以構(gòu)造出不規(guī)則數(shù)組。
          ?
          1、一維數(shù)組
          ??? 和變量的使用方法類同,一維數(shù)組也要先定義后使用,不同的是數(shù)組在定義后還要經(jīng)過內(nèi)存單元分配后才能使用。
          ??? Java語言一維數(shù)組的使用分三步:定義一維數(shù)組變量、為數(shù)組分配內(nèi)存單元和使用數(shù)組元素。
          ?
          1.一維數(shù)組變量定義
          ??? 一維數(shù)組變量定義的語法形式為:
          ???? <數(shù)據(jù)類型><數(shù)組名>[];
          ???
          ????<數(shù)據(jù)類型>[]<數(shù)組名>;

          ??? 其中,方括號[]表示定義的是數(shù)組變量,<數(shù)據(jù)類型>定義了數(shù)組元素的數(shù)據(jù)類型,<數(shù)組名>定義了數(shù)組名的標識符。
          ??? 也可以把數(shù)組類型看成是Java語言在基本數(shù)據(jù)類型的基礎(chǔ)上的擴展。
          ??? 例如:
          ??? int[]? a;
          ??? 定義了一個數(shù)據(jù)類型為int、數(shù)組標識符為a的一維數(shù)組。
          在數(shù)組定義后,系統(tǒng)將給數(shù)組標識符分配一個內(nèi)存單元,用于指示數(shù)組在內(nèi)存中的實際存放位置。由于在數(shù)組變量定義時,數(shù)組元素本身在內(nèi)存中的實際存放位置還沒有給出,所以,此時該數(shù)組名的值為空(null)。例如,上述語句執(zhí)行后數(shù)組a的狀態(tài)如圖下圖中的(a)所示:
          ???
          ????? java1-1.gif

          ?
          2.為數(shù)組分配內(nèi)存單元
          ??? Java語言中,new是一個特殊的運算符。new運算符的語法形式為:
          ??? new?<數(shù)據(jù)類型>
          ??? new運算符的語義是:向系統(tǒng)申請指定數(shù)據(jù)類型所需的內(nèi)存單元空間。new運算符返回所申請內(nèi)存單元的首地址。
          ??? 數(shù)組元素本身的內(nèi)存空間必須用new運算符在程序中申請。只有用new運算符為數(shù)組分配了內(nèi)存單元空間后,存放一個數(shù)組的所有數(shù)組元素所需的內(nèi)存空間才真正被系統(tǒng)分配了。為數(shù)組類型變量分配內(nèi)存單元的語法形式為:
          ????<數(shù)組名> =? new?<數(shù)據(jù)類型>[<長度>];
          ??? 其中,<數(shù)組名>必須是已定義的數(shù)組類型變量,<數(shù)據(jù)類型>必須和定義數(shù)組名時的數(shù)據(jù)類型一致,方括號[]內(nèi)的<長度>指出了當前數(shù)組元素的個數(shù)。
          ??? 例如:
          ??? a = new int[5];
          ??? 就具體分配了包含5個int類型數(shù)組元素的內(nèi)存單元,并把該塊內(nèi)存單元的首地址賦值給數(shù)組名a
          ??? Java語言規(guī)定,在數(shù)組分配內(nèi)存單元后,系統(tǒng)將自動給每個數(shù)組元素賦初值,并規(guī)定:數(shù)值類型的數(shù)組元素初值為0,邏輯類型的數(shù)組元素初值為false,類類型的數(shù)組元素初值為null。執(zhí)行該語句后的示意圖如上圖中的(b)
          ?
          3.使用數(shù)組元素
          ??? 一旦完成了定義數(shù)組變量和為數(shù)組分配內(nèi)存單元后,就可以使用數(shù)組中的任意數(shù)組元素。數(shù)組元素由數(shù)組名、一對方括號、方括號中的整數(shù)數(shù)值(一般稱作下標)組成。其中下標指出了希望操作的數(shù)組元素位置。下標由0開始,其最大值為用new運算符分配內(nèi)存單元時規(guī)定的長度值減1。各數(shù)組元素在內(nèi)存中按下標的升序連續(xù)存放。上述數(shù)組a的5個元素依次是a[0],a[1],a[2],a[3],a[4]。
          ??? 例如:
          ??? a[0] = 10;
          ??? 語句就給數(shù)組元素a[0]賦了數(shù)值10。執(zhí)行該語句后的示意圖如上圖中的(c)

          4.引用類型
          ??? 前面討論的用基本數(shù)據(jù)類型定義變量和這里討論的定義數(shù)組變量有一些不同。用基本數(shù)據(jù)類型定義的變量,其變量名表示這個變量名中存放的數(shù)值,如有下列語句段:
          ??? int i, x;???? //定義變量
          ??? i = 10;???????//給變量i賦值
          ??? x = 10 + i;???//使用變量i中的數(shù)值
          ??? 上述語句段中,變量i的存儲結(jié)構(gòu)如下圖中的(a)所示,語句 x = 10 + i中,賦值號右邊的變量i表示變量i中的數(shù)值10。
          ???
          ??? java1-2.gif
          ??? 對于數(shù)組變量,設(shè)有下列語句段:
          ??? int[]? a;
          ??? int x;
          ??? a = new int[5];
          ??? a[0] = 10;??????//給數(shù)組元素a[0]賦值
          ??? x = 10 + a[0];??//使用數(shù)組元素a[0]中的數(shù)值
          ??? x = 10 + a;???? //錯誤,數(shù)值10和數(shù)組名 a為不兼容的類型
          ??? 上述語句段中,數(shù)組a的存儲結(jié)構(gòu)如上圖中的(b)所示,語句 x = 10 + a[0]中,賦值號右邊的數(shù)組元素a[0]表示數(shù)組元素a[0]中的數(shù)值,但語句x = 10 + a將出錯,因為數(shù)組名 a是指向內(nèi)存中存放數(shù)組元素的一片連續(xù)內(nèi)存單元的首地址,所以,數(shù)值10和數(shù)組名 a為不兼容的類型。
          ??? Java語言中,數(shù)組名的類型是引用類型。所謂引用類型,是指該類型的標識符表示的是一片內(nèi)存連續(xù)地址的首地址。
          ??? 引用類型是非常重要的一個概念。下一節(jié)要討論字符串,字符串名和數(shù)組名一樣,也是引用類型。
          ?
          5.數(shù)組的簡化使用方法
          ??? 數(shù)組的定義和為數(shù)組分配內(nèi)存空間兩步可以結(jié)合起來。
          ??? 例如:
          ??? int a[] = new int[ 5];
          ??? 就在定義int類型數(shù)組變量a的同時為數(shù)組分配了5個int類型數(shù)組元素所需的內(nèi)存空間,并給每個數(shù)組元素初始賦值0。
          ??? 數(shù)組元素的初始化賦值也可以和上述語句結(jié)合在一起完成,此時采用簡寫形式。例如,?
          ??? int?a[] = {1,2,3,4,5};
          ??? 就在定義int類型數(shù)組變量a、為數(shù)組分配了5個int類型數(shù)組元素所需的內(nèi)存空間的同時,初始化給數(shù)組元素a[0]賦初值1,a[1]賦初值2,……,a[4]賦初值5
          ?
          6.數(shù)組元素允許的運算
          ??? 對數(shù)組元素可以進行其數(shù)據(jù)類型所允許的任意運算。
          ??? 例如:
          ??? int u = 3, v = 4, x, y;
          ??? int a[] = {1,2,3,4,5};
          ??? x = (a[2] + a[3] – u) * v;
          ??? y = a[1] / u;
          ??? 都是合法的表達式。
          ?
          7.數(shù)組的長度
          ??? Java語言提供了length成員變量返回數(shù)組元素的個數(shù),其使用方法為:
          ????<數(shù)組名>.length
          ??? 例如:
          ??? int n;
          ??? int a[] = new int[ 10];
          ??? n = a.length;
          ??? 則有n等于10。
          ?
          8.數(shù)組長度的重新定義
          ??? 一旦為數(shù)組規(guī)定了長度,在程序中使用數(shù)組時就不能超過所規(guī)定的長度,否則編譯時會給出“數(shù)組下標越界”的語法錯誤。例如,若數(shù)組分配的內(nèi)存空間為5個,則語句中一旦出現(xiàn)a[5]將產(chǎn)生“數(shù)組下標越界”的語法錯誤。
          ??? 上述情況下,可以用new運算符重新為數(shù)組分配內(nèi)存單元。例如,?
          ??? a = new int[ 10];
          ??? 上述語句后,由于重新為數(shù)組a分配了10個int類型的內(nèi)存單元空間,所以,此時若語句中出現(xiàn)a[5],編譯時將不會出現(xiàn)“數(shù)組下標越界”的語法錯誤。
          【例2.11】求10個數(shù)中的最小數(shù)。
          要求:用數(shù)組初始化賦值方法給出10個整數(shù)數(shù)值。
          程序設(shè)計如下:
          public class Exam2_11
          {
          ??? public static void main(String args[])
          ??? {
          ??????? ?int i, min;
          ??????? ?int a[] = {30,81,37,45,26,46,44,78,80,64}; //初始化賦值
          ????????
          ??????? ?System.out.print("數(shù)組元素為:");?????????? ?
          ??????? ?for(i = 0; i < a.length; i++)
          ??????????? ?System.out.print("? " + a[i]); ???//輸出數(shù)組元素
          ?
          ??????? ?//尋找數(shù)組中數(shù)值最小的元素
          ???????? min = a[0];
          ??????? ?for(i = 1; i < a.length; i++)
          ??????????? ?if(a[i] < min)? min = a[i];
          ?
          ??????? ?System.out.println("\n最小數(shù)為:" + min);
          ??? ?}
          }
          程序的運行結(jié)果為:
          數(shù)組元素為:? 30? 81? 37? 45? 26? 46? 44? 78? 80? 64
          最小數(shù)為:26
          如果此問題不用數(shù)組方法設(shè)計,而用簡單變量方法設(shè)計,程序?qū)⒎浅?fù)雜。因此,數(shù)組是復(fù)雜問題的程序設(shè)計所必需的。
          ------------------------------------------------------------------------------------------------------
          【例2.12】把10個數(shù)按從小到大的次序排序。
          要求:用數(shù)組初始化賦值方法給出10個整數(shù)數(shù)值,用直接交換排序算法排序。
          直接交換排序算法思想:例2.11程序找到的是數(shù)組a中的最小數(shù)。如果我們在此基礎(chǔ)上設(shè)計一個循環(huán)過程,把每次找到的最小數(shù)和數(shù)組中尚未排好序的數(shù)據(jù)元素交換,下次循環(huán)時,從這個數(shù)據(jù)元素的下一個位置開始,繼續(xù)這樣的尋找和交換過程。這樣的過程共進行a.length-1次,則全部數(shù)組中的數(shù)據(jù)元素就按從小到大的次序排好了。
          程序設(shè)計如下:
          public class Exam2_12
          {
          ??? public static void main(String args[])
          ??? {
          ??????? int a[] = {30,81,37,45,26,46,44,78,80,64};
          ??????? int i, j, min, temp;
          ??????
          ??????? System.out.println("排序前數(shù)組元素為:");
          ??????? for(i = 0; i < a.length; i++)
          ??????????? System.out.print(a[i] + "? ");
          ?
          ??//直接交換排序
          ??for(i = 0; i < a.length-1; i++)???????? //循環(huán)a.length-1次
          ??{
          ??????????? min = i;????
          ??????????? for(j = i+1; j < a.length; j++)
          ??????????????? if(a[j] < a[min]) min = j;??????? //尋找最小數(shù)
          ?
          ??????????? if(min != i)???????????????????????????? //判斷是否需要交換
          ??????????? {
          ??????????????? temp = a[i];
          ??????????????? a[i] = a[min];
          ??????????????? a[min] = temp;
          ??????????? }
          ?}
          ?
          ??????? System.out.println("\n排序后數(shù)組元素為:");
          ??????? for(i = 0; i < a.length; i++)
          ??????????? System.out.print(a[i] + "? ");
          ??? }
          }
          程序的運行結(jié)果為:
          排序前數(shù)組元素為:
          30? 81? 37? 45? 26? 46? 44? 78? 80? 64
          排序后數(shù)組元素為:
          26? 30? 37? 44? 45? 46? 64? 78? 80? 81
          ?

          2、二維數(shù)組
          ?
          ??? Java語言只定義了一維數(shù)組,但是,如果一維數(shù)組的每個數(shù)組元素都是一個一維數(shù)組,則構(gòu)成了Java語言的二維數(shù)組。和一維數(shù)組的使用方法類同,二維數(shù)組的使用也分三步:定義數(shù)組變量、為數(shù)組分配內(nèi)存單元和使用數(shù)組元素。
          ?
          1.二維數(shù)組定義:
          ??? 二維數(shù)組變量定義的一個例子如下:
          ??? int?a[][];
          ???
          ??? int[]?a[];

          ??? 上面語句定義了一個數(shù)據(jù)類型為int[](即一維數(shù)組類型)、標識符為a的一維數(shù)組,即數(shù)組a是二維數(shù)組。
          ??? 上述語句執(zhí)行后數(shù)組a的內(nèi)存狀態(tài)如下圖中的(a)所示:
          ?
          ??? java1-3.gif

          ??? 為二維數(shù)組變量分配內(nèi)存單元時必須指定每一維的數(shù)組元素個數(shù)。
          ??? 例如:
          ??? a = new int[3][3];
          ??? 就具體分配了包含3個int[3]類型數(shù)組元素的內(nèi)存單元,并把該連續(xù)內(nèi)存單元的首地址賦給數(shù)組名a,同時為每個數(shù)組元素初始化賦值0。
          ??? 上圖中的(b)就是上述語句執(zhí)行后的內(nèi)存示意圖。
          ??? 使用二維數(shù)組元素的方法和使用一維數(shù)組元素的方法類同,只是這里要指出二維數(shù)組的每一維的下標。例如,語句
          ??? a[0][0] = 10;
          ??? 就給數(shù)組元素a[0][0]賦了數(shù)值10。如上圖(c)所示

          2.二維數(shù)組簡化:
          ??? 同樣,二維數(shù)組也可以用簡化方法。例如:?
          ???
          int a[][] = new int[5][5];
          ??? 就在定義int類型的二維數(shù)組變量a的同時,為數(shù)組分配了內(nèi)存單元結(jié)構(gòu)如圖2.2(b)所示的5個每一維為int[5]類型數(shù)組元素的內(nèi)存空間,并給每個數(shù)組元素初始賦值0。
          ??? 又例如:
          ??? int?a[][] = {{1,2,3},{4,5,6},{7,8,9}};
          ??? 就在定義int類型二維數(shù)組變量a、并為二維數(shù)組動態(tài)分配了9個int類型數(shù)組元素內(nèi)存空間的同時,初始化給數(shù)組元素a[0][0]賦初值1,a[0][1]賦初值2,a[0][2]賦初值3,a[1][0]賦初值4,……,a[2][2]賦初值9。
          ??? 三維數(shù)組或更多維數(shù)組的使用方法和二維數(shù)組的使用方法類同。
          【例2.13】求C = A×BT,其中,A是一個行向量,BT是一個列向量,C是一個矩陣。例如,設(shè)A和B均為n=3的向量,則矩陣C元素的計算方法是:c11=a1*b1,c12=a1*b2,c13=a1*b3,c21=a2*b1,……,c33=a3*b3。
          設(shè)計思想:這是一個矩陣運算。用一維數(shù)組 a存放行向量A,用一維數(shù)組 b存放列向量BT,用兩維數(shù)組存放矩陣C。
          程序設(shè)計如下:
          public class Exam2_13??
          {
          ??? public static void main(String args[])
          ??? {
          ??????? final int n = 3;
          ??????? int a[] = {1,2,3};
          ??????? int b[] = {4,5,6};
          ??????? int c[][] = new int[n][n];
          ??????? int i, j;
          ?
          ??????? for(i = 0; i < n; i++)
          ??????????? for(j = 0; j < n; j++)
          ??????????????? c[i][j] = a[i] * b[j];????? //計算cij
          ?
          ??????? System.out.println (”二維數(shù)組元素為:”);
          ??????? for(i = 0; i < n; i++)????????????
          ??????? {
          ??????????? for(j = 0; j < n; j++)
          ??????????????? System.out.print(c[i][j] + "?? ");
          ??????????? System.out.println();
          ??????? }
          ??? }
          }
          程序運行輸出結(jié)果為:
          二維數(shù)組元素為:
          4?? 5?? 6
          8?? 10?? 12
          12?? 15?? 18

          ?
          3、不規(guī)則的二維數(shù)組
          ?
          ??? 由于Java語言的二維數(shù)組是由一維數(shù)組定義的,所以,可以把二維數(shù)組中的每個一維數(shù)組定義為不同的元素個數(shù),這樣就可以構(gòu)成不規(guī)則的二維數(shù)組。
          ??? 不規(guī)則二維數(shù)組的具體設(shè)計方法是:先定義一個二維數(shù)組變量,并指定第一維的元素個數(shù),然后再分別為第二維數(shù)組(即第一維數(shù)組的每個數(shù)組元素)分配不同的內(nèi)存單元。由于此時是分別為第二維數(shù)組分配內(nèi)存單元,并且第二維數(shù)組所分配的內(nèi)存單元個數(shù)可以是不相同的,因此就構(gòu)成了不規(guī)則的二維數(shù)組。
          ??? 例如,下面的代碼先定義一個二維數(shù)組,并為數(shù)組的第一維數(shù)組元素分配空間(這就要求必須指定其具體個數(shù)),然后再分別為第二維數(shù)組元素分配不同的內(nèi)存空間。
          ??? int twoDim [][] = new int [4][];?//定義二維數(shù)組,并指定第一維的元素個數(shù)
          ??? twoDim[0] = new int[1];???//指定第二維第一個元素的個數(shù)
          ??? twoDim[1] = new int[2];???//指定第二維第二個元素的個數(shù)
          ????twoDim[2] = new int[3];???//指定第二維第三個元素的個數(shù)
          ??? twoDim[3] = new int[4];???//指定第二維第四個元素的個數(shù)
          ??? 數(shù)組twoDim得到的內(nèi)存單元結(jié)構(gòu)如下圖所示:
          ?
          ??? java1-4.gif

          ?
          【例2.14】計算并保存九九乘法表,要求重復(fù)的部分只保存一個。
          設(shè)計思想:九九乘法表需要一個二維數(shù)組來保存,因為要求重復(fù)的部分(如1*2和2*1)只保存一個,所以需要把二維數(shù)組定義成不規(guī)則的二維數(shù)組。
          程序設(shè)計如下:
          public class Exam2_14
          {
          ??? public static void main(String args[])
          ??? {
          ??????? ?final int N = 9;
          ??????? ?int a[][] = new int [N][];? //定義二維數(shù)組,并指定第一維的元素個數(shù)???????
          ??????? ?int i,j;
          ?
          ??????? ?for(i = 0; i < N; i++)
          ???????? ??? a[i] = new int [i+1];??????????? ?//指定不規(guī)則的第二維的個數(shù)
          ?
          ??????? ?for(i = 0; i < N; i++)?????
          ???????? ??? for(j = 0; j <= i; j++)???????
          ???????? ??????? a[i][j] = (i + 1) * (j + 1);??? //保存乘法表
          ??????
          //輸出乘法表
          ??????? ?for(i = 0; i < N; i++)????????????????
          ??????? ?{
          ???????? ??for(j = 0; j <= i; j++)
          ????????????? ?System.out.print(a[i][j] + "?? ");
          ??????????? ?System.out.println();
          ??????? ?}
          ??? ?}
          }
          程序運行輸出如下:
          1
          2?? 4
          3?? 6?? 9
          4?? 8?? 12?? 16
          5?? 10?? 15?? 20?? 25
          6?? 12?? 18?? 24?? 30?? 36
          7?? 14?? 21?? 28?? 35?? 42?? 49
          8?? 16?? 24?? 32?? 40?? 48?? 56?? 64
          9?? 18?? 27?? 36?? 45?? 54?? 63?? 72?? 81
          ?
          ?
          9、字符串

          ??? 字符串是由n(n≥0)個字符組成的序列。為了把一個字符串和別的語言成分區(qū)分開來,Java中的字符串用一對雙引號括起來,一個字符串中的字符個數(shù)稱作字符串的長度。如"abc"就是一個長度為3、其值為abc的字符串。
          ??? Java中的字符串變量用String來定義,但和char、int等基本數(shù)據(jù)類型不同的是,String不是一個數(shù)據(jù)類型,而是一個類。String是Java應(yīng)用程序接口(即Java API)中定義的一個類。由于應(yīng)用程序一般要有輸出,常用的系統(tǒng)標準輸出要求輸出參數(shù)是一個字符串,因此,本節(jié)簡單介紹字符串的概念和使用方法。

          1.字符串常量
          ??? 一對雙引號括起來的任何字符序列都是一個字符串常量,如""和"sum" 都是字符串常量。字符串常量""的長度為0,字符串常量"sum"的長度為3。

          2.字符串變量
          ??? 定義字符串變量的方法和定義基本數(shù)據(jù)類型變量的方法類同。如下面語句就定義了兩個字符串變量str1和str2:
          ??? String str1, str2;
          ??? 在定義字符串變量時可以同時賦值,例如,下面語句就在定義字符串變量str的同時,給str賦了初值"abc":
          ??? String str = "abc";
          ??? 還可以定義String數(shù)組,例如,語句:
          ??? String[] v = new String[3];
          ??? 就定義了一個有3個數(shù)組元素的String數(shù)組v
          ?
          3.字符串變量名
          ??? 和數(shù)組名一樣,字符串變量名也是引用類型,即字符串變量名是指向內(nèi)存中一片連續(xù)內(nèi)存單元的首地址。
          ?
          4.字符串的賦值
          ??? 字符串變量定義后可以給該變量賦值。例如:
          ??? String str;
          ??? str = "abc";
          ??? 上述字符串變量定義和變量賦值也可以寫在一個語句中:
          ??? String str = "abc";
          ??? 上述語句的功能是:首先,定義字符串變量str;然后,向系統(tǒng)申請字符類型的長度為3的一片連續(xù)內(nèi)存單元,并把字符’a’、’b’、’c’依次存入內(nèi)存單元中;最后,把這片連續(xù)內(nèi)存單元的首地址賦給字符串變量名str,即讓str指向存放字符串"abc"的內(nèi)存單元的首地址。
          ??? 給字符串變量賦值時,還可以賦多個,其方法等同于數(shù)組聲明時賦值。例如:
          ??? String[] v={"Hello world!","Hello China!","Hello XSYU!"};
          ??? 該語句就給字符串變量v 賦了3個字符串常量值。
          ?
          5.字符串的連接運算
          ??? Java語言提供了特殊的字符串運算符“+”,運算符“+”表示把兩個字符串連接起來。例如:
          ??? String str = "abc" + "def";
          ??? 該語句就把字符串值"abcdef",賦給了字符串變量str。
          ?
          6.標準輸出中的字符串
          ??? 前面已經(jīng)多次使用了系統(tǒng)的標準輸出System.out.print()和System.out.println()。這兩個輸出語句要求的參數(shù)是字符串或字符串表達式。例如,
          ??? String str = "abc";
          ??? System.out.print("def");
          ??? System.out.print(str);
          ??? System.out.print(str + "def");

          ??? 都是合法的輸出語句。
          ??? 前面有如下形式的輸出語句:
          ??? int j = 10;
          ??? System.out.print("j = " + j);

          ??? 其中,"j = "是一個字符串,j是一個int類型的變量,其數(shù)值為10,顯然,表達式"j = " + j的數(shù)據(jù)類型不一致,在這里,系統(tǒng)將把int類型的數(shù)值10轉(zhuǎn)換為字符串類型。
          ??? 因此上面語句將輸出:
          ??? j = 10
          ?
          ?
          ?
          ?
          ?
          ?




          -The End-

          posted on 2008-09-19 17:23 decode360-3 閱讀(1101) 評論(0)  編輯  收藏 所屬分類: Java
          主站蜘蛛池模板: 合水县| 汝州市| 搜索| 临湘市| 彭阳县| 达州市| 遵化市| 丹巴县| 吉林市| 吉安县| 武隆县| 稷山县| 宁武县| 嘉鱼县| 仁寿县| 龙川县| 景德镇市| 会东县| 南宁市| 遂宁市| 上犹县| 淮安市| 抚松县| 南投县| 太白县| 龙山县| 阳曲县| 瓮安县| 寻乌县| 利津县| 柘荣县| 安顺市| 广宗县| 廉江市| 屯留县| 临海市| 宁乡县| 郁南县| 五华县| 佛坪县| 周至县|