版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、JJaavvaa 編編程程入入門門理想情況下,在閱讀本書前,你應(yīng)該對 Java 程序語言已經(jīng)有了相當(dāng)程度的掌握。但或許你已經(jīng)很久沒有用 Java,或者你只是想通學(xué)習(xí) Java 知識來進(jìn)行手機(jī)游戲編程。如果你屬于上述情況,那么本教程正是為你準(zhǔn)備的。本教程不是要教你 Java 的所有細(xì)節(jié),因為已經(jīng)有大量的優(yōu)秀書籍在做這些工作。相反,本教程只是想為你提供開發(fā)手機(jī)游戲程序所需的核心 Java 知識。1.1Hello,World!學(xué)習(xí)一門語言的最好方法是直截了當(dāng)?shù)厝タ纯匆粋€真正的程序是如何編寫的。與傳統(tǒng)介紹性的語言實例一樣,這里是一個的 Java 版的經(jīng)典的“Hello,World”程序。class H
2、elloWorld public static void main(String args) System.out.println(Hello, World!);有必要指出的是,這個程序并不是為了在手機(jī)上運(yùn)行而設(shè)計的。記住,本教程是一個一般性的 Java 編程入門,而不是專門針對手機(jī)開發(fā)的。事實上,本教程所涉及的大部分實例都是在 Java 應(yīng)用程序的命令行運(yùn)行的,它們是所有 Java 程序中最簡單的。用 Java 編譯器(javac)編譯 HelloWorld 程序后,你可以在 Java 解釋器中運(yùn)行它了。Java 編譯器生成了一個叫做“HelloWorld.class”的可執(zhí)行文件。這個命名
3、規(guī)則可能看上去有點(diǎn)怪,因為事實上大多數(shù)程序語言都是用.exe 作為可執(zhí)行程序的擴(kuò)展名。Java 偏偏沒有這樣。按照 Java 面向?qū)ο蟮奶匦?,所?Java 程序都存儲在 Java 類中,它們在 Java 運(yùn)行環(huán)境中作為對象被生成并執(zhí)行。在命令行中輸入“java HelloWorld”,就可以運(yùn)行 HelloWorld 程序。如果已經(jīng)安裝了 Java 軟件開發(fā)包( Software Development Kit , SDK ),計算機(jī)屏幕上會顯示出“Hello,World!”。為了徹底理解在 HelloWorld 中發(fā)生的情況,讓我們檢查程序中的每行代碼。首先,必須要明白 Java 非常倚重
4、于類。事實上,HelloWorld 的第一行語句就揭示了 HelloWorld 不僅僅是一個程序,而且是一個類。 通過進(jìn)一步查看類實體中的語句,你可以看到這個類的名稱被定義為HelloWorld。Java 編譯器用這個名稱作為可執(zhí)行輸出類的名字。HelloWorld 類包括一個成員方法。現(xiàn)在,你可以把這個方法看作一個和類關(guān)聯(lián)的標(biāo)準(zhǔn)程序方法。HelloWorld 中這個唯一的方法叫做 main(),如果你曾經(jīng)用過 C 或 C+,那么你應(yīng)該對它很熟悉。類在 Java 解釋器中執(zhí)行時,是從 main()方法開始的。main()方法定義為帶有一個 void 返回類型的“public static”?!?/p>
5、public”意味著該方法可以在類內(nèi)和類外任意地方調(diào)用?!皊tatic”意味 1 Java 編程入門著該方法在這個類的所有實例中都是相同的。返回類型“void”意味著 main()沒有返回值。main()方法只有一個參數(shù) String args。args 是一個 String 對象的數(shù)組,表示程序執(zhí)行時所傳遞的命令行參數(shù)。由于 HelloWorld 沒有使用任何命令行參數(shù),所以可以忽略 args 參數(shù)。在本教程后邊,你可以學(xué)到更多關(guān)于字符串的知識。HelloWorld 類執(zhí)行時會調(diào)用 main()方法。main()只包含一行語句,用來把消息“Hello,World”作為標(biāo)準(zhǔn)輸出流打印到屏幕上,
6、如下所示:System.out.println(Hello, World!);由于對象嵌套,這條語句乍看上去有點(diǎn)混亂。為了幫助你把它弄清楚,我們從右向左來分析這句話。首先注意到這條語句的結(jié)尾是一個分號,它是從 C/C+借用過來的標(biāo)準(zhǔn)的 Java 語法。再左邊可以看到一對括號中的字符串“Hello,World!”,這表明它是一個方法調(diào)用所用到的參數(shù)。實際上,這個被調(diào)用的方法就是 out 對象的 println()方法。println()方法和 C 中的 printf 方法很相似,只不過它是在字符串結(jié)尾附加一行新的字符(n)。out 對象是 System 對象的一個成員變量,用來表示標(biāo)準(zhǔn)輸出流。最
7、后,System 對象是 Java 環(huán)境中封裝系統(tǒng)功能的一個全局對象。這基本上就是 HelloWorld 類的全部內(nèi)容,它是我們的第一個 Java 程序。如果你對 HelloWorld 類的說明還不是很明白,那也沒什么關(guān)系。我們沒有對 Java 語言進(jìn)行說明就開始介紹 HelloWorld,僅僅是為了讓你到實踐中去學(xué)習(xí) Java 代碼。本教程剩下的部分更多是對 Java 語言的基本原理進(jìn)行結(jié)構(gòu)化的討論。1.2標(biāo)記當(dāng)你提交一個 Java 程序給 Java 編譯器時,編譯器解析文本并提取每個單獨(dú)的標(biāo)記。標(biāo)記(token)是語言中對于編譯器有意義的最小元素,它定義了 Java 語言的結(jié)構(gòu)。Java
8、包含的所有標(biāo)記又叫做 Java 標(biāo)記集(Java token set)。Java 標(biāo)記集可以分為 5 類:標(biāo)識符、關(guān)鍵字、字面量(literals)、運(yùn)算符以及分隔符。Java 編譯器也可以識別并丟棄注釋和空白。Java 編譯器在標(biāo)記化一個源文件時丟棄了所有注釋和空白。得到的結(jié)果標(biāo)記被編譯成與機(jī)器無關(guān)的 Java 字節(jié)碼(bytecode),它可以在一個有解釋能力的 Java 環(huán)境中運(yùn)行。字節(jié)碼符合 Java 虛擬機(jī)的要求,Java 虛擬機(jī)把處理器間的差異歸結(jié)成一個虛擬處理器。記住,一個有解釋能力的 Java 環(huán)境可以是 Java 命令行解釋器,也可以是 Java 瀏覽器,還可以是本書大多數(shù)示
9、例所用到的支持 Java 功能的手機(jī)。1.2.1標(biāo)識符標(biāo)識符是表示名字的標(biāo)記。這些名字可以指定給變量、方法和類,使得編譯器能夠唯一地識別它們。程序員為這些標(biāo)識符起了一些有含義的名字。HelloWorld 是一個標(biāo)識符,它分配名稱 HelloWorld 給 HelloWorld.java 源文件中的類。 2 1.2標(biāo)記盡管在 Java 中你可以為標(biāo)識符起一些有創(chuàng)意性的名稱,但是這里還是有些限制。所有 Java 標(biāo)識符都區(qū)分大小寫,而且必須以字母、下劃線(_)或者$開頭。字母包括大寫字母和小寫字母。后邊的標(biāo)識符字符可以包括數(shù)字 0 到 9。對標(biāo)識符還有一個限制是,不能使用我們在下一部分列出的 Ja
10、va 的關(guān)鍵字。表 A.1 是一個合法和不合法標(biāo)識符名稱的對比表。表 A.1合法和不合法的 Java 標(biāo)識符合法不合法HelloWorldHello(uses a space)Hi_MomHi_Mom!(uses a space and punctuation mark)heyDude33heyDude(begins with a numeral)Tallshort(this is a Java keyword)poundage#age(does not begin with letter)除了上述對 Java 標(biāo)識符命名的限制外,你還應(yīng)該遵循以下格式規(guī)范從而使你的程序更加簡單、更加一致。命名
11、多個單詞組成的標(biāo)識符的時候,除了名字中間的每個單詞的首寫字母大寫外,其他全部用小寫,這是 Java 標(biāo)準(zhǔn)的命名規(guī)范。例如,變量 toughGuy 是正確的 Java 格式,而 toughguy、 ToughGuy 和 TOUGHGUY 都不合乎這種格式規(guī)則。這種規(guī)則不是一成不變的,它只是一種應(yīng)該遵循的良好規(guī)則,因為大多數(shù)的 Java 代碼都遵循這個規(guī)則。1.2.2關(guān)鍵字關(guān)鍵字是 Java 為了特定的用途而保留的預(yù)定義標(biāo)識符,只能以受限制的、特定的方式使用。下面列出了 Java 中保留的關(guān)鍵字:abstractdoubleintstrictfpbooleanelseinterfacesuperb
12、reakextendslongswitchbytefinalnativesynchronizedcasefinallynewthiscatchfloatpackagethrowcharforprivatethrowsclassgotoprotectedtransientconstifpublictrycontinueimplementsreturnvoiddefaultimportshortvolatiledoinstanceofstaticwhile除了這些關(guān)鍵字外,Java 還保留了 null,true 和 false 這幾個詞,所以它們也是受限的。 3 Java 編程入門1.2.3字面量
13、以固定不變的方式使用的程序元素,叫做字面量或常量。字面量可以是數(shù)字、字符或字符串。數(shù)字字面量包括整數(shù)、浮點(diǎn)數(shù)和布爾量。字符型字面量總是指一個 Unicode 字符。包括多個字符的字符串也看作是字面量,盡管它們在 Java 中以對象的形式實現(xiàn)。Unicode 字符集是一個 16 位的字符集,它取代了 ASCII 字符集。因為它是 16 位字符集,所以它有足夠的條目來表示其他語言中眾多的符號和字符。1整數(shù)型字面量整數(shù)型字面量是 Java 程序中最常用的字面量。整數(shù)型字面量主要有三種不同的格式:十進(jìn)制、十六進(jìn)制和八進(jìn)制。這些格式對應(yīng)字面量所使用的數(shù)字系統(tǒng)的基本類型。十進(jìn)制字面量的表現(xiàn)形式就是普通的數(shù)
14、字,沒有什么特別注意的地方。十六進(jìn)制數(shù)的表現(xiàn)形式是以 0x 或 0X 開頭,表現(xiàn)方法與 C/C+中很相似。八進(jìn)制數(shù)的表現(xiàn)形式是在數(shù)字前加 0。例如十進(jìn)制數(shù)是 12 的整型字面量在 Java 中用十進(jìn)制表示是 12,用十六進(jìn)制表示是 0xC,用八進(jìn)制表示是 014。整數(shù)型字面量缺省存儲為 int 型,它是 32 位的有符號值。如果你需要一個很大的數(shù),可以在數(shù)字末尾加上 l 或 L,把整型字面量強(qiáng)制存儲為 long 型,如 79L。long 型是 64 位有符號值。2浮點(diǎn)型字面量浮點(diǎn)型字面量指的是像 3.142 這樣帶小數(shù)部分的十進(jìn)制數(shù)。它們可以用標(biāo)準(zhǔn)的或特殊的符號表示,就是說數(shù)字 563.84
15、也可以寫成 5.684e2。同整型字面量不同,浮點(diǎn)型字面量缺省是 64 位的 double 型。如果你知道 64 位沒有必要,也可以選擇使用小一點(diǎn)的 32 位的 float 型。指定為 float 型需要在數(shù)字末尾加上 f 或 F,如 5.6384e2f。如果你是個注意細(xì)節(jié)的人,你也可以明確指明你想為你的字面量選擇 double 型作為存儲單元,如3.142d。但由于浮點(diǎn)數(shù)缺省存儲已經(jīng)是 double 型,這個后綴也就沒什么必要了。因為本教程是 Java 編程的入門基礎(chǔ),所以我介紹了浮點(diǎn)數(shù)字面量。然而,值得注意的是在 MIDP(移動信息設(shè)備平臺,它是手機(jī)所用到的 Java 設(shè)備平臺)中不支持浮
16、點(diǎn)數(shù)據(jù)類型和字面量。換句話說,在 Java 手機(jī)游戲代碼中,不支持 double 型和 float 型。3布爾型字面量如果你使用過 C/C+,那么肯定會非常喜歡布爾型字面量。在 C 中沒有 boolean 型,也沒有布爾型字面量,用整數(shù) 1 和 0 替代布爾型中的真和假。Java 通過提供 boolean 型解決了這個問題, boolean 型有兩種狀態(tài):真或假。無疑,Java 語言中的這兩種狀態(tài)用關(guān)鍵字 true 和 false 表示。在 Java 編程中,布爾型的字面量和整數(shù)型字面量一樣常用,因為它們幾乎出現(xiàn)在每一種類型的控制結(jié)構(gòu)中。當(dāng)你必須表示有兩種可能的值的一個條件或狀態(tài)的時候,boo
17、lean 類型總是你所需 4 1.2標(biāo)記要的類型。在這部分稍后你將了解到更多有關(guān) boolean 類型的知識?,F(xiàn)在,只需要記住兩個布爾型字面量:true 和 false。4字符型字面量字符型字面量表示單個的 Unicode 字符,是由一對單引號括起來。特殊字符(控制字符和不能被打印的字符)用反斜杠(“”)加字符表示。特殊字符的一個典型例子就是n,它在打印輸出時強(qiáng)制從新的一行開始。表 A.2 顯示了 Java 支持的特殊字符。表 A.2Java 支持的特殊字符描述表 示 方 法反斜杠續(xù)行符頭退格b回車r換頁f水平制表符t換行n單引號雙引號”Unicode 字符udddd八進(jìn)制數(shù)ddd一個 Uni
18、code 字面量的例子就是u0048,它是字符“H”的十六進(jìn)制表示。相同字符用八進(jìn)制表示就是110。如果想了解更多有關(guān) Unicode 字符集的信息,可以瀏覽 Unicode 的站點(diǎn)。5字符串字面量字符串字面量表示多個字符,是由一對雙引號括起來。不像本教程中介紹的其他字面量,Java中字符串字面量是通過 String 類來實現(xiàn)的。Java 中對于字符串字面量,先生成 String 類的實例,然后用雙引號括起來的字符指定它的內(nèi)容。從實用角度講,Java 用對象來實現(xiàn)字符串實際上并不重要。這里要提到它的原因是為了說明 Java 正是面向?qū)ο蟮摹?5 Jav
19、a 編程入門1.2.4操作符操作符表示的是對數(shù)據(jù)對象或?qū)ο髨?zhí)行的特定賦值或計算。這些操作數(shù)可以是字面量,變量或者有返回值方法。Java 支持以下操作符:+-*/ %&|& | != ?=+ - = += -= *= /= %= &= |= = != = . ( )僅僅是看看這些操作符,對我們?nèi)绾问褂盟鼈兛赡軒椭淮?。不用?dān)心,在本教程后邊會了解到更多關(guān)于操作符和它們的使用。1.2.5分割符Java 編譯器通過分割符來獲知如何對代碼進(jìn)行分組。例如,一個列表中的項目用逗號分割,就像一條語句中項目列表一樣。Java 支持以下分割符: ; , :1.2.6注釋和空白在本教程前面已經(jīng)知道 Java 編譯
20、器在標(biāo)記化一個源文件時丟棄了所有注釋和空格。你可能想知道“什么是空白?如何支持注釋?”。首先,空白包含空格、制表符和回車。所有空格、制表符和回車都被 Java 編譯器當(dāng)作注釋丟棄。注釋有 3 種不同的定義方式,如表 A.3 所示。表 A.3Java 支持的注釋類型使 用 類 型用 法/* 注釋 */在/*和*/間的所有字符被忽略掉/ 注釋/后到行結(jié)尾的所有字符被忽略掉/* 注釋 */和/*/一樣,只是 javadoc 工具能夠把注釋自動生成文檔如果你用 C 語言編寫程序,那么你對第一種類型的注釋(/* 注釋 */)應(yīng)該很熟悉了。編譯器忽略注釋分割符/*和*/間的所有字符。如你果使用過 C+,那
21、么你第二種類型的注釋(/注釋)也應(yīng)該很熟悉了。編譯器忽略出現(xiàn)在注釋分割符/后到行結(jié)尾的所有字符。這兩種注釋類型是從 C 和 C+中借鑒的。最后一種注釋類型(/* 注釋 */)和 C 的注釋風(fēng)格一樣,只是它能被 Java 文檔生成工具 Javadoc 使用,從源碼中自動生成文檔。下面是使用各類型注釋的一些示例:/* This is a C style comment. */ This is a C+ style comment./* This is a javadoc style comment. */ 6 1.3數(shù)據(jù)類型1.3數(shù)據(jù)類型數(shù)據(jù)類型是任何程序語言都具有的基本概念之一。數(shù)據(jù)類型定義了有
22、解釋信息能力的存儲方法來解釋信息。數(shù)據(jù)類型與內(nèi)存中的存儲變量緊密關(guān)聯(lián),因為一個變量的數(shù)據(jù)類型決定了編譯器如何解釋內(nèi)存中的內(nèi)容。為了在內(nèi)存中產(chǎn)生一個變量,必須要為這個變量聲明一種類型和提供一個唯一標(biāo)識變量的標(biāo)識符。Java 聲明變量的語句如下:Type Identifier , Identifier;聲明語句告訴編譯器在內(nèi)存中為一個名稱為“Identifier”類型為“Type”的變量分配空間。中括號中的可選項 identifier 表明可以聲明多個相同類型的變量,它們彼此間用逗號隔開。最后,在所有 Java 語句中,聲明語句用分號結(jié)束。Java 數(shù)據(jù)類型可以分為兩類:簡單型和復(fù)合型。簡單數(shù)據(jù)類
23、型是核心類型,不是從其他類型派生而來。整型、浮點(diǎn)型、布爾型和字符型都是簡單型。另一方面,復(fù)合型是以簡單型為基礎(chǔ),包括字符串、數(shù)組和通用的接口和類。在本教程后邊可以學(xué)習(xí)到數(shù)組相關(guān)內(nèi)容。1.3.1整數(shù)類型整數(shù)類型用有符號的整數(shù)數(shù)字表示。共有 4 種整數(shù)類型:byte、short、int 和 long。每種類型在內(nèi)存中所占用的空間不同,如表 A.4 所示。表 A.4Java 整數(shù)類型類型占 用 空 間byte8 bitsshort16 bitsint32 bitslong64 bits用前面講過的聲明語法來聲明整數(shù)型的變量。以下是一些整數(shù)型變量的聲明示例:int i;short rocketFuel
24、;long angle, magnitude;byte red, green, blue;1.3.2浮點(diǎn)類型浮點(diǎn)數(shù)類型用帶小數(shù)部分的數(shù)字表示。這里有兩種浮點(diǎn)類型:float 和 double。float 類型存儲 32 位單精度數(shù)字,double 型存儲 64 位雙精度數(shù)字。浮點(diǎn)型變量的聲明和整數(shù)型變量的聲明非常相似。以下是一些浮點(diǎn)型變量的聲明示例: 7 Java 編程入門float temperature;double windSpeed, barometricPressure;在 MIDP 中不支持 double 型和 float 型,所以在 Java 中開發(fā)手機(jī)游戲時也不能使用。這并不是
25、太可怕的限制,因為浮點(diǎn)計算效率太差,所以在游戲開發(fā)中才不能使用。1.3.3布爾型布爾型(boolean)用于存儲兩種狀態(tài)之一:真或假。你可以把 boolean 型當(dāng)作一位的整數(shù)(因為 1 位可以表示兩個可能的值:1 或 0)。然而,不是用 1 和 0 表示,而是用 Java 中的關(guān)鍵字 true和 false 表示。用 boolean 型聲明布爾值:boolean gameOver;1.3.4字符類型字符數(shù)據(jù)類型用于存儲一個 Unicode 字符。因為 Unicode 字符集是由 16 位值組成,所以 char 類型被存儲為 16 位無符號整數(shù)。生成 char 類型變量的方法如下所示:char
26、 firstInitial, lastInitial;請記住 char 類型只是用來存儲單個字符。如果你有 C/C+背景,你可能試圖生成一個 char 類型數(shù)組來構(gòu)成字符串。Java 中就沒有這個必要了,因為是通過 String 類來處理字符串的。并不是說你不能生成字符數(shù)組,而是說不應(yīng)該把一個字符數(shù)組當(dāng)作字符串來用。C/C+對字符數(shù)組和字符串沒有區(qū)分,但在 Java 中則不然。1.4代碼段和作用域Java 中源代碼用大括號(“”和“”)分成段。在大括號中的內(nèi)容可以作為一個代碼段,或多或少獨(dú)立于括號外的內(nèi)容。代碼段從邏輯上來講不重要,但它們是 Java 語言的語法必要組成部分。如果不用大括號,編
27、譯器很難識別一段代碼在哪里結(jié)束,而另一段代碼從哪里開始。從純粹的美學(xué)角度來講,如果不用大括號,對于你和其他人來說也很難讀懂你的代碼和明白這些代碼要完成的使命。括號用來把有關(guān)系的語句組合在一起。你可以把一對括號間的內(nèi)容當(dāng)成一條語句來執(zhí)行。事實上,對于外層的程序段來說,內(nèi)層的程序段看上去確實像一條語句??墒?,程序段是什么?程序段簡單來說就是一部分的代碼。程序段被組織成層級關(guān)系,則意味著代碼可以劃分成獨(dú)立的程序段嵌套在其他程序段中。一個程序段可以包含一個或多個子程序段。用縮進(jìn)來區(qū)分不同的程序段是 Java 語言中的標(biāo)準(zhǔn)形式。每次你輸入一個新的程序段,就應(yīng)該用一些空格(兩個比較合適)來增加代碼的縮進(jìn)量
28、。當(dāng)你刪除一個程序段,就應(yīng)該減少代碼的縮 8 1.4代碼段和作用域進(jìn)量(退兩格)。這是許多程序語言已形成的習(xí)慣。然而,縮進(jìn)只是形式上的問題,與語言的技術(shù)無關(guān)。即使你沒有做任何的縮進(jìn),編譯器還是能夠產(chǎn)生正確的輸出??s進(jìn)只是為了程序員使用,與編譯器無關(guān),它只是使代碼看上去更加簡單易懂。以下就是 Java 中一個正確的縮進(jìn)程序段。for (int i = 0; i 5; i+) if (i 3) System.out.println(i);以下是沒有縮進(jìn)的相同代碼:for (int i = 0; i 5; i+) if (i 3) System.out.println(i);第一部分代碼通過使用縮進(jìn)
29、使程序條目很清晰,很顯然 if 語句是嵌套在 for 循環(huán)中的。而第二部分代碼對于程序段間的關(guān)系沒有任何看得見的線索。如果不知道 if 語句和 for 循環(huán)也不必?fù)?dān)心,在本教程后邊會學(xué)到很多相關(guān)知識。作用域的概念和程序段關(guān)聯(lián)的很緊密,在 Java 中使用變量的時候它也非常重要。作用域指的是一段程序如何影響變量的生命周期。程序中聲明的每個變量都和作用域相關(guān),也就是說變量只能在程序的特定部分生效。作用域由程序段決定。為了更好地理解程序段,我們再回過頭來看看前邊學(xué)過的 HelloWorld。HelloWorld 類是由兩個程序段組成。外層的程序段是定義 HelloWorld 類的程序段。class
30、HelloWorld .類程序段在 Java 中非常重要。幾乎所有有趣的內(nèi)容都和類有關(guān)或者就屬于一個類。例如,定義在類中的方法就屬于類本身。從語法和邏輯上講,Java 中的每件事情都發(fā)生在類中。再回到HelloWorld,內(nèi)部的程序段定義了 main()方法,如下:public static void main (String args) .內(nèi)部程序段被認(rèn)為是嵌套在外部程序段中的。定義在內(nèi)部程序段中的所有變量都只屬于內(nèi)部程序段,對于外部程序段是不可見的。變量的作用域定義在內(nèi)部程序段中。為了更好的理解作用域和程序段,來看一個 HowdyWorld 類的例子:class HowdyWorld pu
31、blic static void main (String args) int i;printMessage();public static void printMessage () int j;System.out.println(Howdy, World!);HowdyWorld 類包含兩個方法:main()和 printMessage()。通過 HelloWorld 類,我們應(yīng)該很熟 9 Java 編程入門悉 main()方法了。但本例中稍有不同,它定義了一個整數(shù)類型 i 并調(diào)用了 printMessage()方法。printMessage()是一個新的方法,它聲明了一個整數(shù)型變量 j
32、并且打印消息“Howdy,World!”到標(biāo)準(zhǔn)輸出流,就像 HelloWorld 中 main()方法所做的一樣。你可能已經(jīng)知道 HowdyWorld 的輸出結(jié)果和 HelloWorld 相同,因為調(diào)用 printMessage()方法的結(jié)果是現(xiàn)實一行文本信息。你可能沒有注意到在每個方法中所定義的整數(shù)類型的作用域。定義在 main()方法中的整數(shù)變量 i 的作用域限制是在 main()方法內(nèi)。main()方法定義在大括號包含的方法內(nèi)(方法程序段)。同樣,整數(shù)變量 j 的作用域限制是 printMessage()方法內(nèi)。這兩個變量作用域的重要性體現(xiàn)在當(dāng)變量在各自的作用域以外是不可見的。Howdy
33、World 類程序段對于這兩個整數(shù)變量一無所知。而且 main()不知道 j 的任何情況,而 printMessage()也不知道 i 的任何情況。在其他程序段代碼中嵌套程序段代碼時,作用域就變得更加重要。下面的 GoodbyeWorld 類就是變量嵌套在不同作用域的一個很好的示例:class GoodbyeWorld public static void main (String args) int i, j;System.out.println(Goodbye, World!);for (i = 0; i 5; i+) int k;System.out.println(Bye!);整數(shù) i
34、 和 j 的作用域都在 main()中??墒钦麛?shù) k 的作用域限制在 for 循環(huán)中,在這個程序段以外是不可見的。換句話說,i 和 j 在 for 循環(huán)中也是可見的。也就是說作用域的影響是從上到下的,定義在外部作用域的變量在嵌套作用域內(nèi)也是可見和可用的,而定義在嵌套作用域內(nèi)的變量被限制在那個作用域里。在聲明變量時,注意變量的作用域也很重要,它不僅僅是可見度的問題。決定了變量的可見度,也就決定了變量的生命周期。也就是說當(dāng)程序執(zhí)行離開作用域時,變量實際上被釋放了。再看一下 GoodbyeWorld 這個例子:在程序執(zhí)行到 main()方法中時,為整數(shù)變量 i 和 j 分配了存儲空間。當(dāng)進(jìn)入 for
35、 循環(huán)程序段時,為整數(shù) k 分配了存儲空間。當(dāng)程序執(zhí)行完 for 循環(huán)程序段時,k 所占用的內(nèi)存空間被釋放掉,變量也被釋放掉。當(dāng)程序執(zhí)行完 main()時,在它作用域內(nèi)的所有變量 (i 和 j)都被釋放掉。在涉及到類時,變量的生命周期和作用域的概念甚至?xí)兊酶匾?.5數(shù)組數(shù)組是為了存儲相同類型的一列項目所提供的存儲結(jié)構(gòu)。數(shù)組項目既可以是簡單的也可以是復(fù)雜的數(shù)據(jù)類型。數(shù)組也可以是多維的。Java 數(shù)組用中括號來聲明:。下面就是 Java 中一些數(shù)組聲明的例子:int numbers;char letters;long grid; 10 1.7表達(dá)式和操作符如果你熟悉其他語言中的數(shù)組,你可能會
36、對方括號中沒有數(shù)字來指定數(shù)組項目的數(shù)量而感到困惑。Java 不允許在聲明一個變量數(shù)組時指定這個空數(shù)組的大小。通常你必須用 new 操作符明確設(shè)置數(shù)組的大小或在生成數(shù)組時指定一列項目。你既可以在變量類型后,也可以在標(biāo)識符后放置中括號。下面是聲明變量并設(shè)置其大小的兩個示例。一個用到了 new 操作符,一個是在數(shù)組聲明中指定一列項目。char alphabet = new char26;int primes = 7, 11, 13;Java 中也支持像堆棧和哈希表這樣結(jié)構(gòu)更復(fù)雜的項目存儲列表。與數(shù)組不同,Java 中這些結(jié)構(gòu)像類一樣使用。1.6字符串Java 中的字符串是通過調(diào)用一個 String
37、的特殊類來處理的。甚至字面量字符串也是通過一個實例化的 String 類管理的。一個類的實例化簡單講就是一個基于這個類所生成的對象。以下是 Java的 String 類的聲明:String message;String name = Mr. Blonde;1.7表達(dá)式和操作符在生成了變量后,你通常都會想要用它們?nèi)プ鳇c(diǎn)事情。操作符使你能完成對數(shù)據(jù)對象或?qū)ο蟮馁x值或計算。操作符使變量和字面量能夠構(gòu)成表達(dá)式。一個表達(dá)式可以被認(rèn)為是一個程序等式。更正式地說,一個表達(dá)式就是一個或多個數(shù)據(jù)對象(操作數(shù))和零個或多個操作符產(chǎn)生出一個結(jié)果。下面是一個表達(dá)式的例子:x = y / 3;在這個表達(dá)式中,x 和 y
38、 是變量,3 是字面量,=和/是操作符。這個表達(dá)式講述的是變量 y 被3 用除法操作符(/)除,使用賦值操作符(=)將結(jié)果存儲到 x。注意表達(dá)式是從右到左描述的。雖然這種從右到左的表達(dá)式分析方法在顯示賦值操作很有用,但實際上大部分的 Java 表達(dá)式都是從左到右運(yùn)行的。在下一節(jié)你會更好的體會這一點(diǎn)。1.7.1運(yùn)算符的優(yōu)先級即使 Java 表達(dá)式通常是從左到右運(yùn)算,但沒有其他規(guī)則的話,這里仍然會多次出現(xiàn)表達(dá)式結(jié)果不確定的情況。下面這個表達(dá)式說明了這種情況:x = 2 * 6 + 16 / 4; 11 Java 編程入門表達(dá)式嚴(yán)格按照從左到右賦值的話,乘法運(yùn)算符 2*6 首先執(zhí)行,結(jié)果是 12。然
39、后執(zhí)行加法運(yùn)算符 12+16,結(jié)果是 28。然后執(zhí)行除法運(yùn)算符 28/4,結(jié)果是 7。最后執(zhí)行賦值運(yùn)算 x=7,變量 x 的值被指定為 7。如果你對其他語言的運(yùn)算符優(yōu)先級有經(jīng)驗的話,你可能已經(jīng)對這個表達(dá)式的計算產(chǎn)生疑惑,你的理由很充分,因為它錯了。問題就是表達(dá)式使用簡單的從左到右運(yùn)算可能會產(chǎn)生不確定的結(jié)果,因為還有賴于運(yùn)算符順序。這個問題的答案和運(yùn)算符優(yōu)先級相關(guān),它決定了運(yùn)算符運(yùn)算的先后順序。每個 Java 運(yùn)算符都有一個相應(yīng)的優(yōu)先級。下面是 Java 中所有運(yùn)算符按照優(yōu)先級從高到低排列的列表。在這個運(yùn)算符列表中,一個特定行中的所有運(yùn)算符都有同樣的優(yōu)先級。每行的優(yōu)先級水平從上到下遞減。這就意味
40、著運(yùn)算符的優(yōu)級比運(yùn)算符*的高,但和運(yùn)算符()的優(yōu)先級一樣。. ()+ - ! * / % + - = = !=&|?:=表達(dá)式運(yùn)算仍然是從左到右,只不過前提是在相同優(yōu)先級的運(yùn)算符之間。否則,優(yōu)先級高的運(yùn)算符要在優(yōu)先級低的運(yùn)算符之前計算。知道這一點(diǎn),再來看同樣的表達(dá)式。x = 2 * 6 + 16 / 4;在對表達(dá)式使用從左到右計算前,先來看看是否有運(yùn)算符的優(yōu)先級不同。 確實有不同的優(yōu)先級 。 乘法(*)和除法(/)都是最高的優(yōu)先級,而接下來是加法(+),然后是賦值運(yùn)算符(=)。因為乘法和除法運(yùn)算符具有相同的優(yōu)先級,所以從左向右計算。你首先要執(zhí)行乘法運(yùn)算 2*6 結(jié)果是 12。 然后執(zhí)行除法運(yùn)算
41、 16/4,結(jié)果是 4。 執(zhí)行完這兩步運(yùn)算后,表達(dá)式就像這樣:x = 12 + 4;因為加法運(yùn)算符比賦值運(yùn)算符有更高的優(yōu)先級,所以接下來執(zhí)行加法操作 12+4,結(jié)果是 16。最后,執(zhí)行賦值運(yùn)算 x=16,結(jié)果是數(shù)值 16 被賦給變量 x。如你所見,使用操作符優(yōu)先級在表達(dá)式計算中產(chǎn)生不同的結(jié)果。為了從另一個角度支持這個觀點(diǎn),我們再來看一個使用括號分組運(yùn)算的表達(dá)式:x = 2 * (11 - 7);沒有分組的括號的話,應(yīng)該先執(zhí)行乘法運(yùn)算,再執(zhí)行減法運(yùn)算。然而,根據(jù)優(yōu)先級列表,()運(yùn)算符在所有其他運(yùn)算符前。所以先執(zhí)行減法 11-7,生成 4,接下來的表達(dá)式為:x = 2 * 4;表達(dá)式剩余部分是很簡
42、單地乘法運(yùn)算和賦值運(yùn)算,把生成的 8 賦給變量 x。 12 1.7表達(dá)式和操作符1.7.2整數(shù)運(yùn)算符整數(shù)有三種類型的運(yùn)算符可以執(zhí)行:一元運(yùn)算符、二元運(yùn)算符和關(guān)系運(yùn)算符。一元運(yùn)算符只能對一個整數(shù)起作用,二元運(yùn)算符要對兩個運(yùn)算符生效。一元運(yùn)算符和二元運(yùn)算符通常返回整數(shù)結(jié)果。關(guān)系運(yùn)算符雖然是對兩個運(yùn)算符起作用,但是返回結(jié)果不是整數(shù)而是布爾值。一元和二元整數(shù)運(yùn)算符通常返回 int 類型。對于包括 byte、short 和 int 的所有運(yùn)算都是 int。這個規(guī)則只有在一個操作數(shù)是 long 型時才會例外,這種情況下的運(yùn)算結(jié)果是 long 類型。1. 一元整數(shù)運(yùn)算符一元整數(shù)運(yùn)算符只針對單一整數(shù)。表 A.
43、5 列出了一元整數(shù)運(yùn)算符。表 A.5一元整數(shù)運(yùn)算符描述運(yùn)算符自增+自減-負(fù)整數(shù)-按位求補(bǔ)自增和自減運(yùn)算符(+和-)對整數(shù)變量加一和減一。這兩種運(yùn)算符既可以用作前綴形式也可以用作后綴形式。前綴運(yùn)算符在表達(dá)式運(yùn)算前生效,后綴運(yùn)算符在表達(dá)式運(yùn)算完成后生效。前綴一元運(yùn)算符放在變量前,后綴一元運(yùn)算符緊跟在變量之后。下面是這兩種類型的示例:y = +x;z = x-;第一個例子中 x 是自增前綴,也就是說在賦給 y 前 x 要先自增加。第二個例子中的 x 是自減后綴,也就說在賦給 z 以后 x 才會自減少。后一個例子中,x 在自減少前把值賦給 z。一元負(fù)整數(shù)運(yùn)算符(-)用來改變整數(shù)值的符號。這個操作符正像
44、它的名字一樣簡單,如下例所示:x = 8;y = -x;這個例子中,x 指定的字面量值是 8,然后取負(fù),然后賦給 y。結(jié)果值就是-8。Java 中最后一個一元整數(shù)運(yùn)算符是按位求補(bǔ)運(yùn)算符,它執(zhí)行一個整數(shù)的按位取反。按位取反就是說數(shù)字中的每一位都被反轉(zhuǎn)。換句話說,就是所有二進(jìn)制數(shù) 0 變成 1,所有二進(jìn)制數(shù) 1 變成 0??匆粋€與負(fù)數(shù)運(yùn)算符非常相似的一個例子:x = 8;y = x;這個例子中 x 再一次被指定字面量的值為 8,但在賦給 y 前對它按位取反。這意味著什么?好,如果不考慮整數(shù)如何在內(nèi)存中存儲的細(xì)節(jié)的話,它意味著變量 x 的所有位全部取反,生成結(jié)果是十進(jìn)制數(shù)-9。這個結(jié)果和這樣一個事實
45、有關(guān):負(fù)數(shù)在內(nèi)存中通過一種叫做補(bǔ)碼的方式存儲(參 13 Java 編程入門見下面的開發(fā)提示)。整數(shù)數(shù)字以一系列的二進(jìn)制位存儲在內(nèi)存中,這些二進(jìn)制位的值是 0 或 1。如果一個數(shù)字最高位的值是 1,那么這個數(shù)被認(rèn)為是負(fù)數(shù)。因為按位取補(bǔ)把一個數(shù)的所有位求反,包括數(shù)字的符號位(也就是最高位)。2二元整數(shù)運(yùn)算符二元整數(shù)運(yùn)算符對一對整數(shù)生效。表 A.6 列出了二元整數(shù)運(yùn)算符。表 A.6二元整數(shù)運(yùn)算符描述運(yùn)算符加+減乘*除/模除%位與&位或|位異或左移用零來填充右移后所留下的空位加減乘除(+、-、*和/)做了希望它們做的事情。需要注意的是除法運(yùn)算,因為你正在處理的是整數(shù),除法運(yùn)算符返回的是一個整數(shù)約數(shù)。萬一除法結(jié)果中有余數(shù),用模除運(yùn)算符得到余數(shù)。數(shù)學(xué)上用 0 作除數(shù),結(jié)果是一個無限大的值。因為表示無限大的數(shù)字對于計算機(jī)來說是個大問題,所以用 0 作除數(shù)來進(jìn)行除法和模除,結(jié)果會報錯。更具體的說,運(yùn)行過程中會拋出異常。位與、位或和位異或(&、|、)對一個整數(shù)的每一位起作用
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 房車車廂租賃合同范本
- 毛巾管理制度規(guī)范
- 紐約診所制度設(shè)計規(guī)范
- 生態(tài)設(shè)計管理制度規(guī)范
- 規(guī)范快遞包裹管理制度
- 規(guī)范干部職工上網(wǎng)制度
- 數(shù)據(jù)保護(hù)使用規(guī)范制度
- 用制度管人用技術(shù)規(guī)范
- 毛毯管理制度規(guī)范
- 工程維保三方合同
- 地鐵車輛檢修安全培訓(xùn)
- 造血干細(xì)胞移植臨床應(yīng)用和新進(jìn)展課件
- GB/T 10802-2023通用軟質(zhì)聚氨酯泡沫塑料
- 黑布林英語閱讀初一年級16《柳林風(fēng)聲》譯文和答案
- 杰青優(yōu)青學(xué)術(shù)項目申報答辯PPT模板
- 宿舍入住申請書
- 深圳中核海得威生物科技有限公司桐城分公司碳13-尿素原料藥項目環(huán)境影響報告書
- 2023年全國高考體育單招文化考試數(shù)學(xué)試卷真題及答案
- GB/T 28733-2012固體生物質(zhì)燃料全水分測定方法
- GB/T 14404-2011剪板機(jī)精度
評論
0/150
提交評論