版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第3章類的數(shù)據(jù)成員3.1類的數(shù)據(jù)成員概述3.2簡(jiǎn)單數(shù)據(jù)類型的使用方法3.3簡(jiǎn)單數(shù)據(jù)類型的包裝類3.4字符串?dāng)?shù)據(jù)類型的使用方法3.5數(shù)組數(shù)據(jù)類型的使用方法3.6J2SDK幫助文檔的使用3.7Java標(biāo)識(shí)符命名規(guī)范第3章類的數(shù)據(jù)成員學(xué)習(xí)目標(biāo)
掌握標(biāo)識(shí)符與關(guān)鍵字的概念;
掌握簡(jiǎn)單數(shù)據(jù)類型byte、short、int、long、float、double、
char和boolean等的使用方法;
掌握簡(jiǎn)單數(shù)據(jù)類型對(duì)應(yīng)的包裝類的使用方法;
掌握String類型及其常用的操作方法;
掌握數(shù)組的聲明與實(shí)例化,理解數(shù)組的一些高級(jí)操作;
學(xué)會(huì)J2SDK幫助文檔的使用方法;
理解軟件開(kāi)發(fā)中Java語(yǔ)言各種標(biāo)識(shí)符的命名規(guī)則。一個(gè)Java語(yǔ)言程序是由一些基本符號(hào)組成的字符序列,這些字符序列構(gòu)成一個(gè)個(gè)類。在第2章中介紹過(guò),類是一種由用戶定義的新型數(shù)據(jù)類型,與整型或?qū)嵭蛿?shù)據(jù)相比,類是一種復(fù)雜的數(shù)據(jù)類型,所以也稱為構(gòu)造類型。一個(gè)類由表示對(duì)象狀態(tài)的屬性和對(duì)屬性數(shù)據(jù)進(jìn)行操作的方法組成,即類是數(shù)據(jù)成員與方法成員的封裝體。本章介紹類的數(shù)據(jù)成員。3.1類的數(shù)據(jù)成員概述數(shù)據(jù)成員是一個(gè)類的核心內(nèi)容。設(shè)計(jì)類的主要內(nèi)容是設(shè)計(jì)數(shù)據(jù)成員,類中定義的操作也是圍繞著數(shù)據(jù)成員來(lái)進(jìn)行的。同類的對(duì)象之所以互不相同,是由于它們有不同的屬性值(即數(shù)據(jù))。如張三和李四都屬于人類,但他們有很多屬性值是不相同的(如姓名、長(zhǎng)相、體重、愛(ài)好等),所以人們很容易將張三和李四這兩個(gè)不同的對(duì)象區(qū)分開(kāi)來(lái)。3.1.1數(shù)據(jù)成員的定義格式類的數(shù)據(jù)成員也叫屬性成員,或叫字段(field)。在設(shè)計(jì)類時(shí),定義數(shù)據(jù)成員的簡(jiǎn)單格式為 數(shù)據(jù)成員類型數(shù)據(jù)成員名;例如:intsum;
intmath,english;//注意在程序設(shè)計(jì)實(shí)踐中,一般在一行只定義一個(gè)屬性數(shù)據(jù)成員還可在定義時(shí)進(jìn)行賦值初始化,例如:intsum=0;注意:如果一個(gè)數(shù)據(jù)成員在定義時(shí)進(jìn)行了賦值初始化,在執(zhí)行構(gòu)造函數(shù)時(shí)對(duì)該數(shù)據(jù)成員也進(jìn)行了初始化,則該數(shù)據(jù)成員的值為執(zhí)行構(gòu)造函數(shù)時(shí)所賦的值。3.1.2數(shù)據(jù)成員的修飾符數(shù)據(jù)成員的類型前面還可以加修飾符,如第2章介紹的public、private和static。數(shù)據(jù)成員的修飾符可分為存取性修飾符和存在性修飾符兩類。注意:被final修飾的數(shù)據(jù)成員在定義時(shí),一定要賦初值,否則也會(huì)出現(xiàn)編譯錯(cuò)誤。如已有這樣的聲明“finalfloatPI;”,然后在程序的其他地方有賦值語(yǔ)句PI=3.12,這是不允許的。關(guān)于數(shù)據(jù)成員的修飾符問(wèn)題在第5章中還要詳細(xì)介紹。3.2簡(jiǎn)單數(shù)據(jù)類型的使用方法數(shù)據(jù)是一個(gè)類的核心,類中定義的數(shù)據(jù)要有確定的數(shù)據(jù)類型。數(shù)據(jù)類型可以是簡(jiǎn)單類型(如整型、實(shí)型等),也可以是復(fù)雜類型(如類類型、字符串、數(shù)組等)。本節(jié)介紹簡(jiǎn)單數(shù)據(jù)類型。3.2.1簡(jiǎn)單數(shù)據(jù)類型簡(jiǎn)單數(shù)據(jù)類型在Java語(yǔ)言中也叫原始數(shù)據(jù)類型或基本數(shù)據(jù)類型。Java語(yǔ)言中定義了四類(八種)基本數(shù)據(jù)類型:●整型:byte、short、int和long●浮點(diǎn)型:double和float●字符型:char●邏輯型:boolean每一種數(shù)據(jù)類型有該類型的常量與該類型的變量。每種數(shù)據(jù)類型只能進(jìn)行一些確定的運(yùn)算,如邏輯型只進(jìn)行邏輯運(yùn)算。注意:所有Java編程語(yǔ)言中的整數(shù)類型都是帶符號(hào)的數(shù)。
1.整型整型數(shù)據(jù)類型分為四種:byte、short、int和long。這些不同整型數(shù)據(jù)類型的意義在于它們所占用的內(nèi)存空間大小不同,這也表明它們所能表示的數(shù)值范圍不同。每種整型數(shù)據(jù)類型的取值范圍如表3-1所示。表3-1整數(shù)類型數(shù)據(jù)整數(shù)類型的數(shù)據(jù)可以使用十進(jìn)制、八進(jìn)制或十六進(jìn)制表示,具體表示方法如下:●十進(jìn)制:用非0開(kāi)頭的數(shù)值表示,如100和-50等;●八進(jìn)制:用0開(kāi)頭的數(shù)值表示,如017等;●十六進(jìn)制:用0x或0X開(kāi)頭的數(shù)值表示,數(shù)字10~15分別用字母“A、B、C、D、E和F表示”(也可以使用小寫(xiě)字母a~f),如0x2F、0Xabc等。注意1:Java缺省的整數(shù)常量類型為int類型,用4個(gè)字節(jié)表示。如果要表示long類型整數(shù)常量,則需要給整數(shù)加后綴L或l,表示為長(zhǎng)整數(shù)。例如123456L,如果直接寫(xiě)為123456,則系統(tǒng)會(huì)認(rèn)為是int類型數(shù)據(jù)。注意2:與其他語(yǔ)言(如C語(yǔ)言)不同,Java語(yǔ)言每種整數(shù)類型的長(zhǎng)度(即占用的字節(jié)數(shù))在任何系統(tǒng)中都是一樣的。這也是為了保證Java語(yǔ)言的跨平臺(tái)性。
2.實(shí)型實(shí)數(shù)數(shù)據(jù)類型是帶小數(shù)部分的數(shù)據(jù)類型,也叫浮點(diǎn)型。Java語(yǔ)言中包括兩種浮點(diǎn)型數(shù)據(jù):●?float:?jiǎn)尉葘?shí)數(shù),長(zhǎng)度為4字節(jié)(即32位);●?double:雙精度實(shí)數(shù),長(zhǎng)度為8字節(jié)(即64位)。實(shí)型數(shù)據(jù)還可以用科學(xué)計(jì)數(shù)法表示,如123e3或123E3,其中e或E之前必須有數(shù)字,且e或E后面的指數(shù)必須為整數(shù)。注意1:Java缺省的浮點(diǎn)型常數(shù)為double型。如果要表示float型常量,則要給數(shù)據(jù)加后綴F或f。例如12.34f,若直接寫(xiě)為12.34,則系統(tǒng)認(rèn)為是雙精度實(shí)數(shù)。在程序中,如果寫(xiě)floatf=3.14;將產(chǎn)生編譯錯(cuò)誤。注意2:如果要表示double型,則要給數(shù)據(jù)加后綴D或d(由于系統(tǒng)默認(rèn)的浮點(diǎn)型常數(shù)為double型,因此也可以不加后綴D或d),如-0.23453D,1.4E+30d。
3.邏輯型邏輯值有兩種狀態(tài),即人們常說(shuō)的“開(kāi)”和“關(guān)”、“成立”和“不成立”、“是”和“否”等。在Java語(yǔ)言中,這樣的值用boolean(布爾)類型來(lái)表示。boolean型有兩個(gè)文字值,即true和false,分別表示“真”和“假”。布爾型變量在程序中的使用方法舉例說(shuō)明如下:booleanaBooleanVar;//說(shuō)明aBooleanVar為boolean型變量booleanisStudent=false;//說(shuō)明變量isStudent是boolean型,并賦以初值false注意:Java語(yǔ)言中不可將布爾類型看成整型值(這與C和C++語(yǔ)言不同)。
4.字符型
Java語(yǔ)言中,字符型是用單引號(hào)括起來(lái)的一個(gè)字符,程序中使用char類型表示。由于Java語(yǔ)言的字符采用Unicode碼,因此一個(gè)字符在計(jì)算機(jī)內(nèi)用16位二進(jìn)制數(shù)表示,即占兩個(gè)字節(jié)。正因?yàn)槿绱耍址偷臄?shù)據(jù)在書(shū)寫(xiě)時(shí),可用以\u開(kāi)頭的4位十六進(jìn)制數(shù)表示,范圍從?'\u0000'?到?'\uFFFF'。具體一個(gè)字符型的量,在程序中可以用下面幾種方式表示:
(1)用Unicode碼表示。如字符型變量letter的值為‘A’,則可以寫(xiě)為charletter='\u0041';
(2)用ASCII碼表示。對(duì)于字符型的量,由于大多數(shù)計(jì)算機(jī)系統(tǒng)使用ASCII碼表示,而Unicode碼中包含了ASCII碼,因此在Java程序中,為了簡(jiǎn)便,大多數(shù)程序員仍使用ASCII字符的書(shū)寫(xiě)習(xí)慣,如字符型變量letter的值為'A',則可以寫(xiě)為charletter='A';它與上面用Unicode碼書(shū)寫(xiě)的語(yǔ)句是等價(jià)的。
(3)用整數(shù)表示字符。因?yàn)樽址偷牧吭谟?jì)算機(jī)內(nèi)本質(zhì)上保存的是一個(gè)兩個(gè)字節(jié)的整數(shù),所以字符型變量的取值也可以使用整型常數(shù)(注意不能使用整型的變量),如字符型變量letter的值為'A',則可以寫(xiě)為charch=65;但要注意,下面的程序片段是錯(cuò)誤的:inta=65;charch=a;如要正確編譯,只有使用強(qiáng)制類型轉(zhuǎn)換(本節(jié)后面介紹):inta=65;charch=(char)a;注意:在將一個(gè)整數(shù)賦給一個(gè)字符變量時(shí),整數(shù)的取值范圍要在0~65535之間(即兩個(gè)字節(jié)可以表示的無(wú)符號(hào)數(shù)據(jù)范圍)。如果超出這個(gè)范圍,將產(chǎn)生編譯錯(cuò)誤。
(4)用轉(zhuǎn)義字符。Java語(yǔ)言也允許用轉(zhuǎn)義字符表示一些特殊的字符。之所以叫轉(zhuǎn)義字符,是因?yàn)橐苑葱备?\)開(kāi)頭,將其后的字符轉(zhuǎn)變?yōu)榱硗獾暮x。如用字符變量Tab表示制表符,則可以寫(xiě)為chartab='\t';//而不是字符t表3-2是幾個(gè)常用的轉(zhuǎn)義字符。表3-2常用的轉(zhuǎn)義字符
5.數(shù)據(jù)類型轉(zhuǎn)換在同一表達(dá)式中,有不同的數(shù)據(jù)類型要參與運(yùn)算時(shí),要進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換。
(1)自動(dòng)類型轉(zhuǎn)換。整型、實(shí)型、字符型數(shù)據(jù)可以混合運(yùn)算,例如:floata=65+'a'+23.23f;運(yùn)算過(guò)程中,不同類型的數(shù)據(jù)會(huì)自動(dòng)轉(zhuǎn)換為同一種數(shù)據(jù)類型(如上面語(yǔ)句中的數(shù)都將轉(zhuǎn)換為float類型),然后進(jìn)行運(yùn)算。自動(dòng)轉(zhuǎn)換的數(shù)據(jù)類型要兼容,并且轉(zhuǎn)換后的數(shù)據(jù)類型比轉(zhuǎn)換前的數(shù)據(jù)類型表示的數(shù)值范圍大。自動(dòng)轉(zhuǎn)換按低級(jí)類型數(shù)據(jù)(指數(shù)據(jù)范圍小、精度低)轉(zhuǎn)換成高級(jí)類型數(shù)據(jù)(指數(shù)據(jù)范圍大、精度高)的規(guī)則進(jìn)行。轉(zhuǎn)換規(guī)則如表3-3所示。表3-3轉(zhuǎn)換規(guī)則注意1:boolean類型量不能與其他類型量之間相互轉(zhuǎn)換。注意2:byte和short類型的數(shù)據(jù)計(jì)算結(jié)果為int型。
(2)強(qiáng)制類型轉(zhuǎn)換。在兩種情況下,需要使用強(qiáng)制類型轉(zhuǎn)換:●高級(jí)別數(shù)據(jù)類型要轉(zhuǎn)換成低級(jí)別數(shù)據(jù)類型?!駷榱颂岣哌\(yùn)算結(jié)果的精度。如有程序段:inta=15;intb=7;floatc=a/b; //運(yùn)算結(jié)果為c=2.0floatd=(float)a/b; //運(yùn)算結(jié)果為c=2.142857強(qiáng)制類型轉(zhuǎn)換的一般格式為:
(類型名)表達(dá)式如有程序段:
inti=356;
byteb;
b=(byte)i;//強(qiáng)制轉(zhuǎn)換后丟失一部分?jǐn)?shù)據(jù),使得b的值為100注意:使用強(qiáng)制類型轉(zhuǎn)換可能會(huì)導(dǎo)致數(shù)值溢出或數(shù)據(jù)精度的下降,應(yīng)盡量避免使用。3.2.2數(shù)據(jù)的運(yùn)算符數(shù)據(jù)的運(yùn)算符表示對(duì)數(shù)據(jù)要進(jìn)行的運(yùn)算方式。運(yùn)算符按其要求的操作數(shù)個(gè)數(shù)分為:●一元運(yùn)算符:參加運(yùn)算的操作數(shù)有一個(gè);●二元運(yùn)算符:參加運(yùn)算的操作數(shù)有兩個(gè);●三元運(yùn)算符:參加運(yùn)算的操作數(shù)有三個(gè)。運(yùn)算符按其功能分為七類:算術(shù)運(yùn)算符、關(guān)系運(yùn)算符、邏輯運(yùn)算符、位運(yùn)算符、條件運(yùn)算符、賦值運(yùn)算符以及一些其他的運(yùn)算符。
1.算術(shù)運(yùn)算符算術(shù)運(yùn)算符用于對(duì)整型數(shù)和實(shí)型數(shù)進(jìn)行運(yùn)算,按其要求的操作數(shù)的個(gè)數(shù)分為一元運(yùn)算符和二元運(yùn)算符兩類。
(1)一元運(yùn)算符(++、--)。一元運(yùn)算符可以位于操作數(shù)的前面,如++x或--x,也可以位于操作數(shù)的后面,如x++、x--等。無(wú)論一元運(yùn)算符位于操作數(shù)的前面或后面,操作數(shù)完成運(yùn)算后,都把結(jié)果賦給操作數(shù)變量。注意:++x或x++整體參加表達(dá)式運(yùn)算時(shí),表達(dá)式的值是不一樣的,這與C語(yǔ)言類似。
(2)二元運(yùn)算符。二元運(yùn)算符有+、-、*、/和%,如兩個(gè)操作數(shù)都是整型,則結(jié)果為整型,否則為實(shí)型。注意1:%運(yùn)算符表示求整除的余數(shù),它要求兩邊的操作數(shù)均為整型,結(jié)果也為整型。注意2:對(duì)于/運(yùn)算,如果兩個(gè)操作數(shù)是整數(shù)時(shí),則結(jié)果也為整數(shù),如17/5=3,5/12=0。如果操作數(shù)中有一個(gè)是實(shí)數(shù),則運(yùn)算結(jié)果為實(shí)數(shù)。
2.關(guān)系運(yùn)算符
Java語(yǔ)言的關(guān)系運(yùn)算符共有七種:==、!=、<、<=、>、>=和instanceof。關(guān)系運(yùn)算符用于關(guān)系表達(dá)式中,一個(gè)關(guān)系表達(dá)式的結(jié)果類型為布爾型,即關(guān)系式成立為true,不成立為false。對(duì)象運(yùn)算符instanceof用來(lái)判斷一個(gè)對(duì)象是否屬于某種類類型,如"Hello"instanceofString結(jié)果為true,表示"Hello"是一個(gè)字符串類型的量。注意1:除了整型數(shù)和實(shí)型數(shù)可以混合出現(xiàn)在關(guān)系運(yùn)算符兩邊外,在一個(gè)關(guān)系運(yùn)算符兩邊的數(shù)據(jù)類型應(yīng)保持一致。注意2:因?yàn)橐粋€(gè)實(shí)數(shù)在內(nèi)存中只能用近似值來(lái)存儲(chǔ),所以應(yīng)該避免將兩個(gè)實(shí)數(shù)進(jìn)行“==”比較。如下面的判斷語(yǔ)句:
if(23.12121f==23.121211f)
System.out.print("23.12121=23.121211");讀者可上機(jī)測(cè)試一下是否會(huì)輸出“23.12121=23.121211”。
3.邏輯運(yùn)算符邏輯運(yùn)算符有六個(gè),它們是:!(非)、&(與)、|(或)、^(異或,即運(yùn)算符兩邊的值相異時(shí)為true,相同時(shí)為false)、&&(短路與)和||(短路或)。
&又稱為無(wú)條件與運(yùn)算符,|又稱為無(wú)條件或運(yùn)算符。使用&和|運(yùn)算符可以保證不管左邊的操作數(shù)是true還是false,總要計(jì)算右邊操作數(shù)的值。例如:計(jì)算false&(12>23)運(yùn)算式的結(jié)果時(shí),盡管從第1個(gè)操作數(shù)的值false就可以得出該表達(dá)式的結(jié)果為false,但系統(tǒng)還是要進(jìn)行(12>23)的運(yùn)算。運(yùn)算符&&和||可以提高邏輯運(yùn)算的速度。例如,在計(jì)算(12>34)&&(a>b)時(shí),因?yàn)?2>34為false,所以可以直接得出表達(dá)式的結(jié)果為false,不再需要計(jì)算運(yùn)算符&&右邊的a>b。在計(jì)算12>4)||(34>23)時(shí),因?yàn)?2>4為true,所以可以直接得出表達(dá)式的結(jié)果為true,不再需要計(jì)算運(yùn)算符||右邊的34>23。因此在邏輯表達(dá)式中,應(yīng)盡量使用&&和||運(yùn)算符,以提高運(yùn)算速度。注意:邏輯運(yùn)算符要求操作數(shù)和結(jié)果值都是布爾型量。
4.賦值運(yùn)算符賦值運(yùn)算符用來(lái)把“=”右邊表達(dá)式的值賦給左邊的變量,即將右邊表達(dá)式的值存放在變量名所表示的存儲(chǔ)單元中,這樣的語(yǔ)句又叫賦值語(yǔ)句。它的語(yǔ)法格式如下:變量名=表達(dá)式;復(fù)合賦值運(yùn)算符有+=(加等于)、-=(減等于)、*=(乘等于)、/=(除等于)、%=(余數(shù)等于)等。注意:賦值號(hào)兩邊的數(shù)據(jù)類型不同時(shí),如果將數(shù)據(jù)類型長(zhǎng)度較短的量賦給數(shù)據(jù)類型長(zhǎng)度較長(zhǎng)的變量,則可以進(jìn)行自動(dòng)類型轉(zhuǎn)換,否則要進(jìn)行強(qiáng)制類型轉(zhuǎn)換。例如:byteMyByte=10;intMyInteger=-1;MyInterger=MyByte;MyByte=(byte)MyInteger;
5.條件運(yùn)算符條件運(yùn)算符是“?:”,它要求有三個(gè)操作數(shù),其格式如下:<布爾表達(dá)式>?<表達(dá)式1>:<表達(dá)式2>第一個(gè)操作數(shù)必須是布爾表達(dá)式,其他兩個(gè)操作數(shù)可以是數(shù)值型或布爾型表達(dá)式。條件運(yùn)算符的含義是:當(dāng)<布爾表達(dá)式>的值為真時(shí),結(jié)果為<表達(dá)式1>的值,否則為<表達(dá)式2>的值。例如:inta=12;intb=34;intmax=(a>b)?a:b;則程序運(yùn)行后,max變量中存放a和b中較大的一個(gè)數(shù)。
6.位運(yùn)算符位運(yùn)算是對(duì)操作數(shù)以二進(jìn)制位為單位進(jìn)行的運(yùn)算,位運(yùn)算的操作數(shù)和結(jié)果都是整型量。位運(yùn)算有七個(gè),它們是:~、&、|、^、<<(左移)、>>(右移)、>>>(不帶符號(hào)的右移)。例如:
inta=12;
intb=7;
intc=a&b;//1100&0111=0100c=4
intc=a|b;//1100|0111=1111c=15
intc=a^b;//1100|0111=1011c=11
intc=a<<2;//1100→110000c=48
intc=a>>2;//1100→0011c=3
7.其他運(yùn)算符●?()?和?[]?運(yùn)算符:括號(hào)運(yùn)算符()的優(yōu)先級(jí)是所有運(yùn)算符中最高的,它可以改變表達(dá)式運(yùn)算的先后順序。在有些情況下,它可以表示方法或函數(shù)的調(diào)用。括號(hào)運(yùn)算符[]是數(shù)組運(yùn)算符(見(jiàn)3.5節(jié))。●.運(yùn)算符:用于訪問(wèn)對(duì)象的成員屬性或成員方法?!?new運(yùn)算符:用于創(chuàng)建一個(gè)新的對(duì)象。
8.運(yùn)算符的優(yōu)先級(jí)運(yùn)算符的優(yōu)先級(jí)由高到低的規(guī)律是:
.()[]→單目運(yùn)算→算術(shù)運(yùn)算→關(guān)系運(yùn)算→邏輯運(yùn)算→?:→=詳細(xì)情況見(jiàn)表3-4。表3-4運(yùn)算符的優(yōu)先級(jí)別3.2.3【案例3-1】解方程
1.案例描述設(shè)計(jì)表示一元一次方程(ax+b=0)的類,并能根據(jù)a的系數(shù)情況求解方程。
2.案例效果案例程序的執(zhí)行效果如圖3-1所示。圖中從第2行開(kāi)始,輸出了4個(gè)不同方程及其解的情況。圖3-1案例3-1的顯示效果
3.技術(shù)分析為了求解一元一次方程ax+b=0,要定義一個(gè)表示一元一次方程的類,其數(shù)據(jù)是a和b,可以進(jìn)行的操作是判斷方程是否有解,如果有解,則求方程的解,并輸出方程式和解的情況。根據(jù)以上分析,設(shè)計(jì)的表示一元一次方程的類應(yīng)該有兩個(gè)私有數(shù)據(jù)成員a和b(對(duì)于私有數(shù)據(jù),一般應(yīng)有設(shè)置器setXXX和讀取器getXXX),有判斷方程是否有解、求解和輸出方程與解的方法成員。因此,該類的設(shè)計(jì)要點(diǎn)是:class方程{
私有數(shù)據(jù)a;
私有數(shù)據(jù)b;
構(gòu)造方法
a的設(shè)置器a的讀取器
b的設(shè)置器b的讀取器判斷方程是否有解的方法求方程解的方法輸出方程與解的方法}
4.程序解析下面是根據(jù)上面的分析設(shè)計(jì)的一元一次方程類Equation,程序中定義的TestEquation類對(duì)Equation類進(jìn)行了測(cè)試。程序如下:01//**************************************02//案例:3.1程序名:TestEquation.java03//功能:表示一元一次方程ax+b=0類04//****************************************0506//一元一次方程類07classEquation{08 //方程的兩個(gè)系數(shù)定義為私有成員09 privatefloata;10 privatefloatb;11 12 //無(wú)參數(shù)的構(gòu)造方法13publicEquation(){}14 15 //有參數(shù)的構(gòu)造方法16 publicEquation(floata,floatb){17 this.a=a;18 this.b=b;19 }20 21 //系數(shù)a的設(shè)置器22 publicvoidsetA(floata){23 this.a=a;24 }25 26 //系數(shù)a的獲取器27 publicfloatgetA(){28 returna;29 }30 31 //系數(shù)b的設(shè)置器32 publicvoidsetB(floatb){33 this.b=b;34 }35 36 //系數(shù)b的獲取器37 publicfloatgetB(){38 returnb;39 }40 41 //判斷方程是否有根的私有方法42 privatebooleanhasRoot(){43 returna!=0;44 }45 46 //求方程根的私有方法47 privatefloatroot(){48 return(-b)/a;49 }50 51 //輸出方程式和根的公有方法52 publicvoidshowEquation(){53 if(hasRoot()){54 if(b>0)55 System.out.println("\n方程式是:"+a+"x+"+b+“
=0,\t其解為x="+root());56 elseif(b<0)57 System.out.println("\n方程式是:"+a+"x-"+
Math.abs(b)+"=0,\t其解為x="+root());58 else59 System.out.println(“\n方程式是:”+a+“x=0,\t\t其解為x="+0);60 }61 else62 System.out.println(“\n因?yàn)橄禂?shù)a=0,\t\t方程式無(wú)效!");63 }64}6566
classTestEquation{67 publicstaticvoidmain(Stringargs[]){68 //建立一個(gè)方程對(duì)象e1,其方程式為1.4x+2.8=069 Equatione1=newEquation(1.4f,2.8f);70 //調(diào)用showEquation方法,輸出e1對(duì)象表示的一元一次方程式和根71 e1.showEquation();72 73 //建立一個(gè)方程對(duì)象e2,其方程的系數(shù)a和b的初始值都為074 Equatione2=newEquation();75 //將系數(shù)b設(shè)置為4,即對(duì)象e2表示的方程式為0x-4
=0,是一個(gè)無(wú)效的方程76 e2.setB(-4);77 //調(diào)用showEquation方法,輸出e2對(duì)象表示的一元一次方程式和根78 e2.showEquation();79 80 //改變e2對(duì)象的系數(shù)a,將其設(shè)置為e1對(duì)象的系數(shù)b,即對(duì)象e2表示的方程式變?yōu)?.8x-4=081 e2.setA(e1.getB());82 e2.showEquation();83 84 //改變e2對(duì)象的系數(shù)b,將其設(shè)置為0,即對(duì)象e2表示的方程式變?yōu)?.8x=085 e2.setB(0);86 e2.showEquation();87 }88}該程序有著比較詳細(xì)的注釋,讀者參考注釋,應(yīng)該很容易讀懂程序。程序中使用了實(shí)型數(shù)據(jù)和布爾型數(shù)據(jù),有簡(jiǎn)單的關(guān)系運(yùn)算與算術(shù)運(yùn)算。關(guān)于this關(guān)鍵詞的含義在下面有詳細(xì)的說(shuō)明。在程序的55行、57行、59行和62行等多處使用了轉(zhuǎn)義符\n和\t,轉(zhuǎn)義符\n在程序中起到換行的作用,轉(zhuǎn)義符\t在程序中起到輸出制表符的作用(類似于按Tab鍵的功能)。因此,程序在輸出一個(gè)方程后即換到下一行,并能將方程的解對(duì)齊輸出,如圖3-1所示。第57行使用了一個(gè)對(duì)數(shù)據(jù)求絕對(duì)值的數(shù)學(xué)函數(shù)Math.abs。類Math中定義的方法都是靜態(tài)的。最后要說(shuō)明的是,在面向?qū)ο蟪绦蛟O(shè)計(jì)中,如果屬性和方法是在類的內(nèi)部使用,則應(yīng)該說(shuō)明為private的,以防止外部訪問(wèn),避免因?qū)Τ绦虻姆欠ú僮鞫钩绦虺鲥e(cuò)。如42行判斷方程是否有根的方法privatebooleanhasRoot()和47行求方程根的方法privatefloatroot(),都因只在類Equation的內(nèi)部使用,所以定義為私有方法。而類的構(gòu)造方法、設(shè)置器、獲取器和輸出方程與解的方法,由于在類的外部要使用,因而被定義為公共的(public)。在面向?qū)ο蟪绦蛟O(shè)計(jì)中,對(duì)外的接口全部應(yīng)用public修飾,即定義為公共的。3.2.4【相關(guān)知識(shí)】this關(guān)鍵字的功能在案例3-1的程序中的多個(gè)方法中使用了關(guān)鍵詞this,如16~19行的代碼中,給方程的系數(shù)a和b提供初值的構(gòu)造方法:16 publicEquation(floata,floatb){17 this.a=a;18 this.b=b;19 }這里的參數(shù)floata和floatb是構(gòu)造方法Equation(floata,floatb)的局部變量,其有效范圍(也叫作用域)是方法Equation(floata,floatb)的內(nèi)部,因此,在Equation類中定義的方程系數(shù)a和b(在案例3-1的第09行和第10行)在方法Equation(floata,floatb)中被隱藏了。也就是說(shuō),在該方法中直接用a和b,則表示使用的是方法參數(shù)中定義的局部變量a和b。當(dāng)一個(gè)對(duì)象在調(diào)用Equation(floata,floatb)方法時(shí),如果要使用屬于該對(duì)象的屬性a和b(也就是在類中定義的a和b),則要在屬性a和b前面加一個(gè)表示對(duì)象中a和b的標(biāo)記,這個(gè)標(biāo)記就是this關(guān)鍵字。在Java語(yǔ)言中,this代表當(dāng)前對(duì)象,主要用來(lái)以“this.成員”的方式引用當(dāng)前對(duì)象的成員。如在案例程序3-1的85行,有一個(gè)方法調(diào)用“e2.setB(0);”,因?yàn)槭峭ㄟ^(guò)e2對(duì)象去調(diào)用方法setB(),所以表明當(dāng)前對(duì)象是e2,即這里的this代表e2對(duì)象。被調(diào)用的方法setB()的程序段如下:32 publicvoidsetB(floatb){33 this.b=b;34 }則33行的this就代表了對(duì)象e2,因此“this.b=b;”就表示將給e2對(duì)象的系數(shù)b賦一個(gè)值,這個(gè)值就是由實(shí)參提供的局部變量b的值。其實(shí),在類中定義的方法,如果使用了屬性字段,則在屬性字段的前面都有一個(gè)默認(rèn)的this,如程序的第28行有一條“returna;”語(yǔ)句,本質(zhì)為“returnthis.a;”,表示返回當(dāng)前對(duì)象的a值,只是由于在27行定義的方法“publicfloatgetA()”中,沒(méi)有使用局部變量a,直接寫(xiě)a不會(huì)造成混亂,所以省略了a前面的this。當(dāng)然,也可以在程序中避免使用this,如該類的構(gòu)造方法也可以寫(xiě)成如下的形式:16 publicEquation(floatp,floatq){17 a=p;18 b=q;19 }這種形式很好理解,但它不符合面向?qū)ο蟮木幊烫攸c(diǎn)。所以,建議還是使用案例3-1中定義的方式。
this還有一種用法,就是調(diào)用該類的其他構(gòu)造方法,其格式是:this([參數(shù)]);如果沒(méi)有參數(shù),則調(diào)用無(wú)參的構(gòu)造方法??聪旅娴氖纠绦颍?1classPoint{02 intx;03 inty;04 05 Point(intx){06 this.x=x;07 }08 09 Point(intx,inty){10 this(x);11 this.y=y;12 }13}程序的第10行使用this調(diào)用了該類的帶一個(gè)參數(shù)的構(gòu)造方法“Point(intx)”。注意1:如果在一個(gè)類的構(gòu)造方法中,使用this調(diào)用了該類的其他構(gòu)造方法,則this調(diào)用只能放在程序的第一行。如果將上述示例程序的第10行和第11行進(jìn)行交換,則程序?qū)l(fā)生編譯錯(cuò)誤。注意2:一個(gè)類的靜態(tài)方法體中不能使用this關(guān)鍵詞。3.3簡(jiǎn)單數(shù)據(jù)類型的包裝類在面向?qū)ο蟪绦蛟O(shè)計(jì)中“一切皆對(duì)象”,而前一節(jié)介紹的簡(jiǎn)單數(shù)據(jù)類型就不是以對(duì)象的形式出現(xiàn)的,這從本質(zhì)上來(lái)說(shuō)不符合面向?qū)ο蟪绦蛟O(shè)計(jì)的思想。但是,簡(jiǎn)單數(shù)據(jù)類型易于理解,可以簡(jiǎn)化程序的書(shū)寫(xiě),所以簡(jiǎn)單數(shù)據(jù)類型在Java語(yǔ)言中有其存在的合理性。盡管如此,有時(shí)在程序中還是要使用以對(duì)象形式表示的簡(jiǎn)單數(shù)據(jù)類型(如一個(gè)方法只能接收以對(duì)象為參數(shù)的調(diào)用),Java語(yǔ)言已經(jīng)考慮到了這個(gè)問(wèn)題,對(duì)每一種簡(jiǎn)單數(shù)據(jù)類型都提供了一個(gè)與之對(duì)應(yīng)的類,這就是所謂簡(jiǎn)單數(shù)據(jù)類型的包裝類,本節(jié)將介紹這些包裝類的知識(shí)。3.3.1包裝類的使用在Java語(yǔ)言類庫(kù)中,為每一種簡(jiǎn)單數(shù)據(jù)類型提供了一個(gè)與之對(duì)應(yīng)的類。從本質(zhì)上來(lái)說(shuō),這些類就是包裝了一個(gè)簡(jiǎn)單類型的數(shù)據(jù),并提供了一些對(duì)數(shù)據(jù)進(jìn)行操作(主要是類型轉(zhuǎn)換)的方法。
1.簡(jiǎn)單數(shù)值類型的包裝類簡(jiǎn)單數(shù)值類型有double、float、byte、int、long和short共6種,它們對(duì)應(yīng)的包裝類如表3-5所示。表3-5簡(jiǎn)單數(shù)值類型的包裝類基本數(shù)據(jù)類型的包裝類還提供了很多非常有用的方法:
(1)將一個(gè)包裝類對(duì)象轉(zhuǎn)換為任意一種簡(jiǎn)單數(shù)據(jù)。
Byte、Double、Float、Integer、Long和Short類都能使用表3-6所示的方法,將其包裝的數(shù)值轉(zhuǎn)化為byte、double、float、int、long和short等簡(jiǎn)單數(shù)據(jù)類型中的任何一種。表3-6包裝類轉(zhuǎn)換為簡(jiǎn)單數(shù)據(jù)的方法如將整數(shù)2包裝為一個(gè)整型類對(duì)象:IntegerI=newInteger(2);使用下面的語(yǔ)句可將其賦給一個(gè)實(shí)型變量:floatf=I.floatValue();//f=2.0
(2)使用toString()方法可以將一個(gè)包裝類中的數(shù)據(jù)轉(zhuǎn)化為字符串。如將實(shí)數(shù)232.34包裝為一個(gè)實(shí)型類對(duì)象:FloatF=newFloat(232.34f);使用下面的語(yǔ)句可將其賦給一個(gè)字符串變量:Stringstr=F.toString();
(3)可以將一個(gè)由數(shù)字組成的字符串轉(zhuǎn)化為簡(jiǎn)單類型數(shù)據(jù)。如將字符串"232"?轉(zhuǎn)化為一個(gè)整數(shù):inti=Integer.parseInt("232");由于這些轉(zhuǎn)換方法都是靜態(tài)方法(即類方法,以static修飾),因此在程序中可以通過(guò)類名直接使用,例如:
floatf=Float.parseFloat("232.12");
doubled=Double.parseDouble("267832.1772");
shorts=Short.parseShort("232");
longl=Long.parseLong("24532");
byteb=Byte.parseByte("24");
(4)將一個(gè)十進(jìn)制整數(shù)轉(zhuǎn)化為其他數(shù)制表示的字符串。
Integer類中定義了將一個(gè)十進(jìn)制整數(shù)轉(zhuǎn)化為其他數(shù)制表示的字符串的方法:●?toBinaryString(inti):以二進(jìn)制無(wú)符號(hào)整數(shù)形式返回一個(gè)整數(shù)參數(shù)的字符串表示形式;●?toHexString(inti):以十六進(jìn)制無(wú)符號(hào)整數(shù)形式返回一個(gè)整數(shù)參數(shù)的字符串表示形式;●?toOctalString(inti):以八進(jìn)制無(wú)符號(hào)整數(shù)形式返回一個(gè)整數(shù)參數(shù)的字符串表示形式。此外,Byte、Double、Float、Integer、Long和Short類都提供了其所對(duì)應(yīng)的簡(jiǎn)單數(shù)據(jù)類型所能表示的最大值和最小值的字段(即類的數(shù)據(jù)成員),字段名分別為MAX_VALUE和MIN_VALUE,這些字段均為靜態(tài)的(以static修飾)。如下面的語(yǔ)句可分別輸出float型數(shù)據(jù)和short型數(shù)據(jù)的最大值和最小值:
System.out.println(Float.MAX_VALUE);
System.out.println(Float.MIN_VALUE);
System.out.println(Short.MAX_VALUE);
System.out.println(Short.MIN_VALUE);
2.布爾類型的包裝類Boolean
Boolean類將基本類型為boolean的值包裝在一個(gè)對(duì)象中。一個(gè)Boolean類型的對(duì)象只包含一個(gè)類型為boolean的字段。此外,此類還為boolean和String的相互轉(zhuǎn)換提供了許多方法,如:●?parseBoolean(Strings):將字符串參數(shù)分析為boolean值;●?toString():返回表示該布爾值的String對(duì)象。
3.字符類型的包裝類Character
Character類在對(duì)象中包裝了一個(gè)基本類型為char的值。此外,該類提供了一些方法,以確定字符的類別(小寫(xiě)字母、數(shù)字等),并提供了將字母由大寫(xiě)轉(zhuǎn)換成小寫(xiě)或由小寫(xiě)轉(zhuǎn)換成大寫(xiě)的方法。常用的方法有:●?charValue():返回此Character對(duì)象包裝的字符值;●?isLowerCase(charch):確定指定字符是否為小寫(xiě)字母;●?isUpperCase(charch):確定指定字符是否為大寫(xiě)字母;●?isDigit(charch):指定字符是否為數(shù)字;●?isLetter(charch):指定字符是否為字母。舉例如下:
System.out.println(Character.isLowerCase('A'));//輸出false
System.out.println(Character.isUpperCase('A'));//輸出true
System.out.println(Character.isDigit('A'));//輸出false
System.out.println(Character.isLetter('A'));//輸出true3.3.2創(chuàng)建包裝類對(duì)象創(chuàng)建包裝類對(duì)象非常簡(jiǎn)單,歸納起來(lái)有如下幾種方法:
(1)使用每個(gè)包裝類的構(gòu)造方法直接創(chuàng)建。例如:
Booleanb3=newBoolean(true);
Characterc3=newCharacter('a');
Integeri3=newInteger(2);
(2)?Java的每個(gè)包裝類都提供了一個(gè)叫valueOf()的靜態(tài)方法,使用該靜態(tài)方法可以很方便地產(chǎn)生包裝類的對(duì)象。例如:Booleanb4=Boolean.valueOf(true);Characterc4=Character.valueOf('a');
(3)使用JDK5.0的“自動(dòng)打包”功能創(chuàng)建。在JDK5.0以后的版本中,為了簡(jiǎn)化包裝類的使用,提供了從基本數(shù)據(jù)類型到包裝類對(duì)象的自動(dòng)轉(zhuǎn)化功能,這就是所謂的“自動(dòng)打包”。例如:Integeri4=3;Booleanb4=true;同時(shí),也提供了從包裝對(duì)象到基本數(shù)據(jù)類型的自動(dòng)轉(zhuǎn)化功能,這就是所謂的“自動(dòng)解包”。例如:Floatf4=3.34f;System.out.println(f4*34);按照J(rèn)ava語(yǔ)言的語(yǔ)法,一個(gè)對(duì)象f4是不能與一個(gè)整數(shù)34相乘的,但“自動(dòng)解包”功能可以將對(duì)象f4中包裝的實(shí)型數(shù)3.34取出,然后完成與另外一個(gè)數(shù)相乘的運(yùn)算。3.3.3【案例3-2】數(shù)制轉(zhuǎn)換器
1.案例描述編寫(xiě)一個(gè)將十進(jìn)制整數(shù)轉(zhuǎn)換為其他進(jìn)制整數(shù)的類。程序執(zhí)行時(shí),輸入一個(gè)整數(shù)后,將其分別轉(zhuǎn)換為二進(jìn)制、八進(jìn)制和十六進(jìn)制后輸出。
2.案例效果案例程序執(zhí)行的效果如圖3-2所示(注意,窗口中第1行所示的內(nèi)容)。在執(zhí)行程序時(shí),從命令行輸入的十進(jìn)制數(shù)為99,第2次執(zhí)行程序時(shí)輸入的十進(jìn)制數(shù)為78446。圖3-2案例3-2的執(zhí)行結(jié)果
3.技術(shù)分析編寫(xiě)該程序時(shí),可以自己定義一個(gè)包裝整數(shù)的類,在類中定義一個(gè)私有成員,存放將要轉(zhuǎn)換的整數(shù),設(shè)計(jì)一個(gè)用于將十進(jìn)制整數(shù)轉(zhuǎn)換為二進(jìn)制、八進(jìn)制和十六進(jìn)制數(shù)的方法。
4.程序解析下面是案例3-2的程序代碼。01//*****************************************02//案例:3.2程序名:IntWrap.java03//功能:將一個(gè)整數(shù)以不同的數(shù)制輸出04//*******************************************0506publicclassIntWrap{07 privateinti;08 09 publicIntWrap(){}10 11 publicIntWrap(inti){12 this.i=i;13 }14 15 publicStringshowNumber(){16 return"\n二進(jìn)制:"+Integer.toBinaryString(i)+17 "\n八進(jìn)制:"+Integer.toOctalString(i)+18 "\n十六進(jìn)制:"+Integer.toHexString(i);19 }20 21 publicstaticvoidmain(Stringargs[]){22 //從命令行輸入的整數(shù),被自動(dòng)保存在字符串?dāng)?shù)組args中,其中第1個(gè)字符串保存在args[0]中23 intt=Integer.parseInt(args[0]);24 IntWrapc=newIntWrap(t);25 System.out.println("十進(jìn)制:"+t+c.showNumber());26 }27}該程序比較簡(jiǎn)單,請(qǐng)讀者自己分析。3.3.4【相關(guān)知識(shí)】包本節(jié)介紹了簡(jiǎn)單數(shù)據(jù)類型的包裝類,這些類是Java語(yǔ)言標(biāo)準(zhǔn)類庫(kù)中已經(jīng)定義好的,可以在程序中直接使用。為了方便用戶編程,Java語(yǔ)言不但定義了簡(jiǎn)單數(shù)據(jù)類型的包裝類,還定義了大量的、各種功能的其他類,這些類的組織與管理是Java語(yǔ)言中一個(gè)很重要的內(nèi)容。
1.為什么要使用包首先,不同功能的類可能使用了相同的類名,這樣會(huì)引起混亂。如一個(gè)類的類名為Table,一個(gè)編程人員用它表示一個(gè)有關(guān)表格類的類名,而另一個(gè)編程人員用它表示一個(gè)有關(guān)桌子的類。其次,如果將標(biāo)準(zhǔn)類庫(kù)中的幾千個(gè)類放在同一個(gè)文件夾中,則不便于用戶查找與使用。因此,在Java語(yǔ)言中,標(biāo)準(zhǔn)類庫(kù)中的類都被放在一個(gè)個(gè)包中,也就是說(shuō)每一個(gè)類都屬于一個(gè)特定的包,如簡(jiǎn)單數(shù)據(jù)類型的包裝類位于java.lang包中。
2.什么是包包(Package)是將一組相關(guān)類組織起來(lái)的集合。使用包的好處是:
(1)使得功能相關(guān)的類易于查找和使用(同一包中的類通常是功能相關(guān)的)。
(2)避免了命名的沖突(不同包中,可以有同名的類)。
(3)提供一種訪問(wèn)權(quán)限的控制機(jī)制(一些訪問(wèn)權(quán)限以包為訪問(wèn)范圍,在第5章中介紹)。包在操作系統(tǒng)下其實(shí)與文件目錄相對(duì)應(yīng),如圖3-3所示的簡(jiǎn)單數(shù)據(jù)類型的包裝類在java.lang包中,則對(duì)應(yīng)操作系統(tǒng)下相應(yīng)java目錄中的lang目錄,在lang目錄中有Boolean、Byte等類。圖3-3包結(jié)構(gòu)示意圖
3.包的創(chuàng)建創(chuàng)建一個(gè)包很簡(jiǎn)單,只需在定義了類的源程序文件的第一行使用package語(yǔ)句即可。其格式為
package包名;程序中使用了該語(yǔ)句后,在當(dāng)前文件夾下就應(yīng)該創(chuàng)建與該包名對(duì)應(yīng)的目錄結(jié)構(gòu),以存放這個(gè)包中定義的所有類編譯后的字節(jié)代碼文件(.class文件)。例如,在下面的Java程序中定義了兩個(gè)類A和B(類的內(nèi)容可以為空,這在Java程序中是允許的):01packagea.b.c;02classA{03 publicstaticvoidmain(Stringargs[]){04 System.out.println("packageexample.");05 }06}07classB{}程序文件名為A.java時(shí),直接使用下面的編譯命令將不能創(chuàng)建與包名對(duì)應(yīng)的目錄結(jié)構(gòu):javacA.java在這種情況下,需要用戶手工創(chuàng)建與包名對(duì)應(yīng)的目錄結(jié)構(gòu),并將編譯后的字節(jié)代碼文件復(fù)制到相應(yīng)的目錄中。使用下面帶參數(shù)“-d”的編譯命令:javac-d.A.java在編譯通過(guò)后,會(huì)自動(dòng)建立與包名對(duì)應(yīng)的目錄結(jié)構(gòu),并將字節(jié)代碼文件放入包中,如圖3-4所示。圖3-4包結(jié)構(gòu)圖使用包時(shí)要注意以下問(wèn)題:
(1)編譯包的命令為“javac-d要?jiǎng)?chuàng)建包的父目錄?*.java”(該例中用“.”代替程序文件所在的當(dāng)前目錄)。
(2)包名中的層次要用“.”分隔。
(3)一個(gè)包創(chuàng)建好后,在執(zhí)行時(shí)要帶包名。如執(zhí)行上面程序的命令為:javaa.b.c.A
(4)前面所有的案例中都沒(méi)有創(chuàng)建包(即省略了package語(yǔ)句),則Java系統(tǒng)認(rèn)為類在默認(rèn)包中,即當(dāng)前目錄。所以,可以認(rèn)為任何一個(gè)Java類都在某個(gè)包中。
(5)?package語(yǔ)句只能是一個(gè)源程序文件中的第1條語(yǔ)句(程序中的注釋和空行除外)。也可以這樣說(shuō),一個(gè)源程序文件中只能有一條package語(yǔ)句。
(6)在工程實(shí)踐中,包名常用公司名或公司的網(wǎng)址,這樣可以保證全世界Java程序員設(shè)計(jì)的類不會(huì)發(fā)生命名沖突,如com.sun.swing、com.borland.jdbc等。
4.包中類的引用方法在一個(gè)程序中若要使用另一個(gè)包中的類,則可以使用如下兩種方式:
(1)長(zhǎng)類名方式(longname)。長(zhǎng)類名方式要在類名前加上包名稱,其格式如下:包名.類名如要使用MyPackage包中的Circle類,則可以使用MyPackage.Circle。
(2)短類名方式(shortname)。短類名方式需要在程序的前面加上import語(yǔ)句,其格式如下:import包名.類名;或使用如下格式:import包名.*;前一種格式只引入了一個(gè)指定的類。如在程序的開(kāi)始部分使用了下面的import語(yǔ)句,則程序中只能使用MyPackage包中的Circle類:importMyPackage.Circle;如果在程序中要使用MyPackage包里的任何一個(gè)類,則可以使用如下的語(yǔ)句:importMyPackage.*;注意:java.lang包中的類在程序中會(huì)被自動(dòng)引入,不需要使用import語(yǔ)句。3.4字符串?dāng)?shù)據(jù)類型的使用方法
Java語(yǔ)言中的復(fù)雜數(shù)據(jù)類型,其實(shí)就是類類型。前面介紹過(guò),類是一種新型數(shù)據(jù)類型,在面向?qū)ο蟪绦蛟O(shè)計(jì)中,經(jīng)常會(huì)遇到一個(gè)類的成員變量屬于某種類類型的情況。前面介紹的案例中多次使用到了String類型,String類型就是一種常用的類類型。3.4.1字符串的創(chuàng)建與操作
1.字符串的概念字符串是由Unicode字符集中的字符組成的字符序列,如“Thisisanapple.”。在Java語(yǔ)言中,字符串不是基本數(shù)據(jù)類型,而是一個(gè)類。由于在程序中經(jīng)常使用字符串這種類類型,因此在Java語(yǔ)言中已經(jīng)定義了字符串類型,類名為String,用戶可以在程序中直接使用String類型定義一個(gè)字符串。
2.創(chuàng)建字符串由于字符串也是對(duì)象,因此創(chuàng)建一個(gè)String類的實(shí)例可以用如下的格式:格式1:StringstrName1=newString("Thisisanapple.");也可以寫(xiě)成如下的簡(jiǎn)單格式:格式2:StringstrName2="Thisisanapple.";在Java語(yǔ)言中,可以創(chuàng)建一個(gè)空字符串:StringstrName3="";表示strName3字符串的長(zhǎng)度為0,即不包含任何字符。字符串變量其實(shí)是一個(gè)對(duì)象類型的變量。任何一個(gè)對(duì)象類型的變量,都保存著一個(gè)內(nèi)存地址,這個(gè)地址指向存放該實(shí)例對(duì)象數(shù)據(jù)的內(nèi)存區(qū),如對(duì)于“格式1”中創(chuàng)建字符串的過(guò)程,可以用圖3-5表示。圖3-5創(chuàng)建字符串對(duì)象的過(guò)程執(zhí)行格式1語(yǔ)句的過(guò)程是,聲明一個(gè)字符串變量strName1,Java虛擬機(jī)就為該變量分配一個(gè)用于保存指向字符串常量的內(nèi)存地址(這個(gè)內(nèi)存地址也叫一個(gè)引用),如圖3-5(a)所示,目前該內(nèi)存的內(nèi)容為空。在創(chuàng)建字符串的語(yǔ)句newString("Thisisanapple.")執(zhí)行后,Java虛擬機(jī)先在內(nèi)存中創(chuàng)建一個(gè)字符串常量"Thisisanapple.",如圖3-5(b)所示(圖中假設(shè)分配給該字符串常量的內(nèi)存地址從十六進(jìn)制數(shù)0X1AFB開(kāi)始),然后讓字符串變量strName1指向"Thisisanapple."對(duì)象,即將地址0X1AFB填入strName1變量中,完成格式1中語(yǔ)句的執(zhí)行過(guò)程。
"Thisisanapple."對(duì)象在內(nèi)存中創(chuàng)建后,其值不能被改變,也就是說(shuō),其中的任何一個(gè)字符不能被改動(dòng),即創(chuàng)建的是一個(gè)字符串常量。格式2創(chuàng)建字符串變量strName2的過(guò)程是,在聲明字符串變量strName2后,Java虛擬機(jī)就查找內(nèi)存中有沒(méi)有一個(gè)"Thisisanapple."字符串常量,如果有,則讓它直接指向該常量。由于格式1中已經(jīng)創(chuàng)建了"Thisisanapple."字符串常量,因此strName2也指向了"Thisisanapple."字符串常量,如圖3-5(b)中strName2實(shí)線所指的內(nèi)容。如果在程序中又執(zhí)行了一條如下的語(yǔ)句:strName2="HelloJava.";則由于在內(nèi)存中沒(méi)有"HelloJava."字符串常量,因此Java虛擬機(jī)就創(chuàng)建一個(gè)"HelloJava."字符串常量,然后strName2對(duì)象會(huì)指向這個(gè)新的字符串常量,如圖3-5(b)虛線所指的內(nèi)容。由以上分析可知,String類型的對(duì)象所指向的字符串內(nèi)容不能被改變(如"Thisisanapple."對(duì)象中,不能修改其中任何一個(gè)字符),所以,有些資料將String類型的字符串叫常量字符串。但要注意,String類型的對(duì)象變量本身可以根據(jù)程序執(zhí)行的情況指向不同的字符串常量,如上面提到的strName2,在不同的時(shí)刻指向了不同的字符串常量,前面指向了"Thisisanapple."對(duì)象,后面指向了"HelloJava."對(duì)象。
3.字符串常用的方法
(1)字符串連接。字符串連接用“+”或concat(Srtingstr)。例如:strName3=strName1+"isthenameofan"+strName2;strName3=strName3.concat("welcome");
(2)求字符串的長(zhǎng)度。求字符串的長(zhǎng)度用length()。例如:intnumLength=strName2.length();
(3)取子串。取一個(gè)字符串的子串用substring()。它有兩種格式:●?Stringsubstring(intbeginIndex);該方法返回一個(gè)新字符串,此字符串從指定的beginIndex處開(kāi)始,一直到字符串結(jié)束?!?Stringsubstring(intbeginIndex,intendIndex);該方法返回一個(gè)新字符串,此字符串從指定的beginIndex處開(kāi)始,一直到endIndex-1處的字符結(jié)束,因此,該子字符串的長(zhǎng)度為endIndex-beginIndex。例如:
Strings1="computer";
Strings2=s1.substring(3); //s2為"puter"
Strings3=s1.substring(3,6); //s3為"put"
(4)字符串比較。比較兩個(gè)字符串常用如下的兩種方法:●?intcompareTo(StringanotherString);如果參數(shù)字符串等于此字符串,則返回0值;如果按字典順序此字符串小于字符串參數(shù),則返回一個(gè)小于0的值;如果按字典順序此字符串大于字符串參數(shù),則返回一個(gè)大于0的值。如果在比較字符串時(shí)不考慮字母的大小寫(xiě),則可以使用如下的方法:●?booleanequalsIgnoreCase(StringanotherString);將此String與參數(shù)中所給的另一個(gè)String進(jìn)行比較,比較時(shí)不考慮字母的大小寫(xiě)。如果兩個(gè)字符串的長(zhǎng)度相等,并且兩個(gè)字符串中的相應(yīng)字符都相同(忽略大小寫(xiě)),則認(rèn)為這兩個(gè)字符串是相等的。例如:
System.out.println("put".equalsIgnoreCase("PUT"));//輸出的結(jié)果為true
(5)判斷字符串的前綴和后綴。判斷字符串的前綴和后綴是否與參數(shù)中指定的字符串相同:
booleanstartsWith(Stringprefix);
booleanendsWith(Stringsuffix);例如:System.out.println("computer".startsWith("com")); //輸出true
(6)查找字符串中的一個(gè)字符(找到則返回出現(xiàn)的位置,沒(méi)找到則返回-1)。
intindexOf((int)ch); //(int)為強(qiáng)制類型轉(zhuǎn)換
intindexOf((int)ch,intfromIndex);
//從fromIndex位置開(kāi)始查找intlastIndexOf((int)ch); //從字符串的結(jié)尾開(kāi)始向前查找intlastIndexOf((int)ch,intfromIndex);
//從fromIndex位置開(kāi)始向前查找
(7)查找字符串中的一個(gè)子串(找到返回出現(xiàn)的位置,沒(méi)找到返回-1)。
intindexOf(Stringstr);
intindexOf(Stringstr,intfromIndex);
//從fromIndex位置開(kāi)始查找
intlastIndexOf(Stringstr);
//從字符串的結(jié)尾開(kāi)始向前查找
intlastIndexOf(Stringstr,intfromIndex);
//從fromIndex位置開(kāi)始向前查找
(8)其他的一些常用方法。
charcharAt(intindex);//取得指定位置的字符
Stringreplace(charoldChar,charnewChar);
//返回結(jié)果為一個(gè)用新字符替換舊字符后的字符串,
//原字符串對(duì)象不變
StringtoLowerCase();
//返回值為將此字符串中的所有字母都轉(zhuǎn)換為小寫(xiě)
//后的字符串,原字符串對(duì)象不變
StringtoUpperCase();
//返回值為將此字符串中的所有字母都轉(zhuǎn)換為大寫(xiě)
//后的字符串,原字符串對(duì)象不變
Stringtrim();//取掉字符串前后的空格并生成新串在String類中提供了很多非常有用的方法,這里只列舉了一些比較常用的,目的是為了說(shuō)明在Java語(yǔ)言的類庫(kù)中所定義的大部分類都提供了功能齊全的操作方法。使用時(shí)一定要查找JDK幫助文檔,關(guān)于幫助文檔的用法見(jiàn)3.6節(jié)。注意1:與C語(yǔ)言和C++?語(yǔ)言不同,String不以?\0作為結(jié)束標(biāo)志。注意2:字符串中第1個(gè)字符的序號(hào)為0,而不是1。3.4.2【案例3-3】身份證號(hào)碼中的秘密
1.案例描述一個(gè)身份證號(hào)碼中包含著本人所在地區(qū)、出生日期、性別等重要信息。在開(kāi)發(fā)一個(gè)軟件的過(guò)程中,要從身份證號(hào)碼中取出一個(gè)人的生日和性別信息。
2.案例效果案例程序的執(zhí)行效果如圖3-6所示。圖中第3行輸出了一個(gè)身份證號(hào)碼,第4行和第5行分別輸出了該身份證號(hào)碼中所包含的生日和性別信息。圖3-6案例3-3的執(zhí)行結(jié)果
3.技術(shù)分析由于身份證號(hào)碼是由數(shù)字組成的字符串,且長(zhǎng)度固定,個(gè)人的有關(guān)信息被包含在這個(gè)字符串中??梢允褂帽竟?jié)介紹的有關(guān)字符串操作的方法取出身份證中包含的有關(guān)信息。該程序的主要問(wèn)題是設(shè)計(jì)一個(gè)身份證號(hào)碼類,該類中要定義一個(gè)私有數(shù)據(jù)成員(即身份證號(hào)碼)、一個(gè)從身份證號(hào)碼中取出生日的方法和一個(gè)從身份證號(hào)碼中取出性別的方法。
4.程序解析下面是案例3-3的程序代碼。01//*****************************************02//案例:3.3程序名:TestIdentityCard.java03//功能:從一個(gè)身份證號(hào)碼中取出個(gè)人信息04//*****************************************0506//身份證號(hào)類07classIdentityCard{08 privateStringidentityNumber;09 10 //無(wú)參數(shù)的構(gòu)造方法11 publicIdentityCard(){}12 13 //有參數(shù)的構(gòu)造方法14 publicIdentityCard(StringidentityNumber){15 this.identityNumber=identityNumber;16 }17 18 //身份證號(hào)碼設(shè)置器19 publicvoidsetIdentityNumber(StringidentityNumber){20 this.identityNumber=identityNumber;21 }22 23 //身份證號(hào)碼獲取器 24 publicStringgetIdentityNumber(){25 returnidentityNumber;26 }27 28 //獲得生日的方法29 publicStringgetBirthday(){30 returnidentityNumber.substring(6,10)+"年"+31 identityNumber.substring(10,12)+"月"+32 identityNumber.substring(12,14)+"日";33 }34 35 //獲得性別的方法36 publicchargetSex(){37 inttemp=identityNumber.codePointAt(identityNumber.length()-1)-0x0030;38 if((temp%2)==0)39 return'男';40 else41 return'女';42 }43}4445//測(cè)試類46classTestIdentityCard{47 publicstaticvoidmain(Stringargs[]){48 IdentityCardMyID=new
IdentityCard();49 System.out.println("身份證號(hào)碼為:"+MyID.getIdentityNumber());50 System.out.println("生日:"+MyID.getBirthday());51 System.out.println("性別:"+MyID.getSex());52 53 }54}程序中,第07~43行定義了一個(gè)身份證號(hào)碼類,該類在08行定義了一個(gè)私有成員變量identityNumber,表示身份證號(hào)碼。在getBirthday方法中,30行、31行和32行分別使用了String類取子串的方法subString,取出生日中的年、月、日。在36行定義了求性別的方法,使用了String類的codePointAt方法(注意只有JDK1.5后的版本才可使用),該方法返回指定位置處的字符,但返回值是Unicode碼表示的整數(shù),因?yàn)樽址?的Unicode碼為十六進(jìn)制數(shù)0030,所以37行的表達(dá)式中要減去該數(shù),將一個(gè)字符表示的數(shù)字轉(zhuǎn)換為對(duì)應(yīng)的整數(shù),該方法中假設(shè)身份證號(hào)碼的最后一位表示性別。3.4.3【相關(guān)知識(shí)】在程序中使用可變字符串在java.lang包中定義的StringBuffer類比String類更靈活,可以在存放字符串的緩沖區(qū)中添加、插入或追加新內(nèi)容,也就是說(shuō)字符串的內(nèi)容可以改變。下面介紹StringBuffer類的使用方法。
1.?StringBuffer的構(gòu)造方法
(1)?publicStringBuffer()。該方法構(gòu)造一個(gè)沒(méi)有字符的字符串緩沖區(qū),緩沖區(qū)的初始容量為16個(gè)字符。例如:StringBufferstrBuf=newStringBuffer();
(2)?publicStringBuffer(intlength)。該方法構(gòu)造了一個(gè)沒(méi)有字符的字符串緩沖區(qū),緩沖區(qū)的初始容量由length確定(這里的長(zhǎng)度為12)。例如:StringBufferstrBuf=newStringBuffer(12);
(3)?publicStringBuffer(Stringstring)。以給定參數(shù)string構(gòu)造一個(gè)字符串緩沖區(qū),初始容量為字符串string的長(zhǎng)度再加16個(gè)字符。例如:StringBufferstrb=newStringBuffer("java");該語(yǔ)句創(chuàng)建了一個(gè)容量為20的字符串緩沖區(qū),緩沖區(qū)中存放的字符串為"java"。
2.在可變字符串中追加和插入新內(nèi)容
(1)在字符串末尾追加新內(nèi)容。StringBuffer中有13個(gè)重載的append方法(指JDK1.5),該方法可以在字符串末尾追加新內(nèi)容,加入的內(nèi)容可以是boolean、char、double、float、int、long、string等類型的新內(nèi)容。例如:StringBuffersb=newStringBuffer("java");System.out.println(sb.append(true));執(zhí)行這兩行語(yǔ)句后,sb的內(nèi)容變?yōu)?javatrue",并將該字符串輸出。
(2)在字符串中插入新內(nèi)容。StringBuffer中有12個(gè)重載的insert方法(指JDK1.5),該方法可以在字符串中插入新內(nèi)容。將一個(gè)字符插入一個(gè)字符串的指定位置可以使用如下格式的方法:insert(intoffset,charc);第1個(gè)參數(shù)offset指出將要插入字符的位置,插入后此序列的長(zhǎng)度將增加1。其他常用的插入方法有:●?StringBufferinsert(intoffset,doubled);
//將double參數(shù)的字符串表示形式插入此序列中●?StringBufferinsert(intoffset,floatf);?
//將float參數(shù)的字符串表示形式插入此序列中●?StringBufferinsert(intoffset,inti);
//將int參數(shù)的字符串表示形式插入此序列中●?StringBufferinsert(intoffset,longl);??
//將long參數(shù)的字符串表示
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 為中華之崛起而讀書(shū)講話稿
- 交流調(diào)崗申請(qǐng)書(shū)范文(6篇)
- 2024年離婚協(xié)議書(shū)專業(yè)范本3篇
- 2024年玩具企業(yè)市場(chǎng)渠道代理銷售合同3篇
- 《我國(guó)公司股份回購(gòu)制度研究》
- 《農(nóng)村勞動(dòng)力轉(zhuǎn)移對(duì)農(nóng)業(yè)生產(chǎn)的影響研究》
- 《基于正定矩陣?yán)杪餍蔚膹?fù)雜工業(yè)過(guò)程故障診斷與性能監(jiān)測(cè)方法研究》
- 2024年度教育用地入股合作開(kāi)發(fā)合同3篇
- 2024年義烏市婦幼保健院高層次衛(wèi)技人才招聘筆試歷年參考題庫(kù)頻考點(diǎn)附帶答案
- 2023年江西財(cái)經(jīng)大學(xué)計(jì)算機(jī)與人工智能學(xué)院招聘筆試真題
- 人體漫游指南(山東聯(lián)盟)智慧樹(shù)知到期末考試答案章節(jié)答案2024年山東協(xié)和學(xué)院
- 現(xiàn)代生命科學(xué)與人居環(huán)境智慧樹(shù)知到期末考試答案章節(jié)答案2024年同濟(jì)大學(xué)
- 2024年淄博星辰供水有限公司招聘筆試參考題庫(kù)附帶答案詳解
- 2024年浙江紹興市高速公路運(yùn)營(yíng)管理有限公司招聘筆試參考題庫(kù)含答案解析
- 大學(xué)生勞動(dòng)教育-南京大學(xué)2中國(guó)大學(xué)mooc課后章節(jié)答案期末考試題庫(kù)2023年
- 中西經(jīng)典對(duì)話(英語(yǔ))暨南大學(xué)2023年秋期末答案
- 中國(guó)民族民間器樂(lè) 課件-2023-2024學(xué)年高中音樂(lè)湘教版(2019)必修音樂(lè)鑒賞
- 排球場(chǎng)租用協(xié)議
- 眶尖綜合征的護(hù)理查房
- 航道疏浚工程課件
- 微信公眾號(hào)總結(jié)匯報(bào)
評(píng)論
0/150
提交評(píng)論