JAVA程序設(shè)計(jì)課件_第1頁(yè)
JAVA程序設(shè)計(jì)課件_第2頁(yè)
JAVA程序設(shè)計(jì)課件_第3頁(yè)
JAVA程序設(shè)計(jì)課件_第4頁(yè)
JAVA程序設(shè)計(jì)課件_第5頁(yè)
已閱讀5頁(yè),還剩303頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

(Java編程語(yǔ)言)

2004年1月9日,美國(guó)“勇氣”號(hào)探測(cè)器成功登陸火星,並在隨後的一段時(shí)間內(nèi),由遠(yuǎn)在美國(guó)NASA中的科學(xué)家們控制,對(duì)火星進(jìn)行了成功的探訪。美國(guó)BEA公司,1995年創(chuàng)辦,兩年後上市,六年後用戶數(shù)過(guò)萬(wàn),八年後營(yíng)業(yè)額超過(guò)10億美元,創(chuàng)造了全球軟體產(chǎn)業(yè)的一個(gè)奇跡。一種可同時(shí)適用於高性能企業(yè)計(jì)算平臺(tái)、桌面計(jì)算平臺(tái)和移動(dòng)計(jì)算平臺(tái)的電腦編程技術(shù)。這些的事例有什麼內(nèi)在聯(lián)繫?Java編程語(yǔ)言Java語(yǔ)言的發(fā)展歷史Java語(yǔ)言前身是Oak語(yǔ)言,於1991年推出,但僅限於SunMicrosystems公司內(nèi)部使用1995年Oak語(yǔ)言改名為“Java”,並正式向公眾推出1.2版本的Java是Java語(yǔ)言發(fā)展過(guò)程中一個(gè)關(guān)鍵階段,從此,Sun公司將Java更名為Java2經(jīng)過(guò)十年的發(fā)展,Java語(yǔ)言已經(jīng)發(fā)展到1.5版本,目前最常用的是1.4版本Java語(yǔ)言的發(fā)展現(xiàn)狀

當(dāng)今,Java技術(shù)已經(jīng)滲透到了世界的每個(gè)角落——小到生活中的電話、烤麵包機(jī),大到汽車,都有它的身影。權(quán)威調(diào)查顯示,目前全球已有超過(guò)40%的軟體開(kāi)發(fā)人員使用Java語(yǔ)言,2004年這個(gè)數(shù)字上升至61%。當(dāng)今全球已經(jīng)擁有超過(guò)300萬(wàn)使用它作為開(kāi)發(fā)語(yǔ)言的程式員,超過(guò)2.67億部支持Java的電話,以及有超過(guò)3億的Java卡在世界各地被配置。我國(guó)對(duì)Java技術(shù)人才的年需求量高達(dá)20餘萬(wàn)人。

Java語(yǔ)言的發(fā)展現(xiàn)狀JAVAJava語(yǔ)言的未來(lái)高性能企業(yè)計(jì)算(J2EE)高性能移動(dòng)計(jì)算(J2ME)高性能的分佈式計(jì)算(RMI、JINI)嵌入式系統(tǒng)開(kāi)發(fā)和設(shè)備控制即時(shí)系統(tǒng)開(kāi)發(fā)電腦語(yǔ)言的分類根據(jù)電腦語(yǔ)言與人的自然語(yǔ)言的接近程度和與電腦硬體的依賴程度,可以把電腦語(yǔ)言分為:機(jī)器語(yǔ)言組合語(yǔ)言高級(jí)語(yǔ)言Java電腦語(yǔ)言的分類根據(jù)程式設(shè)計(jì)中以過(guò)程為中心還是以類為中心,可以把電腦語(yǔ)言分為:面向過(guò)程語(yǔ)言面向?qū)ο笳Z(yǔ)言Java電腦語(yǔ)言的分類根據(jù)語(yǔ)言所生成的可執(zhí)行代碼的執(zhí)行方式的不同

,可以把電腦語(yǔ)言分為:編譯執(zhí)行語(yǔ)言解釋執(zhí)行語(yǔ)言Java

Java語(yǔ)言是一種高級(jí)的面向?qū)ο笳Z(yǔ)言,它採(cǎi)用解釋執(zhí)行。面向過(guò)程與面向?qū)ο?/p>

面向過(guò)程的程式設(shè)計(jì)是用結(jié)構(gòu)化編程語(yǔ)句來(lái)編寫(xiě)程式。它把一個(gè)複雜的程式分解成若干個(gè)較小的過(guò)程,每個(gè)過(guò)程都可以單獨(dú)地設(shè)計(jì)、修改、調(diào)試。問(wèn)題數(shù)據(jù)集合過(guò)程集合結(jié)果制定表示為傳遞給計(jì)算面向過(guò)程與面向?qū)ο?/p>

面向?qū)ο蟮某淌皆O(shè)計(jì)也稱為面向類的編程,把問(wèn)題一般化後抽象為描述問(wèn)題的類(Class),通過(guò)類的內(nèi)部數(shù)據(jù)(Field)來(lái)表示問(wèn)題的狀態(tài),創(chuàng)建類的實(shí)例(Instance)來(lái)表示具體的問(wèn)題,通過(guò)類或?qū)嵗姆椒?Method)的執(zhí)行得到問(wèn)題的解。問(wèn)題類結(jié)果實(shí)例抽象創(chuàng)建計(jì)算Java技術(shù)體系針對(duì)企業(yè)計(jì)算、桌面計(jì)算和移動(dòng)計(jì)算,Java平臺(tái)提供了三個(gè)版本,形成了三大技術(shù)體系:Java2Platform,StandardEdition(J2SE)Java2Platform,EnterpriseEdition(J2EE)Java2Platform,MicroEdition(J2ME)Java語(yǔ)言的特點(diǎn)簡(jiǎn)單、安全、可靠面向?qū)ο蠼忉寛?zhí)行結(jié)構(gòu)中立、可移植性高性能多線程動(dòng)態(tài)性Java程式的跨平臺(tái)運(yùn)行機(jī)制SourceCode(根源程式*.java)ByteCode(位元組碼檔*.class)JVM(Java虛擬機(jī))JVM(Java虛擬機(jī))JVM(Java虛擬機(jī))WindowsLinuxUnixcomplie(編譯)load(載入)execute(解釋)Java語(yǔ)言的開(kāi)發(fā)工具TheJ2SESystemDevelopmentKit(JDK)JavaIDE(Java集成開(kāi)發(fā)環(huán)境)JavaRuntimeEnvironment(JRE)(Java執(zhí)行環(huán)境)Tools(各種工具程式)JavaClassLibrarySourceFiles(Java類庫(kù)源碼)Demo(關(guān)於各種類的例程)JBuilderNetbeansWorkshopIntelliJWSADEclipseJava資源Sun公司Java技術(shù)官方網(wǎng)站Eclipse專案網(wǎng)站各種Java相關(guān)開(kāi)源專案網(wǎng)站我的課件和資料發(fā)佈空間Java程式開(kāi)發(fā)過(guò)程安裝JDK設(shè)置環(huán)境變數(shù)安裝IDE根源程式檔(*.java)編譯位元組碼檔(*.class)程式設(shè)計(jì)程式修改錯(cuò)誤成功保存AppletRichClientAppJ2EEServerAppJ2MEApp安裝開(kāi)發(fā)運(yùn)行面向?qū)ο蟪淌皆O(shè)計(jì)(OOP)CompartandConquer(分而置之)系統(tǒng)子系統(tǒng)子系統(tǒng)子系統(tǒng)子系統(tǒng)子系統(tǒng)類類類類類數(shù)據(jù)集方法集面向?qū)ο蟪淌皆O(shè)計(jì)(OOP)類、對(duì)象類(class)——根據(jù)特定的設(shè)計(jì)考慮將數(shù)據(jù)和方法組織在一起的一個(gè)範(fàn)本,是構(gòu)成系統(tǒng)或參與計(jì)算的邏輯組件,用它可以創(chuàng)建對(duì)象。類也可以看作是對(duì)象的數(shù)據(jù)類型。對(duì)象(object)——類的實(shí)例,也可看作是類的變數(shù)。一個(gè)類可以創(chuàng)建多個(gè)對(duì)象,每個(gè)對(duì)象都有一份獨(dú)立的數(shù)據(jù)拷貝,可以使用類中的方法來(lái)訪問(wèn)或修改對(duì)象,對(duì)一個(gè)對(duì)象的修改並不影響其他對(duì)象。面向?qū)ο蟪淌皆O(shè)計(jì)(OOP)域、方法域(field)——類中聲明的變數(shù),域可分為類的域(保留字static修飾的域)和對(duì)象的域。方法(method)——類中聲明的函數(shù),方法可分為類的方法(保留字static修飾的方法)和對(duì)象的方法。問(wèn)題寫(xiě)一個(gè)程式列印斐波拉契(Fibonacci)數(shù)列,數(shù)列的長(zhǎng)度可以由輸入指定。斐波拉契(Fibonacci)數(shù)列是的前兩項(xiàng)分別是1和1,後續(xù)各項(xiàng)分別是前面兩項(xiàng)的和。

