第二章開始學Java語法_第1頁
第二章開始學Java語法_第2頁
第二章開始學Java語法_第3頁
已閱讀5頁,還剩39頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第二章 開始學 Java 語法任何一種程序語言,都有一些最基礎的東西,這就是這門語言要處理什么樣的數(shù)據(jù),以及如何按著 相應的規(guī)則組織和處理這些數(shù)據(jù)。千里之行,始于足下,本章將通過實例,用通俗的語言來講述蘊涵在 Java 里的面向對象思想,通過 學習我們可以發(fā)現(xiàn): 面向對象思想不是枯燥晦澀的教條, 而是可以幫助我們更有效開發(fā)代碼的指導工具。音樂家可以通過駕馭復雜的和聲等技巧來創(chuàng)作優(yōu)美動聽的旋律,作家也從沒有把把復雜浩瀚的語法 條目當成他們創(chuàng)作的障礙,同樣地, Java 的語法細節(jié)也僅僅是開發(fā)項目的工具,希望大家在掌握初步的 語法后,立即從面向對象思想和項目開發(fā)的需求的角度來觀察語法定義的動機,學

2、以致用,而不應該過 多地“從故紙堆中找學問”,刨根問底地研究“這個類有多少方法”等類的細節(jié)性的問題。2.1 基本數(shù)據(jù)類型與操作符基本數(shù)據(jù)類型的數(shù)據(jù)是構建 Java 程序大廈的磚瓦,我們在欣賞蘊涵 Java 大型項目里優(yōu)秀架構和精 密的內(nèi)部實現(xiàn)細節(jié)時,不應該忽略 Java 語言里的基本類型數(shù)據(jù)。2.1.1 基本數(shù)據(jù)類型Java的基本數(shù)據(jù)類型分為 4 大類:整數(shù)、浮點數(shù)、字符型、布爾型。其中,整數(shù)包括 byte、int、short、long,浮點數(shù)包括 float 、 double 。由于用不同位數(shù)( bit )來存放, 它們所表示的精度和范圍也有所不同,同時也有各自相應的默認值。如表 2-1 所

3、示。表 2-1 Java 的基本數(shù)據(jù)類型關鍵字位數(shù)范圍默認值byte8-2727-10short16-215215-10int32-231231-10long64-263263-10float323.4e-0383.4e+0380.0fdouble641.7e-3081.7e+3080.0dchar8u0000uffffu0000boolean8true 或 falsefalse整數(shù)型: byte、int 、 short 、 long 。通常情況下整數(shù)型數(shù)據(jù)都是用十進制來表示,同樣他們也可以表 示成十六進制或八進制。十六進制以 0x 開頭,如 0x1F 的十進制數(shù)值為 31。八進制以 0 開頭

4、,如 017 的 十進制數(shù)值為 15。請大家注意, 整數(shù)型變量在進行賦值時, 要注意有可能會發(fā)生因為精度不夠而造成數(shù)據(jù)溢出的錯誤, 例如:byte b;/ byte 類型的數(shù)據(jù)最大為 127, 10000 由于數(shù)據(jù)溢出而不通過編譯b = 10000;在 Java 語言里, 浮點數(shù)型有 float 、double 。浮點型數(shù)據(jù)用于表示小數(shù)。 浮點型常量有兩種表示方式: 一般表示法和科學計數(shù)法。 如一般表示法 345.64 的科學計數(shù)法為 3.4564E2 。默認情況下, 浮點數(shù)常量為 double ,我們也可以在相應的數(shù)字后面添加相應的字母,f 或 F 表示 float 類型浮點數(shù), d 或 D

5、 表示 double類型浮點數(shù),如 123.4f 和 123.4d 前者用 32 位空間存儲后者用 64 位存儲。這里需要強調(diào)的一點是,在我們使用整數(shù)型數(shù)據(jù)和浮點型數(shù)據(jù)的過程中并不是用越大的數(shù)據(jù)類型存 放數(shù)據(jù)就越好,因為這樣不僅有可能會造成一定的空間浪費而且還會提高相應得計算時間,因此我們應 在確保不發(fā)生數(shù)據(jù)溢出的前提下選擇合適類型來存放相應的數(shù)據(jù)。在 Java 語言里,字符型用 char 表示。它用來表示單個字符,它有兩種賦值方式:單引號(而不是 雙引號)括起來的單個字符,用整數(shù)表示的 unicode 編碼值。例如:char c1 = ' a'/ 表示 97 所對應的 uni

