摘要本章將目光聚焦在Java的數據類(lèi)型上,通過(guò)本章的學(xué)習,讀者應能熟練定義、使用基本數據類(lèi)型、字符串類(lèi)以及數組。
(2002-08-29 14:09:43)
本章目標:
本章將目光聚焦在Java的數據類(lèi)型上,通過(guò)本章的學(xué)習,讀者應能熟練定義、使用基本數據類(lèi)型、字符串類(lèi)以及數組。
6.1 基本數據類(lèi)型
傳授新知
在Java語(yǔ)言中,數據類(lèi)型可以分為兩大類(lèi):
1)基本類(lèi)型;
2)擴展類(lèi)型。
在本小節中,我們就一起來(lái)學(xué)習一下Java語(yǔ)言的基本數據類(lèi)型。它包括:boolean、char、byte、int、short、long、float、double八種:
類(lèi)型 描述 取值范圍
Boolean 布爾型 只有兩個(gè)值true、false
Char 字符型
Byte 8位帶符號整數 -128到127之間的任意整數
Short 16位無(wú)符號整數 -32768~32767之間的任意整數
Int 32位帶符號整數 -231到231-1之間的任意整數
Long 64位帶符號整數 -263到263-1之間的任意整數
Float 32位單精度浮點(diǎn)數 根據IEEE754-1985標準
Double 64位雙精度浮點(diǎn)數 根據IEEE754-1985標準
表6-1 Java基本數據類(lèi)型一覽表
一些提示:
不象其它程序設計語(yǔ)言,Java語(yǔ)言中的整型的位數是固定的,而不會(huì )根據硬件平臺以及操作系統的不同而不同。
6.1.1 boolean型
在上一章的邏輯運算符中,我們就已經(jīng)看到過(guò)了取值為true和false的變量,這種變量稱(chēng)為boolean型變量。
實(shí)例說(shuō)明
1.首先,我們使用以下命令調用“寫(xiě)字板”程序來(lái)編輯源程序。
|
在寫(xiě)字板中,輸入下面的程序代碼,然后存盤(pán)退出。
源程序:test601.java
|
2.編譯程序,輸入命令:
|
3.編譯完成后,執行這個(gè)程序了。輸入命令:
|
這個(gè)程序的輸出如下圖所示:
.files/6-1.jpg)
圖6-1 程序test601.java的輸出
根據邏輯運算符的計算表可以得出x&&y=true&&false=false;x||y=true||false=true;x^y=true^false=true;!x=!true=false。
傳授新知
6.1.2 char型
char型是用來(lái)表示字母的,它僅能表示一個(gè)單一的字母。通常char型常量必須使用單引號括起來(lái),以與數字區分開(kāi)來(lái)。下面就是一個(gè)char型變量的實(shí)例:
|
char型在Java語(yǔ)言中并不是很常用,因為如果要存儲字符的話(huà),一般使用擴展的數據類(lèi)型string(我們將在下一小節中說(shuō)明)。
6.1.3 整型
在Java語(yǔ)言中,提供了多種整型數據類(lèi)型:byte、short、int、long。它們都是定義了一個(gè)整數,唯一的區別就是它們能夠表示數據的范圍。
能夠表示數據的范圍越大,占用的內存空間也就越大,因此,在程序設計中應該選擇最合適的類(lèi)型來(lái)定義整數。
大家可以根據以下規律,記住它們所占的內存空間:
1) int是最基本的,它占用32位(現代計算機不就是32位機嘛?。?;
2) long,長(cháng)的,也就是比int還長(cháng),它占用64位;
3) short,短的,也就是比short還短,它占用16位;
4) byte,字節,8位組成一個(gè)字節,當然byte就只占8位了。
根據它們所占用的內存空間不同,能夠表示的數字范圍也不同。占用內存空間越大,能夠表示的數字范圍也就越廣。
實(shí)例說(shuō)明
實(shí)例一:
1.首先,我們使用以下命令調用“寫(xiě)字板”程序來(lái)編輯源程序。
|
在寫(xiě)字板中,輸入下面的程序代碼,然后存盤(pán)退出。
源程序:test602.java
|
2.編譯程序,輸入命令:
|
3.編譯完成后,執行這個(gè)程序了。輸入命令:
|
這個(gè)程序的輸出如下圖所示:
.files/6-2.jpg)
圖6-2 test602程序輸出
實(shí)例二:
1.首先,我們使用以下命令調用“寫(xiě)字板”程序來(lái)編輯源程序。
|
在寫(xiě)字板中,輸入下面的程序代碼,然后存盤(pán)退出。
源程序:test603.java
|
2.編譯程序,輸入命令:
|
在編譯這個(gè)程序時(shí),將無(wú)法通過(guò),出現以下問(wèn)題:
.files/6-3.jpg)
圖6-3 編譯test603.java時(shí)出錯信息
這是為什么呢?錯在哪里呢?
由于x是byte型數據,它占用8位空間,最大能夠表示的數是128,而本例中賦給值129,超出了取值范圍,所以導致了編譯錯誤。
傳授新知
6.1.4 浮點(diǎn)型
前面我們學(xué)習了存儲整數的變量數據類(lèi)型,現在我們還看看存儲小數的變量數據類(lèi)型---浮點(diǎn)數。在Java語(yǔ)言中有兩種浮點(diǎn)數類(lèi)型:float、double。
其中float是單精度型,占用32位內存空間,而double是雙精度型,占用64位內存空間。
浮點(diǎn)數:
浮點(diǎn)數這個(gè)名稱(chēng)是相對于定點(diǎn)數而言的,這個(gè)點(diǎn)就是小數點(diǎn)。浮點(diǎn)數就是指小數點(diǎn)可以根據需要改位置。
實(shí)例說(shuō)明
1.首先,我們使用以下命令調用“寫(xiě)字板”程序來(lái)編輯源程序。
|
在寫(xiě)字板中,輸入下面的程序代碼,然后存盤(pán)退出。
源程序:test604.java
|
2.編譯程序,輸入命令:
|
3.編譯完成后,執行這個(gè)程序了。輸入命令:
|
這個(gè)程序的輸出如下圖所示:
.files/6-4.jpg)
圖6-4 test604程序輸出
同樣是7/9,使用float型與使用double型,輸出的結果不同,顯然double型的輸出的數字精度要高得多。
自測練習
1) 以下不屬于基本數據類(lèi)型的有_____________。
a. string b.char c.double d.int
2) 下面數據類(lèi)型中___________占用的空間最大。
a.float b.int c.long d.byte
3) 在程序中有一表達式為short x=64589,程序能夠正常編譯嗎?________。
a.不能 b.能
請說(shuō)明理由:__________________________________。
4) 請寫(xiě)出下列代碼的輸出:
|
________________________________________________________________
5) 閱讀以下程序段,回答問(wèn)題
|
這個(gè)程序能夠編譯通過(guò)嗎?________________
這是因為:_______________________________________________________
6) 請寫(xiě)出下列代碼的輸出:
|
____________________________________________________________________
7) 假設x、y都是float型,分別等于5和7,而x1、y1則是double型,分別等于5.0和7.0,那么x/y與x1/y1的值相等嗎?____________。
a.不等 b.相等
請說(shuō)明理由:______________________________________。
8) 假設x、y都是float型,分別等于5和8,而x1、y1則是double型,分別等于5.0和8.0,那么x/y與x1/y1的值相等嗎?____________。
a.不等 b.相等
請說(shuō)明理由:______________________________________。
請寫(xiě)出檢驗它的程序段。
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
練習答案
1)a string型是字符串型,它不屬于Java的基本數據類(lèi)型。
2)c 其中float占32位空間,int占32位空間,long占64位空間,byte占8位空間,因此是long所占的空間最大。
3)b 不能正常編譯,因為short型的取值范圍是-32768-32767,而在程序中x=64589超出了這一范圍,將導致編譯失敗。
4)true 這個(gè)程序段將輸出true,因為!運算符的優(yōu)先級比^運算符優(yōu)先級高,因此先計算!y,得到false,然后計算true^false,因此得到true。
5)不能,當編譯到byte y=x+5;時(shí)將會(huì )出錯,這時(shí)因為這種等價(jià)于byte y=131;,而byte類(lèi)型的取值范圍是-127~128之間,這樣的定義超出了這一范圍,導致編譯失敗。
6) 131
7) a 不相等,由于5/7都將產(chǎn)生無(wú)限不循環(huán)小數,而float與double兩種數據類(lèi)型的精度不相等,因此將產(chǎn)生不相等的輸出。
8) b 相等,由于5/8將得到0.625,float與double兩種數據類(lèi)型的精度都足以表示這個(gè)值,因些將產(chǎn)生相等的輸出。我們可以使用以下程序來(lái)檢驗:
|
注意:
我們可以使用float x=5,y=8;來(lái)代替float x=5;float y=8。
這個(gè)程序將輸出true,說(shuō)明它們是相等的,驗證了我們的答案。
6.2 字符串類(lèi)
傳授新知
在上一小節中,我們講述過(guò)字符型char,當時(shí)我們告訴大家char型變量只能存儲一個(gè)字符,因此一般并不常用,而是使用string型變量來(lái)保存字符。
string型,是一種用來(lái)存儲字符串的數據類(lèi)型。記得從第一章開(kāi)始就見(jiàn)到過(guò)類(lèi)似于下面的字符串型變量定義:
|
而且,當時(shí)我們還借用了它來(lái)說(shuō)明變量的定義。
我們可以使用兩種方法來(lái)定義一個(gè)字符串:
1) 使用變量定義的方式,例如:
|
2) 使用new操作符,例如:
|
通常,我們使用第1種方法來(lái)定義String變量。
實(shí)例說(shuō)明
實(shí)例一:
1.首先,我們使用以下命令調用“寫(xiě)字板”程序來(lái)編輯源程序。
|
在寫(xiě)字板中,輸入下面的程序代碼,然后存盤(pán)退出。
源程序:test605.java
|
2.編譯程序,輸入命令:
|
3.編譯完成后,執行這個(gè)程序了。輸入命令:
|
這個(gè)程序的輸出如下圖所示:
.files/6-5.jpg)
圖6-5 test605程序輸出
實(shí)例二:
1.首先,我們使用以下命令調用“寫(xiě)字板”程序來(lái)編輯源程序。
|
在寫(xiě)字板中,輸入下面的程序代碼,然后存盤(pán)退出。
源程序:test606.java
|
2.編譯程序,輸入命令:
|
3.編譯完成后,執行這個(gè)程序了。輸入命令:
|
這個(gè)程序的輸出如下圖所示:

圖6-6 test606程序輸出
實(shí)例三:
1.首先,我們使用以下命令調用“寫(xiě)字板”程序來(lái)編輯源程序。
|
在寫(xiě)字板中,輸入下面的程序代碼,然后存盤(pán)退出。
源程序:test607.java
|
2.編譯程序,輸入命令:
|
3.編譯完成后,執行這個(gè)程序了。輸入命令:
|
這個(gè)程序的輸出如下圖所示:

圖6-7 test607程序輸出
實(shí)例四:
1.首先,我們使用以下命令調用“寫(xiě)字板”程序來(lái)編輯源程序。
|
在寫(xiě)字板中,輸入下面的程序代碼,然后存盤(pán)退出。
源程序:test608.java
|
2.編譯程序,輸入命令:
|
3.編譯完成后,執行這個(gè)程序了。輸入命令:
|
這個(gè)程序的輸出如下圖所示:

圖6-8 test608程序輸出
傳授新知
字符串合并:
通過(guò)程序test605.java,我們可以看到一個(gè)表達式:
|
通過(guò)程序的運行結果我們得知,通過(guò)這個(gè)表達式,我們可以完成字符串合并。在本例中,實(shí)現了將字符串firstName與lastName合并,并在中間加上一個(gè)空格,形成一個(gè)新的字符串fullName。
求字符串長(cháng)度:
有時(shí),我們需要計算出一個(gè)字符串的長(cháng)度,在Java語(yǔ)言中提供了一個(gè)方法length()可以滿(mǎn)足這個(gè)需求。它在Java API中定義為:
|
其中,public代表任何外部類(lèi)都可以訪(fǎng)問(wèn)它,使用它;而int則表示這個(gè)函數將返回一個(gè)整數,也就是字符串的長(cháng)度值。
例如,在程序test606.java中,我們定義了一個(gè)名為programOut的字符串變量,然后將字符串“I’m enjoy java program world”賦予了這個(gè)變量。在程序中,通過(guò)調用length得到了這個(gè)字符串的長(cháng)度:28,并且打印到屏幕上。
|
注意,在這里調用length方法的格式:programOut.length。
在字符串中查找:
在字符串操作的程序中,經(jīng)常需要在一個(gè)字符串中查找某一個(gè)單詞,我們可以使用Java語(yǔ)言中的一個(gè)方法indexOf()來(lái)滿(mǎn)足這個(gè)需求。它在Java API中的定義是:
|
同樣,public代表任何外部類(lèi)可以訪(fǎng)問(wèn)它,而int表示它將返回一個(gè)整數值,也就是在字符串中包含要查找的單詞findMe的第一個(gè)出現位置。
在程序test607.java中,我們就使用了這個(gè)函數在字符串:“I’m enjoy java program world”中查找單詞java所在位置。那么,為什么返回值是10呢?這時(shí)因為:
字符串中每個(gè)字符都有一個(gè)在該字符串中的位置。第一個(gè)字符的位置是0,第二個(gè)字符的位置為1,以此類(lèi)推。(注意,是字符,也就是包括數字、字母、標點(diǎn)符號,還包括空格。)所以,java所處在的位置就是10,如下圖所示:

圖6-9 字符串位置示意圖
求子串方法
子串是字符串的一部分。在一些字符串操作的程序中,經(jīng)常會(huì )需要求一個(gè)字符串的子串。我們可以通過(guò)使用Java語(yǔ)言提供的求子串方法substring來(lái)實(shí)現。在Java API中是這樣定義它的:
|
這個(gè)方法的定義很明顯,它是一個(gè)可供所有外部類(lèi)調用的方法(public指定);它將返回一個(gè)字符串(返回值類(lèi)型是String);這個(gè)方法在調用時(shí)必須給參數,參數有兩種形式:
1) 一種是給出開(kāi)始位置,表示從指定的開(kāi)始位置開(kāi)始,直到字符串結束;
2) 另一種是給出開(kāi)始位置和結束位置,表示從指定的開(kāi)始位置開(kāi)始,直到結束位置。
我們從程序test608.java的輸出中就可以很明顯地知道。
自測練習
1) 代碼”Hello,”+”World!!”的結果是什么?________________。
a. “Hello,+World!!” b.出錯
c.”Hello,World!!” d.”Hello, World!!”
2) 返回字符串的長(cháng)度(字符數)的方法是____________。
a.width() b.size() c.length()
3) 若有字符串test=”I love java!”,那么test.indexOf(“java”)=______。
a. 8 b. 7 c.6 d. 5
4) 閱讀以下程序段,回答問(wèn)題:
|
這段程序將產(chǎn)生什么樣的輸出:
___________________________________________________________________
如果把Key的值改為“java”,則程序將輸出什么?
___________________________________________________________________
編寫(xiě)代碼,使用substring方法從字符串programOut中摘出單詞“l(fā)anguage”。
___________________________________________________________________
你能想出更好的完成上一任務(wù)的方法嗎?
___________________________________________________________________
___________________________________________________________________
5) 根據給定的以下代碼:
|
寫(xiě)出產(chǎn)生以下輸出的程序:

圖6-10 練習題圖
___________________________________________________________________
___________________________________________________________________
練習答案
1)c 對于字符串而言,+號完成的功能是字符串合并。第一個(gè)答案“Hello,+World!!”多了個(gè)+,最后一個(gè)答案“Hello, World!!”多了個(gè)空格。
2)c Java語(yǔ)言提供了一個(gè)叫length()的方法,能夠計算字符串的長(cháng)度。
3)b 因為字符串的位置是從0算起的,所有的字母、數字、標點(diǎn)、空格都應計算在內,所以應該為7.
4)§ 這個(gè)程序的輸出是Found key at 2;
§ 如果將key的值改為“java”的話(huà),程序的輸出將變成:Found key at 7;
§ 可以使用程序:
|
§ 可以使用程序:
|
6) 可以使用以下程序:
|
6.3 數組
實(shí)例說(shuō)明
1.首先,我們使用以下命令調用“寫(xiě)字板”程序來(lái)編輯源程序。
|
在寫(xiě)字板中,輸入下面的程序代碼,然后存盤(pán)退出。
源程序:arrayTest.java
|
2.編譯程序,輸入命令:
|
3.編譯完成后,執行這個(gè)程序了。輸入命令:
|
這個(gè)程序的輸出如下圖所示:

圖6-11 arrayTest.java程序輸出
傳授新知
在arrayTest.java程序,我們發(fā)現了兩個(gè)與前面的例子都不相同的變量聲明:
|
這兩個(gè)變量的類(lèi)型與前面講過(guò)的有點(diǎn)不同,它就是本小節的主角----數組。正如我們看到的一樣,數組intArray是由四個(gè)int型常量:30、20、10、-10組成的;而數組stringArray則是由三個(gè)String型常量“first”、“second”、“third”組成的。
數組,是相似元素的有序集合。在一個(gè)數組中的所有元素必須是相同類(lèi)型的。
6.3.1 定義數組
下面,我們就來(lái)仔細地觀(guān)察一下數組的定義:

圖6-12 定義數組格式圖解
正如上圖所示,數組變量的命名同其他任何變量一樣,但是我們利用方括號([ ])表明該變量是一個(gè)數組。定義數組的方式有三種:
1)零數組:表明數組存在,但沒(méi)有值。
|
2)預留空間:為數組預留一些存儲空間,但并未馬上賦值。
|
在這里,我們定義了一個(gè)數組secondArray,并為其預留了夠存放5個(gè)int型數的空間。
3) 一次性完成定義與賦值:
|
注意:
在Java語(yǔ)言中,數組一經(jīng)定義之后就不能夠改變其大小,這與其它程序設計語(yǔ)言中不同,在編程時(shí)一定要注意這點(diǎn)。
6.3.2 訪(fǎng)問(wèn)數組
由于數組中包含了多個(gè)變量,所以訪(fǎng)問(wèn)起來(lái)就一定與變量不相同。在程序arrayTest.java中是這樣訪(fǎng)問(wèn)數組中的內容的:
|
通過(guò)對這個(gè)程序運行結果的觀(guān)察,我們發(fā)現intArray[0]就是數組intArray中的第1個(gè)值:30,intArray[1]則是數組intArray的第2個(gè)值……,以此類(lèi)推。
從中,我們可以總結出,訪(fǎng)問(wèn)數組內容可以使用:
數組名[下標]
下標從0開(kāi)始。
6.3.3 求數組長(cháng)度
在arrayTest.java程序中還有一個(gè)語(yǔ)句,我們沒(méi)有提到,那就是:
|
而從這個(gè)程序的輸出,可以知道這一句輸出的值是3。這句程序的目的是打印出字符串數組stringArray的長(cháng)度。
數組的長(cháng)度是指數組中元素的個(gè)數。
有的讀者閱讀到這里,可能會(huì )覺(jué)得奇怪,字符串數組stringArray的值是:“first”、”second”、”third”,那么為什么長(cháng)度會(huì )是3,而不是5+6+5=16個(gè)呢?請讀者一定要記住,數組長(cháng)度衡量的是元素,它并不管元素是什么。你看,字符串數組stringArray不正是包含3個(gè)字符串嗎!
自測練習
1) 下面中哪個(gè)變量是數組?___________。
a. intArray b. test () c. IamArray{} d.notArray[]
2) 下面表達式中,用來(lái)訪(fǎng)問(wèn)數組中第一個(gè)值的是____________。
a. intArray[1] b.intArray.1 c.intArray[0] d.intArray.0
3) 使用System.out.println(數組名)就可以打印出數組的內容?_______
a.對 b.錯
4) 定義完數組后,我們______根據實(shí)際需要,再動(dòng)態(tài)調整數組大小。
a.不能 b.可以
5) 數組中可以包含什么類(lèi)型的元素?_____________。
a.int型 b.string型 c.數組 d.以上都可以
6) 根據要求,寫(xiě)出程序段:
要求:創(chuàng )建一個(gè)字符串數組weeks,使其包含周一至周日的英文名稱(chēng)。
程序段:
___________________________________________________________________
____________________________________________________________________
7) 閱讀以下程序代碼,回答問(wèn)題:
程序代碼:
|
其中lesson[1]的值是什么?____________________________________
那么class[3]的值呢?____________________________________
如果要將math改成maths的話(huà),應該如何做。
____________________________________________________________________
8) 試著(zhù)運行以下程序,看看得到什么結果:
|
練習答案
1)d 盡管叫notArray,但的確是數組,做為數組必須在后面加上“[]”。
2)c 訪(fǎng)問(wèn)第1個(gè)值應該是使用下標0,也就是intArray[0]。
3)a 這樣不能夠打印出數組的內容。
4)a 在Java語(yǔ)言中,不允許動(dòng)態(tài)修改數組的大小。
5)d 數組中可以包含任何一種數據類(lèi)型,但必須每一個(gè)都是相同的數據類(lèi)型。
6)完成這個(gè)要求的程序是:
|
7) lesson[1]的值為“math”;
class[3]的值為“physical”;
我們可以使用語(yǔ)句將math改為maths:
|
8) 本程序的輸出是:

圖6-13 lianxi603的輸入
在你的機器,產(chǎn)生的輸出可能與它不同,但是格式是類(lèi)似的。這是因為,如何我們這樣地調用,將打印出這個(gè)數組在內存中的地址。
聯(lián)系客服