1

1

2

3

5

8

13

21

34……長(zhǎng)度5長(zhǎng)度9思路用一個(gè)類來(lái)表示斐波拉契數(shù)列,用類的對(duì)象來(lái)表示一個(gè)具體的數(shù)列長(zhǎng)度是數(shù)列的屬性,類中應(yīng)有一個(gè)域來(lái)表示數(shù)列的長(zhǎng)度,並且這個(gè)域?qū)睹總€(gè)對(duì)象都是獨(dú)立的列印數(shù)列是運(yùn)算元列的一種方式,類中應(yīng)有一個(gè)方法來(lái)提供這項(xiàng)操作,並且這個(gè)方法應(yīng)是針對(duì)每個(gè)對(duì)象的提供一種接收輸入數(shù)據(jù)的方式Fibonacci類publicclassFibonacci{privateintlength;

publicFibonacci(intlen){

length=len;

}

publicvoidprint(){

intlo=1;

inthi=1;

System.out.println(lo);

for(inti=0;i<length-2;i++){

System.out.println(hi);

hi=hi+lo;

lo=hi-lo;

}

}}類頭(classhead)類體(classbody)類體部分聲明了類或類的對(duì)象將使用的變數(shù)(域)和類或類的對(duì)象可以提供的方法。類頭部分用於聲明類、指定類的名稱、指定類的可見(jiàn)性以及類的可擴(kuò)展性。聲明整數(shù)類型的變數(shù)length聲明列印數(shù)列的方法print聲明類的構(gòu)造函數(shù)類的main方法main方法必須聲明為以下格式:main方法是程式執(zhí)行時(shí)第一個(gè)被執(zhí)行的方法以main方法作為執(zhí)行起點(diǎn)的Java程式又稱為JavaApplicationpublicstaticvoidmain(String[]args){……}Fibonacci類的main方法在main方法中接收程式執(zhí)行時(shí)傳入的參數(shù),然後創(chuàng)建Fibonacci類的對(duì)象,執(zhí)行對(duì)象的print方法列印出指定長(zhǎng)度的數(shù)列publicclassFibonacci{

……

publicstaticvoidmain(String[]args){

intlen=Integer.parseInt(args[0]);

Fibonaccifibo=newFibonacci(len);

fibo.print();

}}將傳入的參數(shù)轉(zhuǎn)換為整數(shù),作為數(shù)列的長(zhǎng)度創(chuàng)建Fibonacci類的對(duì)象fibo調(diào)用fibo對(duì)象的print方法保存Fibonacci類Java語(yǔ)言的根源程式檔以“java”作為檔案名的尾碼每一個(gè)可見(jiàn)性為public的類都應(yīng)保存為以類名作為檔案名(字母的大小寫(xiě)敏感),以“java”作為尾碼的檔每一個(gè)根源程式檔中可以聲明一個(gè)或多個(gè)類,但只能有一個(gè)public的類Fibonacci.javaEnvironmentVariable(環(huán)境變數(shù))環(huán)境變數(shù)也稱為系統(tǒng)變數(shù),是由操作系統(tǒng)提供的一種與操作系統(tǒng)中運(yùn)行的程式進(jìn)行通信的機(jī)制,一般可為運(yùn)行的程式提供配置資訊環(huán)境變數(shù)一般為“名字、值”對(duì),在Shell編程中以${變數(shù)名}來(lái)取某變數(shù)的值常用的Java環(huán)境變數(shù)包括:JAVA_HOME

CLASSPATH

PATH環(huán)境變數(shù)—

JAVA_HOME環(huán)境變數(shù)JAVA_HOME的值應(yīng)設(shè)置為JDK的安裝目錄的路徑,如在Windows平臺(tái)上JDK的安裝目錄為“C:\j2sdk1.4.2_08”,則JAVA_HOME為那些需要使用Java命令和JVM的程式提供了通用的路徑資訊JAVA_HOME=C:\j2sdk1.4.2_08環(huán)境變數(shù)—

CLASSPATH環(huán)境變數(shù)CLASSPATH的值一般為一個(gè)以分號(hào)“;”作為分隔符號(hào)的路徑列表,如當(dāng)執(zhí)行Java程式時(shí),執(zhí)行命令會(huì)首先把類名轉(zhuǎn)換為位元組碼檔的路徑資訊,再在環(huán)境變數(shù)CLASSPATH的值的路徑列表的每個(gè)路徑及其子路徑中搜索指定的位元組碼檔,如果在所有路徑都找不到該檔,就報(bào)告錯(cuò)誤CLASSPATH=d:\path1;e:\path2;…環(huán)境變數(shù)—