6、code 編碼 achar c2 = 97;Java 語言里,布爾型是 boolean 。用來表示真和假,它只有兩個值 true 和 false。2.1.2 基本操作符操作符就是用來計算數(shù)據(jù)的符號,我們可以把數(shù)據(jù)通過操作符組合起來得到相應的結果。按著操作 符所操作數(shù)據(jù)的個數(shù)可以分為:一元、二元、三元,這一點比較好理解。按著操作符的功能可以分為: 算術、賦值、關系、邏輯、位運算等操作符。接下來我們詳細為大家介紹各種操作符的功能:算術操作符是用來描述整數(shù)和浮點數(shù)類型數(shù)據(jù)的運算規(guī)則的一組操作符。單目運算操作符包括“ -”,“+ ”,“-”,它們都只能對一個操作數(shù)進行計算?!?”為求反符號,它表示計算

7、操作數(shù)的相反數(shù)。“ + ”,“ -”分別是自增和自減符號,它們會計算操作數(shù)的加一或減一 的值,在使用這兩個符號的時候需要大家注意操作符和操作數(shù)的位置對表達式結果的影響,例如:int i = 5;int j = 5;int k;/ i 的值為 6,表達式 i+ 的值為 6, k 的值為 18k=i+*3;/ i 的值為 6,但表達式 +i 的值為 5, k 的值為 15k=+j*3;注意: i+指表達式運算完后再給 i加一,而 +j 指先給 j加一然后再運算表達式的值。 雙目運算操作符包括“ +”,“ -”,“ * ”,“ /”,“ %”,它們可以對兩個操作符進行計算,分 別對應于加,減,乘,除

8、,求余運算。需要注意的是前四種符號可以在整數(shù)和浮點數(shù)之間進行計算,而 求余運算只能在整數(shù)之間運算。賦值操作符包括“ =”和一些擴展的賦值操作符,如:“+=”,“ -=”,“ *= ”,“ /=”,“ %=”。其中, ”=”表示把等號右邊表達式的值賦給等號的左邊,而一些擴展的賦值操作符是一種簡寫形式, 它們 表示把左操作數(shù)按著相應的運算符號的規(guī)則與右操作計算所得到的結果又符給了左操作數(shù)的那個變量, 例如:int i = 5;/ 等同于 a=a+6,故最終 a 的值為 11a += 6;關系操作符用于比較兩個表達式的大小關系,計算的結果為布爾類型數(shù)據(jù)的true 和 false 。如果表達式關系成立

9、則結果為 true,否則為 false。關系操作符包括“ = =”,“ != ”,“ >”,“ <”,“ >=”, “ <=”,分別表示等于,不等于,大于,小于,大于等于,小于等于。需要注意的是:關系操作符中的 “= =”表示的比較操作符兩邊的操作數(shù)是否相等,而賦值操作符“=”表示把左操作數(shù)的值賦到右操作數(shù)中去。這里, 值得注意的是用來判斷兩個操作對象是否相等的”= ”操作符, 它主要用在 if,while 和 for 循環(huán)里的條件判斷里。比如,有如下語句:int i = 10; int j = 10;if(i = j)/do action1 由于 i 和 j 相等,所

10、以在 if 語句里,會執(zhí)行 do action1 部分的代碼。邏輯操作符用于對布爾類型數(shù)據(jù)的計算,得到的結果也是布爾類型的數(shù)據(jù),包括“&”,“ && ”,“|”,“ |”,“ ”,“ ! ”,分別表示邏輯與,邏輯與,邏輯或,邏輯或,邏輯異或,邏輯非。除了“!”是一元操作符以外其余的都為二元操作符。邏輯與表示只有當左右操作數(shù)都為 true 時表達式結果才為 true ,否則為 false;邏輯或表示左右操作數(shù)中只要有一個為true 時表達式結果就為 true,否則只有兩個操作數(shù)都為為 false 時表達式結果才為 false;邏輯異或表示當左右操作數(shù)不同即相異時表達式結果

11、為 true , 否則如果左右操作數(shù)相同時表達式結果為false;邏輯非表示求操作數(shù)相反的值,即true 為 false, false為 true 。“&”與 “&& ”和 “|”和 “|”雖然名稱相同,但是使用時卻有差別,例如:int i = 1;int j = 2;boolean b1;boolean b2;/ i>5 為 false, j>5 為 false ,表達式的值為 falseb1 = ( i > 5 ) & ( j > 5);/ 只要知道 i>5 為 false 就可以確定表達式的值為 falseb2 = ( i &

12、gt; 5 ) && ( j > 5);“&”與“ |”要根據(jù)左右操作數(shù)的最終結果計算表達式的值,而“&& ”與“ |”如果可以根據(jù)左操作數(shù)的值能確定表達式結果就不會繼續(xù)計算右操作數(shù)的值。位運算操作符是以二進制的方式操作數(shù)據(jù),并且操作數(shù)和結果都是整數(shù)類型的數(shù)據(jù),包括“”,“ & ”,“ |”,“ ”,“ >>”,“ <<”,“ >>>”,分別表示位反,位與,位或,位異或,帶符號位右 移,左移,無符號位右移。位反,位與,位或,位異或表示把左右操作數(shù)按著其二進制的表達形式對每 個位的 1或 0進行相應的