PATH環(huán)境變數(shù)PATH是操作系統(tǒng)使用的變數(shù),用於搜索在Shell中輸入的希望執(zhí)行的命令為了便於使用,一般可把JDK中Java命令程式所在的目錄的路徑加入PATH變數(shù)的值中,如:PATH=…;C:\j2sdk1.4.2_08\binJavaCommand(Java命令)Java命令是JDK中附帶的一組可執(zhí)行的程式,主要用於Java程式的編譯、執(zhí)行及其它用途Java命令位於JDK的安裝目錄的子目錄“bin”中,可以通過(guò)環(huán)境變數(shù)JAVA_HOME來(lái)表示命令的位置在Windows平臺(tái)上,Java命令通常在命令行窗口中執(zhí)行${JAVA_HOME}/binJava命令列表javac—Java編譯器程式,負(fù)責(zé)創(chuàng)建根源程式的位元組碼檔(類名.class檔)java—JVM的啟動(dòng)程式,用於執(zhí)行編譯好的Java程式j(luò)avaw—與java命令功能相同,使用它啟動(dòng)Java程式時(shí)命令行窗口自動(dòng)關(guān)閉,一般用於執(zhí)行GUI程式j(luò)avadoc—Java幫助文檔自動(dòng)生成器,用於從Java原始檔案生成API文檔HTML頁(yè)javap—Java類檔解析器,用於從位元組碼檔察看類的域和方法資訊Java命令列表javah—C頭檔和Stub檔生成器。javah從Java類生成C頭檔和C原始檔案。這些檔提供了連接膠合,使Java和C代碼可進(jìn)行交互。appletviewer—Javaapplet流覽器。appletviewer命令可在脫離萬(wàn)維網(wǎng)流覽器環(huán)境的情況下運(yùn)行Applet程式j(luò)ar—Java歸檔工具,可將多個(gè)檔壓縮為單個(gè)JAR歸檔檔。Tips:如果你希望瞭解一個(gè)Java命令的詳細(xì)用法,可以在命令後面加上參數(shù)“-h”,如:javac-h編譯Fibonacci類使用javac命令,javac命令的用法如下:在命令行窗口中編譯Fibonacci類根源程式j(luò)avac[options][sourcefiles][@files]-options編譯器可選項(xiàng)列表

-sourcefiles一個(gè)或多個(gè)要編譯的根源程式檔

-@files一個(gè)或多個(gè)列出原始檔案列表的檔X:\>javacFibonacci.java類的位元組碼檔類的根源程式編譯成功後會(huì)生成類的位元組碼檔,位元組碼檔是可被JVM解釋運(yùn)行的虛擬機(jī)指令集和,位元組碼檔以類名作為檔案名,以“class”作為檔案名的尾碼,如:Fibonacci.class執(zhí)行Fibonacci程式使用java命令,java命令的用法如下:在命令行窗口中運(yùn)行Fibonacci程式j(luò)ava[options]class[argument…]-options可選項(xiàng)列表

-class被執(zhí)行的類名

-argument傳遞給main方法的命令行參數(shù)X:\>javaFibonacci10Fibonacci程式開(kāi)發(fā)過(guò)程圖解第一步:用“記事本”或其他文字編輯工具編寫(xiě)根源程式,並保存為“Fibonacci.java”檔Fibonacci程式開(kāi)發(fā)過(guò)程圖解第二步:在命令行窗口中用javac命令編譯根源程式Fibonacci程式開(kāi)發(fā)過(guò)程圖解第三步:在命令行窗口中用java命令運(yùn)行程式馮·諾依曼體系結(jié)構(gòu)電腦之父——約翰·馮·諾依曼JohnVonNeumann(1903-1957)

20世紀(jì)科學(xué)界最著名的全才大師,在數(shù)學(xué)、物理學(xué)、經(jīng)濟(jì)學(xué)等方面都有極高的成就,一生會(huì)七種語(yǔ)言,而其在電腦發(fā)展歷史中的地位無(wú)人能及,被譽(yù)為“電腦之父”,他所提出的電腦體系結(jié)構(gòu)被稱為“馮·諾依曼”體系結(jié)構(gòu),今天絕大多數(shù)的電腦都是按照這一體系結(jié)構(gòu)設(shè)計(jì)實(shí)現(xiàn)的。馮·諾依曼體系結(jié)構(gòu)馮·諾依曼機(jī)包括五大組成部分:

運(yùn)算器C

邏輯控制器LC

記憶體M

輸入設(shè)備I

輸出設(shè)備O什麼是虛擬機(jī)?虛擬機(jī)是一種對(duì)電腦物理硬體計(jì)算環(huán)境的軟體實(shí)現(xiàn)虛擬機(jī)是一種抽象機(jī)器,內(nèi)部包含一個(gè)解釋器(Interpreter),可以將其他高級(jí)語(yǔ)言編譯為虛擬機(jī)的解釋器可以執(zhí)行的代碼(稱這種代碼為中間語(yǔ)言IntermediateLanguage),實(shí)現(xiàn)高級(jí)語(yǔ)言程式的可移植性虛擬機(jī)的優(yōu)點(diǎn)平臺(tái)無(wú)關(guān)性(SystemIndependence)安全(Security)無(wú)論是運(yùn)行在嵌入式設(shè)備還是多個(gè)處理器的伺服器上,虛擬機(jī)都執(zhí)行相同的指令,所使用的支持庫(kù)也具有標(biāo)準(zhǔn)的API和完全相同或相似的行為。虛擬機(jī)可以根據(jù)要求對(duì)其中執(zhí)行的程式進(jìn)行控制,使其無(wú)法訪問(wèn)虛擬機(jī)運(yùn)行的操作系統(tǒng)的其他資源。什麼是Java虛擬機(jī)(JVM)?Java虛擬機(jī)(JVM)是專門針對(duì)Java語(yǔ)言設(shè)計(jì)的一種虛擬機(jī)實(shí)現(xiàn),有自己的指令系統(tǒng)(位元組碼),用軟體模擬了處理器、堆疊、寄存器等電腦物理組件,可以運(yùn)行Java語(yǔ)言編譯後得到的位元組碼程式,實(shí)現(xiàn)了Java程式的可移植性理解Java程式可移植性一經(jīng)編寫(xiě),隨處運(yùn)行?JVM規(guī)範(fàn)的一嚴(yán)一寬更好的理解—WOCRACJVM規(guī)範(fàn)對(duì)可移植代碼的嚴(yán)格性-JVM規(guī)範(fàn)對(duì)虛擬機(jī)實(shí)現(xiàn)的寬鬆性WriteOnceCarefully,RunAnywhereConditionally.(精心編寫(xiě)一次就可以有條件的到處運(yùn)行)JVM的體系結(jié)構(gòu)JVM由多個(gè)組件構(gòu)成,包括:-類裝載器(ClassLoader)-位元組碼解釋器(BytecodeInterpreter)-安全管理器(SecurityManager)-垃圾收集器(GarbageCollector)-線程管理(ThreadManagement)-圖形(Graphics)JVM體系結(jié)構(gòu)圖類裝載器位元組碼解釋器安全管理器垃圾收集器線程管理圖形JavaVirtualMachineOperatingSystem位元組碼*.class檔類裝載器(ClassLoader)類裝載器負(fù)責(zé)加載(load)類的位元組碼檔,並完成類的鏈接和初始化工作類的加載步驟把要加載的類名轉(zhuǎn)換為類的位元組碼檔案名,並在環(huán)境變數(shù)CLASSPATH指定的每個(gè)目錄搜索該檔把位元組碼檔讀入緩衝區(qū)將類轉(zhuǎn)換為JVM內(nèi)部的數(shù)據(jù)結(jié)構(gòu)使用校驗(yàn)器檢查類的合法性如何類是第一次被加載,則對(duì)類中的靜態(tài)數(shù)據(jù)進(jìn)行初始化加載類中所引用的其他類把類中的某些方法編譯為本地代碼位元組碼解釋器(BytecodeInterpreter)JVM使用單字節(jié)長(zhǎng)度的操作碼,被稱為“位元組碼”位元組碼可以看作是JVM的組合語(yǔ)言JVM定義了14類200多個(gè)單字節(jié)指令位元組碼解釋器是整個(gè)JVM的核心組件,負(fù)責(zé)解釋執(zhí)行由類裝載器加載的位元組碼檔中的位元組碼指令集合,並通過(guò)Java運(yùn)行時(shí)環(huán)境(JRE)由底層的操作系統(tǒng)實(shí)現(xiàn)操作優(yōu)化位元組碼解釋器使用組合語(yǔ)言編寫(xiě)解釋器重組指令流,提高處理器的吞吐量最大程度的使用高速緩存最大程度的使用寄存器安全管理器(SecurityManager)安全管理器根據(jù)一定的安全策略(securitypolicy)對(duì)JVM中指令的執(zhí)行進(jìn)行控制,主要包括那些可能影響下層操作系統(tǒng)的安全性或者完整性的Java服務(wù)調(diào)用每個(gè)類裝載器都與某個(gè)安全管理器相關(guān),安全管理器負(fù)責(zé)保護(hù)系統(tǒng)不受由加載器載入系統(tǒng)的類企圖執(zhí)行的違法操作所侵害默認(rèn)的類轉(zhuǎn)載器使用信任型安全管理器垃圾收集器(GarbageCollector)垃圾收集器用於檢測(cè)不再使用的對(duì)象,並將它們所佔(zhàn)用的記憶體回收J(rèn)ava語(yǔ)言並不是第一個(gè)使用垃圾收集技術(shù)的語(yǔ)言,垃圾收集是一種成熟的技術(shù),早期的面向?qū)ο笳Z(yǔ)言LISP、SmallTalk等已經(jīng)提供了垃圾收集機(jī)制理想的垃圾收集應(yīng)該回收所有形式的垃圾,如網(wǎng)路連接、I/O路徑等JVM中垃圾收集的啟動(dòng)方式請(qǐng)求式:調(diào)用System.gc()方法請(qǐng)求JVM進(jìn)行垃圾收集要求式:使用new方法創(chuàng)建對(duì)象時(shí),如果記憶體資源不足,則JVM進(jìn)行垃圾收集後臺(tái)式:通過(guò)一個(gè)獨(dú)立的線程檢測(cè)系統(tǒng)的空閒狀態(tài),如果發(fā)現(xiàn)系統(tǒng)空閒了多個(gè)指令週期,則進(jìn)行垃圾收集終結(jié)器方法(finalize)終結(jié)器方法是對(duì)垃圾收集的補(bǔ)充,JVM保證在對(duì)象回收以前調(diào)用對(duì)象的finalize()方法finalize方法的聲明形式:

protectedvoidfinalize(){…}finalize方法的設(shè)計(jì)缺陷

垃圾收集的不可預(yù)期性、對(duì)象復(fù)活問(wèn)題應(yīng)該儘量避免使用finalize方法,如果必須使用,應(yīng)使該方法的執(zhí)行時(shí)間儘量短線程管理(ThreadManagement)線程的概念Java在語(yǔ)言級(jí)別提供了對(duì)線程的支持,Java語(yǔ)言提供了專門API來(lái)啟動(dòng)、停止線程,改變線程的優(yōu)先順序以及處理線程執(zhí)行過(guò)程中發(fā)生的中斷線程管理組件中的分派器(Dispatcher)負(fù)責(zé)控制線程的切換,調(diào)度器(Scheduler)負(fù)責(zé)決定線程的運(yùn)行多線程的實(shí)現(xiàn)機(jī)制使用內(nèi)核線程(KernelThreads)使用內(nèi)核線程的優(yōu)點(diǎn)內(nèi)核線程是由操作系統(tǒng)的內(nèi)核提供的基本服務(wù)。-很容易擴(kuò)展到多個(gè)處理器-線程在創(chuàng)建它的進(jìn)程外可見(jiàn)-JVM可以利用操作系統(tǒng)提供的優(yōu)秀的調(diào)度機(jī)制多線程的實(shí)現(xiàn)機(jī)制使用庫(kù)線程(LibraryThreads)Sun的綠色線程庫(kù)(GreenthreadsLibrary)使用庫(kù)線程的優(yōu)點(diǎn)如果操作系統(tǒng)不提供內(nèi)核線程的服務(wù),或者操作系統(tǒng)支持的內(nèi)核線程不滿足JVM的需要,JVM則通過(guò)自己提供的線程庫(kù)來(lái)支持多線程-線程在不同的平臺(tái)上具有一致的行為-線程的優(yōu)先順序僅在一個(gè)進(jìn)程中有意義輸入/輸出(Input/Output)Java提供了兩種訪問(wèn)I/O設(shè)備的途徑:

-直接調(diào)用操作系統(tǒng)提供的與I/O相關(guān)的庫(kù)函數(shù)

-通過(guò)AWT支持非同步的用戶介面I/O,通過(guò)網(wǎng)路包支持非同步的網(wǎng)路I/O用純的Java語(yǔ)言不能編寫(xiě)設(shè)備驅(qū)動(dòng)程式圖象(Graphics)抽象窗口工具包(AWT)AWT的實(shí)現(xiàn)機(jī)制與不足更強(qiáng)的圖形表現(xiàn)能力Swing觸摸屏介面的支持TrufflesClassesInJavaLanguageTheclassisthefundamentalprogrammingunitoftheJavaprogramminglanguage.(類是Java語(yǔ)言的基本編程單元)Classesprovidethestructureforobjectsandthemechanismstomanufactureobjectsfromaclassdefinition.(類提供了對(duì)象的結(jié)構(gòu),可以根據(jù)類的定義創(chuàng)建對(duì)象)Eachobjectisaninstanceofaclass.(每一個(gè)對(duì)象都是某個(gè)類的實(shí)例)DeclaringClasses(聲明類)聲明類使用如下的語(yǔ)法:

<修飾符>class<類名>{//…classmembers…}保留字class用於聲明類類名用於標(biāo)識(shí)類,類名的第一個(gè)字母必須是Unicode字母或下劃線“_”classBody{publiclongidNum;publicStringname;publicBodyorbits;publicstaticlongnextID=0;}ClassModifiers(類的修飾符)類的修飾符主要用於描述類的可見(jiàn)性、可擴(kuò)展性和計(jì)算精度等屬性,可用修飾符如下:

public

聲明為public的類可以在其他任何類中被使用,如果沒(méi)有聲明為public,則類只能在類所在的包中可使用

abstract

用於聲明抽象類,抽象類不能為實(shí)例化,抽象類通常聲明了需要子類實(shí)現(xiàn)的抽象方法

final

聲明為final的類不能被繼承

strictfp

聲明為strictfp的類中的浮點(diǎn)計(jì)算在所有平臺(tái)的JVM中都要求嚴(yán)格相同注意:一個(gè)類不能同時(shí)聲明為abstract和final的ClassMembers(類的成員)類的成員是指可以聲明在類體中構(gòu)成類的結(jié)構(gòu)的各種組成部分,類可以有成員:

域(Fields)

域是聲明在類體中的各種變數(shù),域可以分為類的域和類的對(duì)象的域,分別表示類或?qū)ο蟮臓顟B(tài)

方法(Methods)

方法是一段可執(zhí)行的代碼,方法可以分為類的方法和類的對(duì)象的方法,分別表示類或類的對(duì)象的行為

嵌套類(NestedClasses)

聲明在類體中的類

嵌套介面(NestedInterfaces)

聲明在類體中的介面Fields(域)域是聲明在類體中的變數(shù)(variables),聲明域的語(yǔ)法如下:

<修飾符><類型><功能變數(shù)名稱>;

<修飾符><類型><功能變數(shù)名稱>=<初始值運(yùn)算式>;classBody{publiclongidNum;publicStringname;publicBodyorbits;publicstaticlongnextID=0;}FieldModifiers(域的修飾符)域的修飾符主要用於描述域的可見(jiàn)性、作用範(fàn)圍以及其他特性,域的修飾符可以有以下幾種:

訪問(wèn)控制修飾符

包括public、protected、private,如果不指定,則域使用默認(rèn)訪問(wèn)修飾符

static

聲明為static的域是類的域,否則為對(duì)象的域

final

聲明為final的域只能被初始化一次

transient

聲明為transient的域不能被序列化

volatile

聲明為volatile的域被多個(gè)線程訪問(wèn)時(shí)永遠(yuǎn)提供域的最新值注意:一個(gè)域不能同時(shí)聲明為volatile和final的FieldTypes(域的類型)域可以被聲明為基本數(shù)據(jù)類型和類類型基本數(shù)據(jù)類型包括:布爾類型boolean

字元類型char

整數(shù)類型byteshortintlong

浮點(diǎn)類型floatdouble

類類型包括各種類、抽象類和介面FieldInitialization(域的初始化)Java語(yǔ)言是一種強(qiáng)類型語(yǔ)言,所有變數(shù)(域和方法中的局部變數(shù))必須被初始化後才能使用域的初始化可以使用兩種方式:隱式和顯式隱式初始化:被聲明為域的變數(shù)取其類型的默認(rèn)值<修飾符><類型><功能變數(shù)名稱>;顯式初始化:由初始化運(yùn)算式計(jì)算得到域的初值<修飾符><類型><功能變數(shù)名稱>=<初始值運(yùn)算式>;域類型的默認(rèn)值類型初始值booleanfalsechar‘\u0000’byte0short0int0long0float0.0fdouble0.0ObjectReferencenullclassBody{publiclongidNum;publicStringname;publicBodyorbits;publicstaticlongnextID=5;}0nullnull5StaticFields(靜態(tài)域)聲明為static的域,稱為靜態(tài)域或類變數(shù)(classvariables),沒(méi)有被static修飾的域,稱為非靜態(tài)域或?qū)嵗償?shù)(instancevariables)靜態(tài)域類似於類的全局變數(shù),用於表示類本身的狀態(tài),被類的所有對(duì)象共用靜態(tài)域可以通過(guò)類名或?qū)ο髢煞N方式訪問(wèn),一般通過(guò)類名訪問(wèn)System.out.println(Body.nextID)final

域被聲明為final的域只能被初始化一次,即不能再次被賦值final域一般用於聲明那些類或?qū)ο蟮牟豢勺兊膶傩?,比如常量被同時(shí)聲明為static和final的域又稱為命名常量(NamedConstant),用於表示那些在類的使用範(fàn)圍內(nèi)有意義的常數(shù)或不變對(duì)象,命名常量的變數(shù)名通常都是大寫(xiě)字母,單詞之間用下劃線“_”連接final域如果是對(duì)象引用(objectreference),仍然可以通過(guò)該域去改變所引用對(duì)象的狀態(tài)AccessControl(域的訪問(wèn)控制)EncapsulationandData-hiding(封裝和數(shù)據(jù)隱藏)通過(guò)訪問(wèn)控制修飾符(accessmodifiers)可以限制域在類或?qū)ο笸獠康目梢?jiàn)性

public

共有的,域在任何地方都可以訪問(wèn)

protected

受保護(hù)的,域僅在類體中、子類類體中或同包的其他類類體中可訪問(wèn)

private

私有的,域僅在類體中可訪問(wèn)

package

默認(rèn)的,沒(méi)有任何訪問(wèn)修飾符修飾的域,僅在類體中、同包的其他類類體中可訪問(wèn)ClassConstructor(類的構(gòu)造函數(shù))構(gòu)造函數(shù)用於初始化對(duì)象的狀態(tài),一般與保留字new一起使用,用於創(chuàng)建類的對(duì)象構(gòu)造函數(shù)與一般的方法相似,但沒(méi)有返回值,而且構(gòu)造函數(shù)必須與類同名如果聲明類時(shí)沒(méi)有聲明構(gòu)造函數(shù),則類將自動(dòng)擁有一個(gè)無(wú)參數(shù)的默認(rèn)構(gòu)造函數(shù)一個(gè)類可以聲明多個(gè)構(gòu)造函數(shù),但構(gòu)造函數(shù)的參數(shù)必須不同classBody{publiclongidNum;publicStringname=“<unnamed>”;publicBodyorbits=null;publicstaticlongnextID=0;Body(){idNum=nextID++;}Body(Stringname){=name;idNum=nextID++;}}this保留字this保留字在類體中有兩種用途:

(1)在類的構(gòu)造函數(shù)中用於調(diào)用類的另一個(gè)構(gòu)造函數(shù)this()或this(…)(2)

在類的構(gòu)造函數(shù)或非靜態(tài)方法中作為對(duì)當(dāng)前對(duì)象本身的引用classBody{…….Body(){idNum=nextID++;}Body(Stringname){=name;idNum=nextID++;}}classBody{…….

Body(){idNum=nextID++;}Body(Stringname){this();=name;}}InitializationBlock(初始化塊)初始化塊使用花括弧對(duì)“{、}”包含的一系列語(yǔ)句,初始化塊一般聲明在類的構(gòu)造函數(shù)之前在創(chuàng)建對(duì)象時(shí),初始化塊中的語(yǔ)句將在類的構(gòu)造函數(shù)調(diào)用前被執(zhí)行初始化塊中可以拋出可檢查性異常,只要該異常在構(gòu)造函數(shù)的異常列表中被聲明classBody{publiclongidNum;publicStringname=“<unnamed>”;publicBodyorbits=null;publicstaticlongnextID=0;{idNum=nextID++;}Body(Stringname){=name;}}StaticInitializationBlock

(靜態(tài)初始化塊)被聲明為static的初始化塊,稱為靜態(tài)初始化塊或靜態(tài)初始化器(StaticInitializer)靜態(tài)初始化塊中的語(yǔ)句只能訪問(wèn)類的靜態(tài)域,並且不能拋出任何異常在類被類裝載器(ClassLoader)第一次加載的過(guò)程將執(zhí)行靜態(tài)初始化塊中的語(yǔ)句,以後將不再被執(zhí)行靜態(tài)初始化塊通常用於初始化類的命名常量和靜態(tài)域classPrimes{staticint[]knowPrimes=newint[4];static{knownPrimes[0]=2;for(inti=1;i<knownPrimes.length;i++)knownPrimes[i]=nextPrimes();}……}CreatingObjects(創(chuàng)建對(duì)象)類的對(duì)象,又稱為類的實(shí)例,一般通過(guò)使用保留字new和類的構(gòu)造函數(shù)來(lái)創(chuàng)建

Bodyunnamed=newBody();Bodyearth=newBody(“Earth”);使用new創(chuàng)建對(duì)象的過(guò)程中可能啟動(dòng)垃圾收集,如果JVM發(fā)現(xiàn)垃圾收集後仍沒(méi)有足夠的內(nèi)容來(lái)創(chuàng)建對(duì)象,將拋出OutOfMemberyError錯(cuò)誤AccessObjectFields(訪問(wèn)對(duì)象的域)在對(duì)象被創(chuàng)建後,就可以通過(guò)對(duì)象的引用(objectreference)來(lái)訪問(wèn)對(duì)象的域?qū)ο蟮挠蚝皖惖挠颍际峭ㄟ^(guò)句點(diǎn)“.”來(lái)訪問(wèn)