13、邏輯操作, 再把新得到二進制數(shù)據(jù)轉化成十進制數(shù)從而得到表達式的最終結果。 后三種操作符表示把左操作數(shù)轉化成二進制數(shù)據(jù),然后按著右操作數(shù)的大小進行相應方向的移動,再把 新得到二進制數(shù)據(jù)轉化成十進制數(shù)從而得到表達式的最終結果,但需要注意的是同樣是向右移動“ >> ” 表示帶著符號位即最高位的 1或 0 向右移動,而“ >>>”表示無論符號位是 1 還是 0,都用 0對最高位補 位,如表 2-2 所示。表 2-2 位移運算i二進制補碼i<<2i>>2i>>>27001000110000110000001000100010001-

14、1711101111101111001111101100111011其它的重要操作符有:1. 條件操作符“ (?:)”,它是唯一的一個三元操作符。使用方式如:i ? j : k ,其中 i 表達式的結果為布爾類型,如果 i 為 true 表達式結果為 j ,否則為 k。2. 括號操作符“ ( )”,用于優(yōu)先表達式的計算順序。2.1.3 操作符優(yōu)先級操作符的優(yōu)先級決定了處理表達式計算的先后順序,還有一個重要的特性就是結合性,它們共同決定了表達式按著何種方式來進行各種計算最終得到相應的結果,對于初學者來說建議使用括號來明確指 定運算順序。各種操作符的優(yōu)先級和結合性如表2-3 所示。表 2-3 操作

15、符的優(yōu)先級和結合性操作符優(yōu)先級結合性 ,()12右,!,+ ,-3右*,/,%4左+,-5左>>,<< ,>>>6左,=,=7左= = , !=8左&9左10左|11左&&12左|13左?:14右=15右大家不必硬記這些優(yōu)先級,可以通過針對容易混淆的地方加括號就可以了,比如有如下的表達式: !i=j ,首先是判斷兩個值是否一樣,然后是個取非的操作,我們可以改寫成: !(i=j) ,雖然 !的優(yōu)先 級比 = 要低,加不加括號的效果是一樣的,但是如果我們加了括號,看起來就更清除了。2.1.4 對象型的數(shù)據(jù)類型在 Java 語言里,以

16、類的形式,定義了一些對象類型的數(shù)據(jù)類型,并且在其中封裝了針對這種類型數(shù) 據(jù)的一些操作方法,其中,我們經(jīng)常會用到的有:基本數(shù)據(jù)類型的封裝類和描述字符串的 String 類。下 表 2-4 描述了基本數(shù)據(jù)類型對應的封裝類。表 2-4 基本數(shù)據(jù)類型對應的封裝類基本數(shù)據(jù)類型對應的封裝類booleanBooleancharCharacterbyteByteshortShortintIntegerlongLongdoubleDoublefloatFloat各數(shù)據(jù)類型對應的封裝類里,不僅包括了基本數(shù)據(jù)類型的數(shù)據(jù),由于它們更是類,所以會封裝了一 些實用的方法,比如我們在如下的代碼里,通過 Integer 類封

17、裝的 doubleValue 方法,把 Integer 類型的數(shù) 據(jù)轉換成 double 。Integer k = new Integer(10);k.doubleValue(); 封裝類等于基本數(shù)據(jù)類型加針對基本數(shù)據(jù)類型的操作,它們是對象,這點對我們來說至關重要。 在 Java 語言里,描述字符串的 String 類有著很重要的用途,在這個類里,同樣是定義了針對字符串 的一些操作,通過下面的 StringTest.java 代碼,我們可以看到 String 類的一些常用方法。public class StringTestpublic static void main(String args)