Bodyearth=newBody(“Earth”);earth.idNum=Body.nextID;System.out.println();Methods(方法)方法是語(yǔ)句的結(jié)合,方法中的語(yǔ)句可以訪問(wèn)和修改類或類的對(duì)象中域,也可以使用域存放的數(shù)據(jù)進(jìn)行複雜的計(jì)算方法體現(xiàn)了OOP中嚴(yán)格區(qū)分“做什麼”和“怎麼做”的思想方法(特別是public方法)又被看作是類的設(shè)計(jì)者和類的使用者之間的契約(contract)DeclaringMethods(聲明方法)方法位於類體中,方法聲明由方法頭和方法體兩部分構(gòu)成,方法頭中要聲明方法的返回類型和方法可能跑出的異常列表

<修飾符><返回類型><方法名>(<參數(shù)列表>)<異常列表>{/*…方法體…*/}如果方法頭中聲明的返回類型不是void,則方法體結(jié)束時(shí)必須通過(guò)return語(yǔ)言返回執(zhí)行結(jié)果classBodyPrint{publicstaticvoidmain(String[]args){Bodysun=newBody(“Sun”);Bodyearth=newBody(“Earth”);earth.orbits=sun;System.out.println(“Body”++“orbits”+)}}javaBodyPrintBodyEarthorbitsSun方法頭方法體MethodModifiers(方法的修飾符)方法可使用一下修飾符:

訪問(wèn)控制修飾符

與域相同

abstract

聲明為abstract的方法沒(méi)有方法體,一般定義在抽象類中,被子類實(shí)現(xiàn)

static

聲明為static的方法是類的方法,否則為對(duì)象的方法

final

聲明為final的方法不能被子類覆蓋(overridden)

synchronized—

當(dāng)方法可能被多個(gè)線程,為了保持對(duì)象狀態(tài)的一致性,可以通過(guò)synchronized來(lái)控制線程對(duì)方法的訪問(wèn)

native

聲明為native的方法,又稱為本地方法,這種方法通常由其他語(yǔ)言實(shí)現(xiàn)

strictfp

與類相同AccessControl(方法的訪問(wèn)控制)通過(guò)訪問(wèn)控制修飾符(accessmodifiers)可以限制方法在類或?qū)ο笸獠康目梢?jiàn)性

public

共有的,方法在任何地方都可以通過(guò)類或類的對(duì)象調(diào)用

protected

受保護(hù)的,方法僅在類體中、子類類體中或同包的其他類類體中可調(diào)用

private

私有的,方法僅在類體中可調(diào)用

package

默認(rèn)的,沒(méi)有任何訪問(wèn)修飾符修飾的方法,僅在類體中、同包的其他類類體中可調(diào)用InvokingMethods(調(diào)用方法)對(duì)於static方法,可以通過(guò)“類名.方法”調(diào)用

System.gc()對(duì)於對(duì)象的方法,在對(duì)象被創(chuàng)建後,可以通過(guò)“對(duì)象的引用.方法”調(diào)用

System.out.println(…);classBody{

……publicStringtoString(){return“Body”+name;}publicstaticvoidmain(String[]args){Bodyearth=newBody(“Earth”);

System.out.println(earth);}}javaBodyBodyEarthMethodExecution(方法的執(zhí)行)方法被調(diào)用後,執(zhí)行的結(jié)果可能有以下幾種:

(1)通過(guò)return語(yǔ)句返回結(jié)果

(2)執(zhí)行到最後一條語(yǔ)句,自動(dòng)結(jié)束

(3)拋出未捕獲的異常publicclassPermissions{publicbooleancanDeposit,canWithdraw,canClose;}publicclassBankAccount{privatelongnumber;privatelongbalance;publicPermissionspermissionsFor(Personwho){Permissionsperm=newPermissions();perm.canDeposit=canDeposit(who);perm.canWithdraw=canWithdraw(who);perm.canClose=canClose(who);returnperm;}……}方法的參數(shù)傳遞方法調(diào)用時(shí)參數(shù)值的傳遞可以分為“值傳遞”和“引用傳遞”兩種值傳遞—當(dāng)方法的參數(shù)為基本數(shù)據(jù)類型時(shí),實(shí)參的值被複製給形參,改變形參不會(huì)影響實(shí)參的值引用傳遞—當(dāng)方法的參數(shù)為對(duì)象引用時(shí),實(shí)參和形參都同時(shí)引用了同一對(duì)象,通過(guò)形參修改對(duì)象的狀態(tài)後會(huì)影響對(duì)象的其他引用classPassByValue{publicstaticvoidmain(String[]args){doubleone=1.0;System.out.println(“before:one=”+one);halveIt(one);System.out.println(“after:one=”+one);}publicstaticvoidhalveIt(doublearg){arg=arg/2.0;System.out.println(“havled:arg=”+arg);}}javaPassByValuebeforeone=1.0halvedarg=0.5afterone=1.0classPassRef{publicstaticvoidmain(String[]args){Bodysirius=newBody(“Sirius”);//天狼星

System.out.println(“before:”+);commonName(sirius);System.out.println(“before:”+);}publicstaticvoidcommonName(BodybodyRef){bodyR=“DogStar”;bodyRef=null;}}javaPassRefbefore:Siriusafter:DogStarOverloadingMethods(方法重載)方法的簽名(signature):聲明方法的方法頭中方法名加上方法的參數(shù)列表類體中不能聲明簽名完全相同的兩個(gè)方法當(dāng)兩個(gè)方法具有相同的方法名,但有不同數(shù)量或類型的參數(shù),而導(dǎo)致不同的方法簽名時(shí),稱這兩個(gè)方法互相重載

System.out.println(“earth”);System.out.println(100);System.out.println(newBody(“Sun”));main方法main方法必須聲明為以下格式:

publicstaticvoidmain(String[]args){…}main方法是程式執(zhí)行時(shí)第一個(gè)被執(zhí)行的方法以main方法作為執(zhí)行起點(diǎn)的Java程式又稱為JavaApplicationArrayVariables(數(shù)組變數(shù))數(shù)組是多個(gè)數(shù)據(jù)元素的有限有序集合,元素的類型可以是基本數(shù)據(jù)類型或?qū)ο笠?,可以隨機(jī)訪問(wèn)數(shù)組中的元素在Java語(yǔ)言中,數(shù)組是以對(duì)象的形式存在DeclaringArrays(聲明數(shù)組)數(shù)組類型是在基本數(shù)據(jù)類型名或者類類型後面加上方括號(hào)對(duì)“[]”表示,數(shù)組成員為方括號(hào)前的基本數(shù)據(jù)類型或類的對(duì)象引用,聲明數(shù)組變數(shù)的語(yǔ)法如下:一維數(shù)組<修飾符>

<類型名>[]<變數(shù)名>;

<修飾符>

<類型名><變數(shù)名>[];

二維或多維<修飾符>

<類型名>[]…[]<變數(shù)名>;

<修飾符>

<類型名><變數(shù)名>[]…[];int[]numbers;String[]names;int[][]matrix;注意:請(qǐng)儘量不聲明二維以上的數(shù)組變數(shù)AccessingArrays(訪問(wèn)數(shù)組)數(shù)組對(duì)象有一個(gè)整型的域length,它的值表示數(shù)組的長(zhǎng)度