18、String s1 = "Hello World"String s2 = new String("Hello World"); /輸出字符串的長度 System.out.println("the length of s1 is " + s1.length(); /得到第三個字符,索引位置從 0 開始char index2 = s1.charAt(2);System.out.println(index2); /比較兩個字符串 錯誤的做法 if(s1 = s2) System.out.println("The two Strin

19、g are equal!"); else System.out.println("The two String are not equal!"); /比較兩個字符串 正確的的做法 if(s1.equals(s2) System.out.println("The two String are equal!"); else System.out.println("The two String are not equal!"); /連接字符串 s1 = s1.concat("!"); System.out.pr

20、intln("After concat the s1 is " + s1); /查找字符串的位置System.out.println(s1.indexOf("!"); System.out.println(s1.indexOf("#"); 在上述的方法里,我們針對字符串做了如下的操作:1. 首先定義了兩個字符串,我們可以通過直接賦值,也可以通過以 new 的方式調(diào)用 String 的構造 函數(shù)來創(chuàng)建 String 類型的對象。2. 通過 length 方法可得到字符串的長度,執(zhí)行到這里,會輸出如下結果。the length of s1

21、 is 113. 通過 charAt 方法可得到字符串里指定索引位置的 char 類型變量,因為索引位置從 0 開始計算, 所以執(zhí)行到這里,會輸出 s1 對象的第三個索引位置的“ l”。4. 下面,我們將要比較 s1和 s2兩個字符竄是否相等,首先用的是 =的方式,這里我們可以發(fā)現(xiàn), 雖然兩個字符串的內(nèi)容完全相等,但是,從隨后輸出的內(nèi)容上來看, s1=s2 的結果是 false 。這是個初學者經(jīng)常會犯的錯誤!因為s1和 s2 都是對象,所以 =操作符是用來判斷這兩個對象的引用地址(即這兩個對象在內(nèi)存里的存儲首地址)是否相等,而不是判斷它們的內(nèi)容是否相等。所以,我 們要用 equals 方法來判

22、斷兩個 String 類型的對象里的值之否相等。5. 可以通過 concat 方法,連接兩個字符串,代碼里我們是把! 加到了 Hello World 的后面,我們可以通過輸出看到 ”Hello World! ”的效果。6. 可以通過 indexOf 方法,來查找指定字符的位置,如果找到,這個方法將返回這個字符的索引位置(索引位置同樣是從 0 開始),如果沒有找到,則返回 -1。2.1.5 方法(函數(shù))的參數(shù)和返回值方法(也叫函數(shù))是 Java 語法的重要組成部分,它的語法比較簡單,但用途比較廣泛,通過下面的 FunctionTest.java 代碼,我們一起來學習一下方法的用途。public

23、class FuncionTest/方法定義public static int add(int i,int j)return i+j;public static void main(String args)/方法調(diào)用int result = add(2,2);System.out.println(result); 首先我們定義了一個 add 的方法,定義方法的基本語法是: 修飾符 返回類型 方法名 (參數(shù)列表 )這里的修飾符是 public 和 static 表示公有的靜態(tài)方法,它的具體含義會在下文里描述,這里的返回 類型是 int ,表示 add方法將要返回一個 int 類型的結果,返回類型

24、可以是基本數(shù)據(jù)類型,也可以是類, 如果這個方法沒有返回,則可以用 void 在表示。這里的方法名是 add,參數(shù)是兩個 int 類型的值。而在 add 的方法主體里,是針對了兩個輸入?yún)?shù),做了個加的操作,并且通過return 語句將結果返回。這里請大家注意,返回結果的類型必須要和方法定義時聲明的返回類型相一致。而在 main 函數(shù)里調(diào)用 add 方法時,我們的做法是: int result = add(2,2); ,針對 add 方法的參數(shù)列表, 我們傳入了兩個 int 類型的參數(shù),并且用了同樣是 int 類型的 result 變量來接收 add 方法的返回值。如果我們在 main 函數(shù)里有多

25、個 add 操作, 那么可以把這些加法操作定義到方法體里,而不是直接在main 函數(shù)里執(zhí)行操作,這樣可以減少代碼的冗余程度。2.2 程序流程控制 流程控制的語句起著控制代碼執(zhí)行順序的作用,它由順序、選擇、循環(huán)這 3 種最基本的結構組成。 通過這種方式得到的代碼,結構清楚,層次分明,易于閱讀與維護。在這里需要強調(diào)的一點是,雖然 Java 是一種面向對象的語言, 我們可以把它的結構模塊化, 但是模塊內(nèi)部最基礎的結構仍是這種面向 過程的方式,只不過在整體的設計上我們運用了面向對象的理念。2.2.1 順序與分支順序結構是最基本最簡單的結構,它按著從上到下的流程順序的組織代碼,在編程的時候我們一般 會基

26、于這種順序結構與分支和循環(huán)進行一定的嵌套,從而使代碼進行有效地運作。 分支結構由 if 和 switch 兩個關鍵字引出。前者用于二選一后者用于多種分支情況的選擇。 if else 結構: if( 條件語句 )分支語句 1;else分支語句 2;如果條件語句值為 true 時,執(zhí)行分支語句 1,否則執(zhí)行分支語句 2。如果需要滿足條件時同時執(zhí)行 多條語句,只需把這些語句用“ ”括起即可。if 結構: if( 條件語句 )語句 ;如果條件語句值為 true 時,執(zhí)行語句,否則忽略該語句。同樣,如果需要滿足條件時同時執(zhí)行多條 語句,只需把這些語句用“ ”括起即可。else if 結構:if( 條件語

27、句 1)分支語句 1;else if( 條件語句 2)分支語句 2;else if( 條件語句 n)分支語句 n;else分支語句 n+1;如果條件語句 1 為 true 時,執(zhí)行分支語句 1,否則如果條件語句 2 為 true 時,執(zhí)行分支語句 2, 否則如果條件語句 n 為 true 時,執(zhí)行分支語句 n,否則執(zhí)行分支語句 n+1。通過這種 if else 語句嵌套的 方式達到了多分支語句只執(zhí)行其中一個分支語句的效果,由于if else 在本章里使用最為廣泛,所以在這 里不再單獨舉例。switch 結構,它的語法是:switch( 條件語句 )case 值 1 : 語句 1;case 值

28、2 : 語句 2;case 值 n : 語句 n; default : 語句 default;先計算條件語句的值,該值必須為整數(shù)型或者字符型,如果值為1,執(zhí)行語句 1,如果值為 2,執(zhí)行語句 2 ,如果值為 n,執(zhí)行語句 n,如果所有的值都不匹配就執(zhí)行語句default ,default 段也可以省略掉。需要注意的是條件語句的值在與某一個值匹配執(zhí)行了相應的語句之后,如果沒有 break 語句打斷, 則程序會繼續(xù)執(zhí)行下去直到遇到了一個 break 語句或者 switch 結束。例如:char flag = b'int i=1;switch(flag)case a' : i = 1

29、;case b' : i = 2;break;case c ' : i = 3;default : i = 4;上述代碼的業(yè)務邏輯是,如果flag 的值為 a,'則先執(zhí)行 i = 1,然后是 i = 2 ,此時遇到了 break 才會跳出 switch 語句。如果 flag 的值為 b',則執(zhí)行 i = 2 ,此時遇到了 break 跳出 switch 。如果 flag 的值為 c',則執(zhí)行 i = 3 , 然后執(zhí)行 i = 4 ,最后跳出 switch 。如果 flag 不是其中的任何一個則執(zhí)行i = 4 ,然后跳出。2.2.2 循環(huán)流程循環(huán)流程實現(xiàn)了

30、一種反復執(zhí)行某段程序的流程結構。它是由循環(huán)語句和跳轉語句共同實現(xiàn)的。循環(huán) 語句包括 for 、 while 、 do-while 語句,跳轉語句包括 break 、 continue 語句。for 語句:for( 初始化語句 ;條件語句 ;遞歸語句 )循環(huán)體 ; 程序先執(zhí)行初始化語句,它的作用是初始化循環(huán)變量,如果有多個語句就逗號隔開,然后判斷條件 語句的值,如果為 true 執(zhí)行循環(huán)體和遞歸語句,再判斷此刻的條件語句的值,重復以上步驟,直到某次 遞歸之后,條件語句的值為 false ,跳出當前 for 語句。例如:while 語句:while( 條件語句 )循環(huán)體 ;判斷條件語句的值如果為

31、true,執(zhí)行循環(huán)體,再判斷此刻的條件語句的值,重復以上步驟,直到條 件語句的值為 false,跳出當前 while 語句。do-while 語句:do循環(huán)體 ;while( 條件語句 )先執(zhí)行循環(huán)體,然后判斷條件語句的值如果為 true 繼續(xù)執(zhí)行循環(huán)體,再判斷條件語句的值,重復以 上步驟,直到條件語句的值為 false ,跳出當前 do-while 語句。break 語句:可以用于 switch 語句和以上 3 種循環(huán)語句,目的是跳出整個循環(huán)語句。continue 語句:用于以上 3 種循環(huán)語句,目的是跳出當前的一次迭代,而不是跳出整個循環(huán)語句,這是它與 break 最大的區(qū)別。2.2.3

32、有爭議的 goto 語句做過 BASIC 或 C 語言編程的人都知道 goto 語句是一個臭名昭著語句,它可以讓代碼跳轉到任何的 位置,它增加了代碼的復雜度,嚴重影響了程序的可讀性,因此使用的時候應該謹慎。在 Java 里面 goto 作為一個保留字存在,但沒有拿來做任何用途但是 Java 里面的 break、 continue 結合循環(huán)語句中的 label 實現(xiàn)了部分的 goto 跳轉功能。在多層循環(huán)的嵌套中怎樣從內(nèi)層循環(huán)直接跳出外層循環(huán)的迭代哪,讓我們看一下下面的代碼Lable.java 。 public class Label public static void main(String

33、 args) int i = 0;outer: while (true)System.out.println("in while loop");while (true)i+;System.out.println("i = " + i);if (i = 2)System.out.println("continue outer"); continue outer;if (i = 4)System.out.println("break outer");break outer;在 Eclipse 中運行該程序得到如下輸出:

34、in while loopi = 1i = 2continue outerin while loopi = 3i = 4break outer該程序先初始化變量 i 值為 0,然后進入了最外層循環(huán),并且在該循環(huán)的前面加入了一個名字叫做 outer 的標簽,然后打印“ in while loop ”,進入內(nèi)循環(huán), i值加一變?yōu)?1,然后內(nèi)部循化迭代 i 值加一變 為 2 ,此時滿足 if 條件語句打印“ continue outer ”并執(zhí)行 continue outer 語句,從內(nèi)層的一次迭代跳到了 外層循環(huán)的迭代,注意這種方式只有通過標簽才能實現(xiàn),然后繼續(xù)進入內(nèi)層循化,當 i 值變?yōu)?4 時

35、打印 “ break outer ”并執(zhí)行 break outer 語句,曾內(nèi)層的一次迭代跳出了整個外層循環(huán),程序執(zhí)行結束,這種 直接跳出的方式也只有標簽可以實現(xiàn)。2.2.4 使用 If 語句判定是否是閏年計算機之所以如此流行,最主要的原因就是它給人們的日常生活帶來的極大的方便。下面給大家展 現(xiàn)一個比較有趣的例子 : 如何用 if 語句判斷某一年是否是閏年,請看代碼 LeapYear.java 。public class LeapYearpublic static void main(String args)int year = 2008;if (year % 4 = 0 &&

36、 year % 100 != 0) | (year % 400 = 0) System.out.println(year + " is a leap year.");elseSystem.out.println(year + " is not a leap year.");在 Eclipse 中運行該程序得到如下輸出:2008 is a leap year.這段代碼的業(yè)務邏輯是:如果輸入年份能夠被 4 整除并且不被 100 整除或者能被 400 整除,該年份 就是閏年,否則不是。在 LeapYear.java 代碼中我們通過 if 語句和算術運算、邏輯運

37、算結合在一起非常方便的實現(xiàn)了該功2.2.5 使用循環(huán)語句計算階乘計算機語言在數(shù)學領域也發(fā)揮著舉足輕重的作用,比如說如何快速的計算整數(shù)n 的階乘,請看代碼Factorial.java 。public class Factorialpublic static void main(String args)int f = 1;for (int n = 10; n > 1; n-)f = f * n;System.out.println("The result is " + f);在 Eclipse 中運行該程序得到如下輸出:The result is 3628800 程序里,