System.out.println(numbers.length);數(shù)組中的元素通過(guò)下麵的形式訪問(wèn):

<數(shù)組變數(shù)名>[元素序數(shù)]

(0≤元素序數(shù)<數(shù)組長(zhǎng)度)System.out.println(numbers[0]);numbers[numbers.length-1]=10;ArrayModifiers(數(shù)組變數(shù)的修飾符)數(shù)組變數(shù)在使用上與一般的變數(shù)相同,可以作為類的域,也可以作為局部變數(shù)或參數(shù)變數(shù)當(dāng)保留字final修飾數(shù)組變數(shù)時(shí),數(shù)組變數(shù)只能被初始化一次,但數(shù)組成員仍然可以修改,無(wú)法將數(shù)組成員為final或volatilefinalint[]numbers={1,2,3};numbers={3,4,5};numbers[0]=3;numbers[1]=4;numbers[2]=5;錯(cuò)誤正確ArrayInitialization(數(shù)組初始化)數(shù)組變數(shù)如果作為類的域,則默認(rèn)的初始值為null,如果作為構(gòu)造函數(shù)、方法的局部變數(shù)或參數(shù)變數(shù),則必須首先初始化數(shù)組變數(shù)的初始化可以分為三種形式:初始化為null、隱式初始化或顯式初始化對(duì)於暫時(shí)不引用任何數(shù)組對(duì)象的數(shù)組變數(shù)可以將其初始化為null

int[]numbers=null;ArrayInitialization(數(shù)組初始化)隱式初始化時(shí),數(shù)組中每個(gè)元素的值為所屬數(shù)據(jù)類型的默認(rèn)值,對(duì)象引用類型為null,隱式初始化採(cǎi)用以下語(yǔ)法:

<類型名>[]<變數(shù)名>=new<類型名>[長(zhǎng)度]<類型名><變數(shù)名>[]=new<類型名>[長(zhǎng)度]如果數(shù)組是多維數(shù)組,則必須在初始化時(shí)確定第一維的長(zhǎng)度int[]numbers=newint[10];String[]names=newString[5];int[][]matrixA=newint[5][5];int[][]matrixB=newint[5][];ArrayInitialization(數(shù)組初始化)顯式初始化可以分為三種形式:

(1)在隱式初始化後,通過(guò)遍歷數(shù)組,為數(shù)組中的每一個(gè)元素賦值

(2)在聲明數(shù)組變數(shù)時(shí),將包含各個(gè)元素值的花括弧對(duì)“{…}”作為初始值,括弧中的各元素值用逗號(hào)隔開(kāi)

(3)創(chuàng)建匿名數(shù)組(AnonymousArray),作為數(shù)組變數(shù)的初始值或?qū)?shù)組變數(shù)重新賦值int[]numbers=newint[10];for(inti=0;i<numbers.length;i++)numbers[i]=i;String[]names=newString[3];names[0]=“Zhang”;names[1]=“Wang”;names[2]=“Li”;int[]numbers={0,1,2,3,4,5,6,7,8,9}String[]names={“Zhang”,“Wang”,“Li”}int[]numbers=newint[]{0,1,2,3,4,5,6,7,8,9};String[]names=newString[3];names=newString[]{“Zhang”,“Wang”,“Li”};ArraysofArrays(數(shù)組的數(shù)組)由於數(shù)組的元素可以是對(duì)象引用,而數(shù)組本身是對(duì)象,因此N(N≥2)維數(shù)組又可以看作為X(X<N)維數(shù)組,數(shù)組的每個(gè)元素是N-X維數(shù)組對(duì)於多維數(shù)組N[x][y]…[z],對(duì)於已確定長(zhǎng)度的維,可以通過(guò)N[x][y]…[m]的形式訪問(wèn)該維所對(duì)應(yīng)的數(shù)組元素float[][]mat=newfloat[4][];for(inti=0;i<mat.length;i++)

mat[i]=newfloat[4];float[]vector0=mat[0];0123matmat.length0123012301230123mat[0]mat[1]mat[2]mat[3]mat[0].lengthArraysofArrays(數(shù)組的數(shù)組)在Java語(yǔ)言中,多維數(shù)組某一維上所對(duì)應(yīng)的各個(gè)數(shù)組元素的長(zhǎng)度可以不相同float[][]mat=newfloat[4][];for(inti=0;i<mat.length;i++)mat[i]=newfloat[i+1];float[]vector2=mat[1];0123matmat.length0010120123mat[0]mat[1](vector2)mat[2]mat[3]ArraysofArrays(數(shù)組的數(shù)組)在聲明多維數(shù)組變數(shù)時(shí),可將包含各個(gè)子數(shù)組元素的花括弧對(duì)“{…}”作為初始值,括弧中的各個(gè)子數(shù)組元素用逗號(hào)隔開(kāi)float[][]pascalsTriangle={{1},{1,1},{1,2,1},{1,3,3,1},{1,4,6,4,1}};float[]vector2=pascalsTriangle[1];//vector2={1,1}String(字串類)Java語(yǔ)言中用java.lang.String類來(lái)表示字串?dāng)?shù)據(jù),同時(shí)String類也提供了許多與字串操作相關(guān)的方法在Java語(yǔ)言中,字串是由多個(gè)Unicode字元組成的序列,在String類的內(nèi)部使用了一個(gè)char[]數(shù)組來(lái)存放字串中的字元String類的構(gòu)造函數(shù)

String()String(Stringoriginal)String(char[]value)String(char[]value,intoffset,intcount)

String(byte[]bytes)String(byte[]bytes,intoffset,intcount)String(byte[]bytes,Stringcharset)String(byte[]bytes,intoffset,intcount,Stringcharset)

String(StringBufferbuffer)String()

構(gòu)造函數(shù)默認(rèn)函數(shù)String()用於創(chuàng)建一個(gè)不包含任何字元的空串

Stringempty=newString();

等價(jià)於使用直接量“”初始化字串

Stringempty=“”;String(Stringoriginal)

構(gòu)造函數(shù)構(gòu)造函數(shù)String(Stringoriginal)創(chuàng)建的字串對(duì)象具有與作為參數(shù)傳入的字串對(duì)象相同的字元序列,該構(gòu)造函數(shù)又稱為“拷貝構(gòu)造函數(shù)”由於字串對(duì)象創(chuàng)建後其值不可改變,失去了該拷貝構(gòu)造函數(shù)的意義,因此該儘量避免使用該構(gòu)造函數(shù)StringandcharArrays由於String類內(nèi)部使用char[]數(shù)組來(lái)存放字串中的字元,因此String類與char[]數(shù)組之間可以互相轉(zhuǎn)換通過(guò)構(gòu)造函數(shù)String(char[])或String(char[],int,int)可以由char[]數(shù)組創(chuàng)建字串對(duì)象String類的length()方法,返回的是String類內(nèi)部char[]數(shù)組的長(zhǎng)度,也就是字串的長(zhǎng)度String類也提供了許多與char相關(guān)的方法char[]chars={‘g’,’o’,’o’,’d’};StringgoodString=newString(chars);StringgoString=newString(chars,0,2);System.out.println(goodString);System.out.println(goString);goodgocharcharAt(intindex)voidgetChars(intsrcBegin,intsrcEnd,char[]dst,intdstBegin)char[]toCharArray()Stringreplace(charoldChar,charnewChar)intindexOf(intch)intindexOf(intch,intfromIndex)intlastIndexOf(intch)intlastIndexOf(intch,intfromIndex)staticStringcopyValueOf(char[]data)StringandbyteArrays16位Unicode字元數(shù)據(jù)序列可以根據(jù)一定的字元編碼(characterencoding)規(guī)則轉(zhuǎn)換為8位的位元組數(shù)據(jù)序列JVM必須支持的字元編碼有