38、我們可以通過 for 語句實現(xiàn)計算了 n 的階乘,從 n 開始循環(huán)每次都與當前的 n 相乘把值存 放到變量 f 中,直到 n 的值減到 1 為止,這樣就達到了計算整數(shù) n 的階乘的目的。2.2.6 使用 Switch 語句控制輸出switch 語句,比如根據(jù)成績的等級判斷具體的分數(shù)段,如果我們有多分支選擇的需求就可以考慮使用請看代碼 GradeLevel.javapublic class GradeLevelpublic static void main(String args)char grade = 'C'switch (grade)case 'A':Sys

39、tem.out.println(grade + " is 85 100"); break; case 'B': System.out.println(grade + " is 70 84"); break; case 'C': System.out.println(grade + " is 60 69"); break; case 'D': System.out.println(grade + " is < 60"); break; default: Syste

40、m.out.println("inputerror");在 Eclipse 中運行該程序得到如下輸出:C is 60 69 考試成績一共有四個等級,根據(jù)這些等級我們能反推出所處的分數(shù)段,程序里面也作了很好的容錯 機制,如果你輸入了一個不正確的等級那么將得到輸入錯誤的提示。這里需要大家注意的是每個 case語句后面都加上了一個 break 語句,大家可以把它去掉看看會有什 么樣的輸出。2.3 類與封裝在面向對象的思想中,任何實體都可以看成對象,而我們會把這些對象分門別類抽象出它們共同的 特征,并且把這些特征歸納起來形成一個概念的定義,我們就稱之為類。“封裝”是面向對象思想的第

41、一大要素,如果沒有能體現(xiàn)“封裝性”的類,那么面向對象的另外大要素,“實現(xiàn)類的繼承”以及“類的多態(tài)”將成為無源之水,無本之木。2.3.1 類的構成要素類反映了現(xiàn)實生活中真正存在的一些對象的特征,這些對象都有相同的屬性定義和行為定義,只不 過具體的值會有所區(qū)別, 這也符合我們認知世界的規(guī)律, 因為大自然中的萬物也是既有共性又有特性的。在面向對象的 Java 語言里面,我們通過關鍵字 class 定義一個類,在類里面存在若干個屬性和方法 對應現(xiàn)實世界中的屬性和行為。比如,汽車有位置和速度的屬性,有運動和停止的行為。那我們就可以 定義 Car 類,代碼請見如下的 Car.java 程序。public

42、class Car/ 位置int position;/ 速度int speed;/方法/ 運動void move() System.out.println("is moving");/停止void stop() System.out.println("is Stopped");2.3.2 類的構造函數(shù)與構造次序我們在上面只是定義了一個汽車的類,現(xiàn)實生活中可能有很多這樣的車只不過它們的位置的速度不 同,我們可以根據(jù)這個汽車類的定義實例化出具體的正在某個位置以一定的速度運行的汽車,此時我們 就可以用 new 關鍵字來實例化出這個對象,并且為這個對象賦予相應的

43、屬性值,這樣我們才創(chuàng)造了一個 與現(xiàn)實世界中對應起來的一輛汽車。 我們在原來的 Car 類基礎上加上 main 函數(shù)用以測試, 以下修改后的 的代碼 Car1.java 。public class Car1/ 位置int position;/ 速度int speed;/ 運動void move() System.out.println("is moving");/停止void stop() System.out.println("is Stopped");public static void main(String args)Car1 c = new Ca

44、r1();c.position = 10;c.speed = 80;c.move();在 Eclipse 中運行該程序得到如下輸出:is moving我們在 main 函數(shù)中,通過 new 語句得到了一個 Car1 的對象,該對象的引用被存放在變量 c 中,之 后我們通過變量 c 為得到的這個對象屬性賦值并調(diào)用其相應的函數(shù)。注意在 Java語言里變量 c 存放的是當前對象的引用, 通過這個引用我們可以找到內(nèi)存中真正存放這 個對象的那段空間,從而修改相應的屬性或者調(diào)用相應的方法。這也是Java 與其他語言的區(qū)別,在 Java里面舍棄了繁瑣的地址操作,簡化了編程過程。在上面的例子中,我們把對象屬性

45、的初始化放到了外面,其實我們完全可以在 new 語句的過程中就 執(zhí)行該初始化動作,請看修改后的代碼 Car2.java 。public class Car2/ 位置int position;/ 速度int speed;Car2()position = 10;speed = 80;/ 運動void move() System.out.println("is moving");/停止void stop() System.out.println("is Stopped");public static void main(String args)Car2 c =

46、 new Car2();c.move(); 在這段代碼里面我們把初始化的動作放到了默認構造函數(shù)中處理。我們是否有這樣的疑問那,為什么叫默認構造函數(shù)?首先 Java 里面規(guī)定這種與類的名字相同并且沒有返回值得函數(shù)就叫做構造函數(shù), 如 果構造函數(shù)又沒有什么輸入?yún)?shù),我們就稱其為默認構造函數(shù)。對于一個類來說,默認構造函數(shù)可以不 用顯性定義,系統(tǒng)會為其指定一個只有空方法體的構造函數(shù),就像Car1.java 中, new 語句會調(diào)用系統(tǒng)的默認構造函數(shù)。同樣的我們也可以定義帶參構造函數(shù),請看修改后的代碼Car3.java 。public class Car3/ 位置int position;/ 速度int

47、 speed;Car3(int position,int speed )this.position = position; this.speed = speed;/ 運動void move() System.out.println("is moving");/停止void stop() System.out.println("is Stopped");public static void main(String args)Car3 c = new Car3(10,80);c.move();此時我們 new 語句調(diào)用了帶參的構造函數(shù)。需要強調(diào)的一點是,如果