US-ASCII、ISO-8859-1、UTF-8、UTF-16UTF-16BE、UTF-16LE中文字元編碼有GB2312、GBK或Big5字串中的字元c根據(jù)“UTF-8編碼”轉(zhuǎn)換為位元組序列的編碼方式如下:如果c∈

[\u0001,\u007f],則直接將c轉(zhuǎn)換為一個(gè)位元組

(byte)c如果c∈[\u0080,\u07ff]或c=\u0000,則將c轉(zhuǎn)換為兩個(gè)位元組

(byte)(0xc0|(0x1f&(c>>6)))(byte)(0x80|(0x3f&c))

如果c∈[\u0800,\uffff],則將c轉(zhuǎn)換為三個(gè)位元組

(byte)(0xe0|(0x0f&(c>>12)))(byte)(0x80|(0x3f&(c>>6)))(byte)(0x80|(0x3f&c))

StringandbyteArrays通過(guò)構(gòu)造函數(shù)String(byte[])、String(byte[],int,int)或String(byte[],String)、String(byte[],int,int,String)可以由byte[]數(shù)組創(chuàng)建字串對(duì)象,前兩個(gè)構(gòu)造函數(shù)使用當(dāng)前操作系統(tǒng)默認(rèn)的字元編碼將byte[]數(shù)組轉(zhuǎn)換為char[]數(shù)組,後兩個(gè)構(gòu)造函數(shù)使用指定的字元編碼進(jìn)行轉(zhuǎn)換String類還提供了兩個(gè)與byte[]數(shù)組相關(guān)的方法:

byte[]getBytes()byte[]getBytes(Stringcharset)byte[]bytes={49,50,51,43,52,53,54,61,53,55,57};Stringexp=newString(bytes,“US-ASCII”);System.out.println(exp);123+456=579StringComparisons(字串比較)當(dāng)判等號(hào)“==”一般用於比較兩個(gè)基本數(shù)據(jù)類型的變數(shù)的值是否相等,當(dāng)判等號(hào)“==”比較兩個(gè)對(duì)象引用變數(shù)時(shí),如果兩個(gè)變數(shù)引用了同一個(gè)對(duì)象則結(jié)果為true,否則為false要對(duì)兩個(gè)String對(duì)象進(jìn)行比較,應(yīng)該使用以下方法:

booleanequals(ObjectotherString)booleanequalsIgnoreCase(StringotherString)Stringstr1=newString(“good”);Stringstr2=newString(“good”);booleanb1=str1==str2;Stringstr3=“good”;Stringstr4=“good”;booleanb2=str3==str4;b1=?falseb2=?trueStringstr1=newString(“good”);Stringstr2=newString(“good”);booleanb1=str1.equals(str2);Stringstr3=“good”;Stringstr4=“good”;booleanb2=str3.equals(str4);b1==trueb2==trueStringComparisons(字串比較)String類提供了以下兩個(gè)方法對(duì)字串進(jìn)行排序比較:

intcompareTo(Stringother)intcompareToIgnoreCase(Stringother)如果返回正數(shù),則表示被調(diào)用方法的字串對(duì)象應(yīng)排在傳入的參數(shù)字串之前,如果返回負(fù)數(shù),則表示被調(diào)用方法的字串對(duì)象應(yīng)排在傳入的參數(shù)字串之後,如果返回零,則表示兩個(gè)字串的字元完全相等,排列不分先後String[]table;……publicintposition(Stringkey){intlo=0,hi=table.length-1;while(lo<=hi){intmid=lo+(hi-lo)/2intcmp=pareTo(table[mid]);if(cmp==0)returnmid;elseif(cmp<0)hi=mid-1;elselo=mid+1;}return-1;}SubstringOperations(子串操作)String類提供了以下兩個(gè)取子串的方法:

Stringsubstring(intbeginIndex)Stringsubstring(intbeginIndex,intendIndex)Stringwords=“goodmorning”;Stringsub1=words.substring(5);Stringsub2=words.substring(0,4);System.out.println(sub1);System.out.println(sub2);morninggoodSubstringOperations(子串操作)String類提供了許多與子串匹配相關(guān)的方法

booleanregionMatches(intstart,Stringother,intostart,intcount)booleanregionMatches(booleanignoreCase,intstart,Stringother,intostart,intcount)booleanstartsWith(Stringprefix)booleanstartsWith(Stringprefix,intstart)booleanendsWith(Stringsuffix)ClassRegionMatch{publicstaticvoidmain(String[]args){Stringstr=“Look,look!”;booleanb1,b2,b3;b1=str.regionMatches(6,“Look”,0,4);b2=str.regionMatches(true,6,“Look”,0,4);b3=str.regionMatches(true,6,“Look”,0,5);System.out.println(“b1=”+b1);System.out.println(“b2”=+b2);System.out.println(“b3=”+b3);}}b1=falseb2=trueb3=false字串與基本數(shù)據(jù)類型間的轉(zhuǎn)換String類提供了以下靜態(tài)方法獲得其他基本數(shù)據(jù)類型值的字串表示:

staticStringvalueOf(boolean)staticStringvalueOf(char)staticStringvalueOf(float)staticStringvalueOf(double)staticStringvalueOf(int)staticStringvalueOf(long)staticStringvalueOf(Object)字串與基本數(shù)據(jù)類型間的轉(zhuǎn)換除Boolean類外,每個(gè)包裝器類都提供了一個(gè)靜態(tài)方法parseXXX,將字串對(duì)象轉(zhuǎn)換為對(duì)應(yīng)的基本數(shù)據(jù)類型值

byteByte.parseByte(String)intInteger.parseInt(String)longLong.parseLong(String)floatFloat.parseFloat(String)doubleDouble.parseDouble(String)

newBoolean(String).booleanValue()String類的其他方法Stringconcat(String)Stringtrim()StringtoLowerCase()StringtoUpperCase()StringtoLowerCase(Locale)StringtoUpperCase(Locale)關(guān)於String類的所有方法的詳細(xì)用法請(qǐng)查閱Sun公司的JavaAPI

使用幫助文檔StringBuffer(字串緩衝類)String類的對(duì)象創(chuàng)建後其包含的字元序列不可變,對(duì)多個(gè)String類直接量進(jìn)行連接操作會(huì)創(chuàng)建多個(gè)臨時(shí)的String類對(duì)象StringBuffer類的對(duì)象提供了一個(gè)字元序列的暫存空間,可以對(duì)該對(duì)象中包含的字元序列進(jìn)行增、刪、改等操作而無(wú)需創(chuàng)建新的String類對(duì)象,並提供方法返回最終的字串,一般用於涉及多個(gè)字串連接的操作publicstaticStringguillemete(Stringquote){return‘<<’+quote+‘>>’;}returnString.valueOf(‘<<’).concat(quote).concat(String.valueOf(‘>>’))編譯StringBuffer類的構(gòu)造函數(shù)StringBuffer()StringBuffer(intl

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論