48、指定了帶參的構造函數(shù)之后就 不會再存在一個空方法體的默認構造函數(shù), 也就是說像 Car3 這個類就不能通過 new Car3() 的方式實例化 對象。接下來我們討論一下構造次序,其實在屬性聲明的位置我們可以加入賦值語句,如代碼Car4.java 。public class Car4/ 位置int position = 1;/ 速度int speed = 1;/構造函數(shù)Car4(int position,int speed )this.position = position;this.speed = speed;/ 運動void move() System.out.println("i

49、s moving");/停止void stop() System.out.println("is Stopped");public static void main(String args)Car4 c = new Car4(10,80);c.move();我們在調(diào)用 new 語句時,系統(tǒng)先為該對象分配內(nèi)存空間,此時屬性 position 和 speed 取整數(shù)型的默 認值 0,接著又均被賦值為 1,然后進入構造函數(shù)的賦值語句分別被賦值為10和 80。理解對象的構造次序對我們掌握其內(nèi)部實現(xiàn)機制起著非常重要的作用,往往我們在解決一些底層問 題的時候需要的就是這種技巧

50、。2.3.3 用 package 封裝工具類和用 import 引入需要的類在大型的 Java 項目開發(fā)中我們會根據(jù)現(xiàn)實世界的對象并結合實際需求抽象出程序中所需的類, 這些 類的數(shù)量非常的龐大,因此如何來有效的管理好這些類就顯得尤為重要了。Java 里面提供了 package 關鍵字幫助我們對類進行分類存放。比如我們有錘子、斧子兩個工具,為了管理方便我們不妨給他們存放 在一個叫做工具的目錄下面。因此在我們的 tools 的目錄下面就存放了 Sinker.java 和 Axe.java 這兩個類。package tools;public class Sinker 和package tools;p

51、ublic class Axe 注意,這兩個類一定要存放在 tools 目錄下面,并且,在類的定義里面關鍵字 package 一定要出現(xiàn)在 除了注釋語句的第一行位置,否則在編譯的時候系統(tǒng)會提示異常。并且,在使用package 里,可以用“ .”來表示目錄的嵌套,即如果一個類存放在 a 目錄下的 b 目錄下的 c 目錄那么在類的第一行一定要寫成 “ package a.b.c;”。如果我們想要使用某個包中的類應該如何來操作哪?Java 里面的關鍵字 import 提供了這個功能。比如我們有個木匠類 Carpenter.java 想使用這兩個工具類就可以這么來定義。import tools.*;p

52、ublic class Carpenterpublic static void main(String args)Axe a = new Axe();Sinker s = new Sinker();注意這里的“ * ”表示引用 tools 目錄下的所有的類(因為兩個類都用到了為了簡單起見我們就使用 了簡寫形式), import 語句也可以存在多個,上面的例子中我們可以把 import 語句改寫成:import tools.Axe;import tools.Sinker;表示引用了 tools 目錄下的 Axe 和 Sinker 兩個定義好的類。2.3.4 修飾符與類內(nèi)部對象的可見性以上文的汽車

53、類為例,在使用汽車時,我們不必關心諸如汽車內(nèi)部“發(fā)動機如何點火”和“沖程氣 缸如何工作等細節(jié)”,同樣地,汽車制造廠商也不可能將這些細節(jié)暴露給使用者。封裝性是類的重要特性,在上例中,汽車類通過公有( public )的方法,向用戶提供了運動( move ) 和停止( stop)的功能。另外,汽車類里的一些屬性和方法,比如“發(fā)動機的狀態(tài)”的屬性和“發(fā)動機的點火”的方法,是 供本類使用的,不能提供給用戶,這些屬性和方法的類型是私有的( private ),類的外部看不到這樣的 屬性和方法。除了這兩種類型的修飾符外,屬性和對象還有第三種“受保護”(protected )類型的修飾符。凡是 被定義成“受

54、保護”的屬性和方法,只能在本類和子類里使用,在類的外部是無法使用的。比如在汽車 類里可以設計一個 protected 類型的“統(tǒng)計保持在最大時速時間”方法,這個方法可以提供給汽車本身和 它的子類“賽車類”使用,而不必提供給汽車的使用者。類的封裝性可以通過上述三種修飾符很好地體現(xiàn),我們可以把實現(xiàn)類功能的方法及其屬性定義成public ,必須把一些描述實現(xiàn)細節(jié)的屬性和方法設置成 private ,可以把想提供給子類的方法和屬性定義 成 protected 。下面的 WholeCar.java 程序詳細講述了各修飾符的用法。class Car/表示汽車內(nèi)部狀態(tài)的變量private int inner

55、Status;/最大時速下的行程數(shù)protected int maxspeedLength;private boolean checkStatus()/檢測汽車內(nèi)部狀態(tài),并設置 innerStatus 的值/.if(innerStatus>0)return true;elsereturn false;public void start()if(checkStatus() = true)System.out.println("Car Start!");elseSystem.out.println("Could not start!");/返回最大時速

56、時的行程數(shù)protected int getMaxSpeedLength()/省略一些業(yè)務細節(jié)/.return maxspeedLength;public class WholeCarpublic static void main(String args)Car car = new Car();/不正確的一些用法/1 企圖訪問私有的屬性和放法/car.checkStatus();/System.out.println(car.innerStatus);/2 企圖訪問收保護的方法,建議別使用/car.getMaxSpeedLength();/只能訪問 car 里的公有方法car.start() ;在這段代碼里,我們首先定義了 Car 這個類,在其中,用于表示汽車內(nèi)部狀態(tài)的 innerStatus 變量是 private 的,表示最大時速下的行程數(shù)的 maxspeedLength 變量是 protected 的,這兩個變量只在 Car 類里 被用到,在外部是不能使用的。另外, Car 里提供了一個 public 類型的 start 方法,用戶可以通過這個方法開動汽車。在 s

溫馨提示

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

評論

0/150

提交評論