版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
程序設(shè)計(jì)訓(xùn)練復(fù)習(xí)綱要Java語(yǔ)言根底知識(shí)Java語(yǔ)言與面向?qū)ο蟮某绦蛟O(shè)計(jì)簡(jiǎn)述面向?qū)ο蟮木幊陶Z(yǔ)言與以往編程語(yǔ)言的根本不同點(diǎn)面向?qū)ο蟮木幊陶Z(yǔ)言與以往編程語(yǔ)言的根本不同在于抽象機(jī)制的不同。機(jī)器語(yǔ)言和匯編語(yǔ)言幾乎沒有抽象,對(duì)于機(jī)器而言是最適宜的描述,它可以直接操作機(jī)器的硬件,并且任何操作都是面向機(jī)器的,這就要求人們?cè)谑褂脵C(jī)器語(yǔ)言或匯編語(yǔ)言編寫程序時(shí),必須按照機(jī)器的方式去思考問題。因?yàn)闆]有抽象機(jī)制,所以程序員不得不陷入復(fù)雜的事物之中。面向過程的語(yǔ)言使程序員可以離開機(jī)器層次,在更抽象的層次上表達(dá)意圖。但它所關(guān)注的只是處理過程,即執(zhí)行預(yù)期計(jì)算所需要的算法。面向?qū)ο蟮木幊陶Z(yǔ)言將客觀事物看作具有狀態(tài)和行為的對(duì)象,通過抽象找出同一類對(duì)象的共同狀態(tài)〔靜態(tài)特征〕和行為〔動(dòng)態(tài)特征〕,構(gòu)成模型——類。而程序需要解決的問題便反映為各種不同屬性的對(duì)象以及對(duì)象之間的關(guān)系和消息傳遞。面向?qū)ο蟮姆椒ㄔ诔绦蛟O(shè)計(jì)領(lǐng)域是一種相對(duì)較新的方法,它更接近于人類處理現(xiàn)實(shí)世界問題的自然思維方法。封裝的好處封裝帶來的好處是:隱藏類的數(shù)據(jù)、控制用戶對(duì)類的修改和控制數(shù)據(jù)訪問權(quán)限面向?qū)ο蠹夹g(shù)給軟件開展帶來的益處可重用性:一個(gè)設(shè)計(jì)好的類可以在今后的程序開發(fā)中被局部或全部地重復(fù)利用??煽啃裕好恳粋€(gè)類作為一個(gè)獨(dú)立單元可以單獨(dú)進(jìn)行測(cè)試、維護(hù),大量代碼來源于可靠的類庫(kù),因而開發(fā)新程序時(shí)新增代碼明顯減少,這是程序可靠性提高的一個(gè)重要原因。面向?qū)ο笳Z(yǔ)言的根本特征抽象和封裝:抽象的結(jié)果形成類,類中的數(shù)據(jù)和方法是受保護(hù)的,可以根據(jù)需要設(shè)置不同的訪問控制屬性。這便保證了數(shù)據(jù)的平安性,隱藏了方法的實(shí)現(xiàn)細(xì)節(jié),也方便了使用。繼承性:可以對(duì)已有類增加屬性和功能,或進(jìn)行局部修改來建立新的類,實(shí)現(xiàn)代碼的重用。多態(tài)性:在面向?qū)ο蟮某绦蛑校粋€(gè)消息被不同對(duì)象接收后可以導(dǎo)致不同的行為。Java語(yǔ)言的特點(diǎn)面向?qū)ο螅篔ava是完全面向?qū)ο蟮恼Z(yǔ)言。Java語(yǔ)言提供類的機(jī)制,在對(duì)象中封裝了成員變量和方法,實(shí)現(xiàn)了數(shù)據(jù)的封裝和信息隱藏;類提供了一類對(duì)象的模型,通過繼承和多態(tài),實(shí)現(xiàn)了代碼的復(fù)用。平安性:Java不支持指針,一切對(duì)內(nèi)存的訪問都必須經(jīng)過對(duì)象的實(shí)例變量實(shí)現(xiàn),防止了以不法手段訪問對(duì)象的私有成員,同時(shí)防止了指針操作中容易產(chǎn)生的錯(cuò)誤。Java的內(nèi)部平安措施保證了Java程序在Java虛擬機(jī)規(guī)那么下操作,防止未授權(quán)的程序訪問含有專用信息的系統(tǒng)資源或危及客戶機(jī)的完整性。操作平臺(tái)無關(guān)性:Java編譯器生成與平臺(tái)無關(guān)的字節(jié)碼指令,只要安裝了Java運(yùn)行系統(tǒng),其程序就可以在任意的處理器上運(yùn)行。這些字節(jié)碼對(duì)應(yīng)于Java虛擬機(jī)中的表示,Java解釋器得到字節(jié)碼后,對(duì)其進(jìn)行解釋,使之能夠在不同的平臺(tái)下運(yùn)行。不同的操作系統(tǒng)有不同的虛擬機(jī),與平臺(tái)無關(guān)的特性使得Java程序可以方便地移植到不同的機(jī)器上。多線程:Java是第一個(gè)在語(yǔ)言級(jí)提供內(nèi)置多線程支持的高級(jí)語(yǔ)言,這大大簡(jiǎn)化了多線程程序的編寫。而一些其他語(yǔ)言要通過調(diào)用操作系統(tǒng)的原語(yǔ)來支持多線程。動(dòng)態(tài)內(nèi)存分配:Java中所有的對(duì)象都是通過動(dòng)態(tài)內(nèi)存分配建立的,Java對(duì)內(nèi)存自動(dòng)進(jìn)行管理并進(jìn)行垃圾回收,防止了因程序員失誤而導(dǎo)致的內(nèi)存分配錯(cuò)誤,進(jìn)而更好地利用了系統(tǒng)資源。Java程序概述Java程序編譯執(zhí)行的過程首先把源文件〔.java文件〕編譯成字節(jié)碼文件,即類文件〔.class〕;然后由解釋器負(fù)責(zé)解釋執(zhí)行類文件。Java平臺(tái)Java平臺(tái)包括Java應(yīng)用程序接口〔API〕和Java虛擬機(jī)〔Javavirtualmachine,JVM〕。Java應(yīng)用程序接口是指經(jīng)過編譯的,可在程序中直接使用的Java代碼標(biāo)準(zhǔn)庫(kù)。Java虛擬機(jī)負(fù)責(zé)解釋和執(zhí)行Java程序。Java程序運(yùn)行于Java平臺(tái)之上,Java虛擬機(jī)將程序和硬件隔離開來。根本數(shù)據(jù)類型與表達(dá)式變量的作用域變量的作用域指可以訪問該變量的程序代碼范圍。按照作用域的不同,變量可以分為類成員變量和局部變量。類成員變量在類的聲明體中聲明,其作用域?yàn)檎麄€(gè)類;局部變量在方法體或方法的代碼塊中聲明,其作用域?yàn)樗诘拇a塊〔即花括號(hào){}的范圍〕。根本數(shù)據(jù)類型〔根本數(shù)據(jù)類型有幾種?分別是什么?〕根本數(shù)據(jù)類型是指Java固有的數(shù)據(jù)類型,可以分為數(shù)字型、布爾型和字符型數(shù)字型根本數(shù)據(jù)類型有六種,其說明如下表:char類型說明長(zhǎng)度最小值最大值byte帶符號(hào)位整數(shù)8位-128127short帶符號(hào)短整數(shù)16位-215215-1int帶符號(hào)整數(shù)32位-231231-1long帶符號(hào)長(zhǎng)整數(shù)64位-263263-1float單精度浮點(diǎn)數(shù)32位2-149(2-2-23).2127double雙精度浮點(diǎn)數(shù)64位2-1074(2-2-52).21023布爾型數(shù)據(jù)表示一個(gè)邏輯量,只有兩個(gè)值true和false,它們不對(duì)應(yīng)于任何整數(shù)值。字符類型數(shù)據(jù)用于存儲(chǔ)單個(gè)字符,字符以代碼形式存儲(chǔ)。Java字符數(shù)據(jù)類型是16位,最小值0,最大值65535,放置Unicode符號(hào)。類型轉(zhuǎn)換的分類類型轉(zhuǎn)換可以分成擴(kuò)展轉(zhuǎn)換和窄化轉(zhuǎn)換兩類。byte,short,int,long,float,double
char擴(kuò)展double,float,long,int,short,byte,char窄化按照擴(kuò)展方向轉(zhuǎn)化,從一種整型轉(zhuǎn)換到另一種整型,或者從float轉(zhuǎn)換到double時(shí),不損失任何信息。從整型轉(zhuǎn)換到float或者double將損失精度。窄化轉(zhuǎn)換可能會(huì)喪失信息。發(fā)生類型轉(zhuǎn)換的四種可能情況賦值轉(zhuǎn)換方法調(diào)用轉(zhuǎn)換強(qiáng)制類型轉(zhuǎn)換字符串轉(zhuǎn)換數(shù)組的概念數(shù)組的概念數(shù)組是由同類型的數(shù)據(jù)元素構(gòu)成的一種數(shù)據(jù)結(jié)構(gòu)。數(shù)據(jù)元素可以是根本數(shù)據(jù)類型也可以是引用類型。通過數(shù)組名和數(shù)組元素下標(biāo)〔或稱為索引〕可以引用數(shù)組中的元素。每個(gè)數(shù)組都有一個(gè)名為length的成員變量,用來表示數(shù)組所包含的元素的個(gè)數(shù),length只能是正整數(shù)或零。數(shù)組創(chuàng)立之后length就不能被改變。數(shù)組的創(chuàng)立和引用圖示下面創(chuàng)立并初始化一個(gè)三行的二維數(shù)組的過程int[][]myArray;myArray=newint[3][];myArray[0]=newint[3];int[]x={0,2};int[]y={0,1,2,3,4};myArray[1]=x;myArray[2]=y;類與對(duì)象的根本概念面向?qū)ο蟮某绦蛟O(shè)計(jì)方法概述抽象抽象就是忽略問題中與當(dāng)前目標(biāo)無關(guān)的那些內(nèi)容,以便更充分地注意與當(dāng)前目標(biāo)有關(guān)的方面。計(jì)算機(jī)軟件開發(fā)中所使用的抽象有過程抽象及數(shù)據(jù)抽象兩類。過程抽象將整個(gè)系統(tǒng)的功能劃分為假設(shè)干局部,強(qiáng)調(diào)功能完成的過程和步驟,而隱藏其具體的實(shí)現(xiàn)。基于過程抽象的兩個(gè)標(biāo)準(zhǔn)程序設(shè)計(jì)技術(shù)是過程分解及遞歸技術(shù)。數(shù)據(jù)抽象是將系統(tǒng)中需要處理的數(shù)據(jù)和這些數(shù)據(jù)上的操作結(jié)合在一起,抽象成不同的抽象數(shù)據(jù)類型,每個(gè)抽象數(shù)據(jù)類型既包含了數(shù)據(jù),也包含了針對(duì)這些數(shù)據(jù)的操作。相對(duì)于過程抽象,數(shù)據(jù)抽象是更為合理的抽象方法。面向?qū)ο蟮能浖_發(fā)方法的主要特點(diǎn)之一就是采用了數(shù)據(jù)抽象的方法來構(gòu)建程序的類及對(duì)象。封裝封裝是一種信息隱蔽技術(shù),就是利用抽象數(shù)據(jù)類型將數(shù)據(jù)和基于數(shù)據(jù)的操作封裝在一起。用戶只能看到對(duì)象的封裝界面信息,對(duì)象的內(nèi)部細(xì)節(jié)對(duì)用戶是隱蔽的。封裝的目的在于將對(duì)象的使用者和設(shè)計(jì)者分開,使用者不必知道行為實(shí)現(xiàn)的細(xì)節(jié),只需使用設(shè)計(jì)者提供的消息來訪問對(duì)象。繼承繼承是指新的類可以獲得已有類〔稱為超類、基類或父類〕的屬性和行為,稱新類為已有類的派生類〔也稱為子類〕。在繼承過程中派生類繼承了基類的特性,包括方法和實(shí)例變量。派生類也可修改繼承的方法或增加新的方法,使之更適合特殊的需要。繼承有助于解決軟件的可重用性問題,使程序結(jié)構(gòu)清晰,降低了編碼和維護(hù)的工作量。單繼承任何一個(gè)派生類都只有單一的直接父類,類層次結(jié)構(gòu)為樹狀結(jié)構(gòu)。多繼承一個(gè)類可以有一個(gè)以上的直接父類,類層次結(jié)構(gòu)為網(wǎng)狀結(jié)構(gòu),設(shè)計(jì)及實(shí)現(xiàn)比擬復(fù)雜。多態(tài)多態(tài)是指一個(gè)程序中同名的不同方法共存,主要通過子類對(duì)父類方法的覆蓋來實(shí)現(xiàn)。不同類的對(duì)象可以響應(yīng)同名的消息(方法),具體的實(shí)現(xiàn)方法卻不同。多態(tài)性使語(yǔ)言具有靈活、抽象、行為共享、代碼共享的優(yōu)勢(shì),很好地解決了應(yīng)用程序方法同名問題。類與對(duì)象類和對(duì)象一個(gè)類是對(duì)一類對(duì)象的描述。類是構(gòu)造對(duì)象的模板,對(duì)象是類的具體實(shí)例類的聲明語(yǔ)法格式[public][abstract|final]class類名稱[extends父類名稱][implements接口名稱列表]{變量成員聲明及初始化;方法聲明及方法體;}說明:class:說明其后聲明的是一個(gè)類extends:如果所聲明的類是從某一父類派生而來,那么,父類的名字應(yīng)寫在extends之后implements:如果所聲明的類要實(shí)現(xiàn)某些接口,那么,接口的名字應(yīng)寫在implements之后修飾符可以有多個(gè),用來限定類的使用方式public:說明此類為公有類abstract:指明此類為抽象類final:指明此類為終結(jié)類對(duì)象的創(chuàng)立生成實(shí)例的格式:new<類名>()其作用是:在內(nèi)存中為此對(duì)象分配內(nèi)存空間,返回對(duì)象的引用〔reference,相當(dāng)于對(duì)象的存儲(chǔ)地址〕。數(shù)據(jù)成員數(shù)據(jù)成員表示Java類的狀態(tài)。聲明數(shù)據(jù)成員必須給出變量名及其所屬的類型,同時(shí)還可以指定其他特性。在一個(gè)類中成員變量名是唯一的。數(shù)據(jù)成員的類型可以是Java中任意的數(shù)據(jù)類型〔簡(jiǎn)單類型,類,接口,數(shù)組〕。分為實(shí)例變量和類變量。數(shù)據(jù)成員的聲明格式:[public|protected|private][static][final][transient][volatile]變量數(shù)據(jù)類型變量名1[=變量初值],變量名2[=變量初值],…;格式說明public、protected、private為訪問控制符static指明這是一個(gè)靜態(tài)成員變量final指明變量的值不能被修改transient指明變量是臨時(shí)狀態(tài)volatile指明變量是一個(gè)共享變量實(shí)例變量沒有static修飾的變量稱為實(shí)例變量〔InstanceVariables〕。用來存儲(chǔ)所有實(shí)例都需要的屬性信息,不同實(shí)例的屬性值可能會(huì)不同??赏ㄟ^下面的表達(dá)式訪問實(shí)例屬性的值<實(shí)例名>.<實(shí)例變量名>類變量類變量也稱為靜態(tài)變量,聲明時(shí)需加static修飾符。不管類的對(duì)象有多少,類變量只存在一份,在整個(gè)類中只有一個(gè)值。類初始化的同時(shí)就被賦值。適用情況:類中所有對(duì)象都相同的屬性經(jīng)常需要共享的數(shù)據(jù)系統(tǒng)中用到的一些常量值引用格式:<類名|實(shí)例名>.<類變量名>方法成員方法成員定義類的行為:一個(gè)對(duì)象能夠做的事情我們能夠從一個(gè)對(duì)象取得的信息可以沒有,也可以有多個(gè);一旦在類中聲明了方法,它就成為了類聲明的一局部。分為實(shí)例方法和類方法聲明格式:[public|protected|private][static][final][abstract][native][synchronized]返回類型方法名([參數(shù)列表])[throwsexceptionList]{方法體}格式說明:方法修飾public、protected、private為存取控制符static指明方法是一個(gè)類方法final指明方法是一個(gè)終結(jié)方法abstract指明方法是一個(gè)抽象方法native用來集成java代碼和其它語(yǔ)言的代碼synchronized用來控制多個(gè)并發(fā)線程對(duì)共享數(shù)據(jù)的訪問返回類型方法返回值的類型,可以是任意的Java數(shù)據(jù)類型當(dāng)不需要返回值時(shí),返回類型為void參數(shù)類型簡(jiǎn)單數(shù)據(jù)類型,引用類型(數(shù)組、類或接口)可以有多個(gè)參數(shù),也可以沒有參數(shù),方法聲明時(shí)的參數(shù)稱為形式參數(shù)throwsexceptionList用來處理異常包的作用將相關(guān)的源代碼文件組織在一起;不同包中的類名可以相同,從而可以防止名字沖突;提供包一級(jí)的封裝及存取權(quán)限。編譯單元的組成所屬包的聲明〔省略,那么屬于默認(rèn)包〕;Import〔引入〕包的聲明,用于導(dǎo)入外部的類;類和接口的聲明。類的訪問控制類的訪問控制只有public〔公共類〕及無修飾符〔缺省類〕兩種訪問權(quán)限符與訪問能力之間的關(guān)系如表類型無修飾public同一包中的類yesyes不同包中的類noyes類成員的訪問控制類型private無修飾protectedpublic同一類yesyesyesyes同一包中的子類noyesyesyes同一包中的非子類noyesyesyes不同包中的子類nonoyesyes不同包中的非子類nononoyes關(guān)鍵字this的使用super如果形式參數(shù)名與實(shí)例變量名相同,那么需要在實(shí)例變量名之前加this關(guān)鍵字,否那么系統(tǒng)會(huì)將實(shí)例變量當(dāng)成形式參數(shù)。對(duì)象的初始化和回收構(gòu)造方法構(gòu)造方法〔Constructor〕是一種特殊的方法。Java中的每個(gè)類都有構(gòu)造方法,用來初始化該類的一個(gè)新的對(duì)象。構(gòu)造方法具有和類名相同的名稱,而且不返回任何數(shù)據(jù)類型。系統(tǒng)在產(chǎn)生對(duì)象時(shí)會(huì)自動(dòng)執(zhí)行。構(gòu)造方法的特點(diǎn)〔簡(jiǎn)述構(gòu)造方法的特點(diǎn)〕構(gòu)造方法的方法名與類名相同;構(gòu)造方法沒有返回類型〔修飾符void也不能有〕;構(gòu)造方法通常被聲明為公有的〔public〕;構(gòu)造方法可以有任意多個(gè)參數(shù);構(gòu)造方法的主要作用是完成對(duì)象的初始化工作;構(gòu)造方法不能在程序中顯式的調(diào)用;在生成一個(gè)對(duì)象時(shí),系統(tǒng)會(huì)自動(dòng)調(diào)用該類的構(gòu)造方法為新生成的對(duì)象初始化。應(yīng)用舉例UML簡(jiǎn)介類的方法方法的控制流程Java中的流程控制Java中的流程控制主要有順序結(jié)構(gòu)、選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)三種。順序結(jié)構(gòu)即是按照從上到下的順序執(zhí)行語(yǔ)句,沒有轉(zhuǎn)移和重復(fù)。選擇結(jié)構(gòu)是根據(jù)給定的條件成立與否,執(zhí)行不同的語(yǔ)句或語(yǔ)句組。Java的選擇結(jié)構(gòu)主要有二路選擇結(jié)構(gòu)〔if選擇結(jié)構(gòu)〕及多路選擇結(jié)構(gòu)〔switch選擇結(jié)構(gòu)〕兩種。循環(huán)控制結(jié)構(gòu)是在一定的條件下,反復(fù)執(zhí)行某段程序的流程結(jié)構(gòu),被反復(fù)執(zhí)行的程序稱為循環(huán)體。循環(huán)包括幾個(gè)局部初始化局部:用來設(shè)置循環(huán)的一些初始條件,如計(jì)數(shù)器清零等。循環(huán)體局部:這是反復(fù)執(zhí)行的一段代碼,可以是單一的一條語(yǔ)句,也可以是復(fù)合語(yǔ)句。迭代局部:這是當(dāng)前循環(huán)結(jié)束,下次循環(huán)開始執(zhí)行的語(yǔ)句,常常用來使計(jì)數(shù)器進(jìn)行增減操作。終止局部:通常是布爾表達(dá)式,每一次循環(huán)要對(duì)該表達(dá)式求值,以驗(yàn)證是否滿足循環(huán)終止條件。break語(yǔ)句的用法break語(yǔ)句可用于三種情況:在switch結(jié)構(gòu)中,break語(yǔ)句用來終止switch語(yǔ)句的執(zhí)行。在for循環(huán)及while循環(huán)結(jié)構(gòu)中,用于終止break語(yǔ)句所在的最內(nèi)層循環(huán)。break語(yǔ)句也可用在代碼塊中,用于跳出它所指定的塊。break與label一同使用舉例publicclassExamp3_7{ publicstaticvoidmain(String[]args){ outer: for(inti=1;i<=9;i++){ for(intj=1;j<=9;j++){if(j>i)break;if(i==6)breakouter;System.out.print(""+i+"*"+j+"="+i*j);}System.out.println(); }}}continue語(yǔ)句的用法continue語(yǔ)句必須用于循環(huán)結(jié)構(gòu)中,continue語(yǔ)句有兩種使用格式:不帶標(biāo)號(hào)的continue語(yǔ)句。它的作用是終止當(dāng)前這一輪循環(huán),跳出本輪循環(huán)剩余的語(yǔ)句,直接進(jìn)入當(dāng)前循環(huán)的下一輪。在while或do-while循環(huán)中,不帶標(biāo)號(hào)的continue語(yǔ)句會(huì)使流程直接跳轉(zhuǎn)至條件表達(dá)式;在for循環(huán)中,不帶標(biāo)號(hào)的continue語(yǔ)句會(huì)跳轉(zhuǎn)至表達(dá)式update-expression,計(jì)算并修改循環(huán)變量后再判斷循環(huán)條件。帶標(biāo)號(hào)的continue語(yǔ)句。帶標(biāo)號(hào)的continue語(yǔ)句使程序的流程直接轉(zhuǎn)入標(biāo)號(hào)標(biāo)明的循環(huán)層次。帶標(biāo)號(hào)的continue語(yǔ)句舉例publicclassExamp3_10{ publicstaticvoidmain(Stringargs[]){ outer: for(inti=1;i<10;i++){ inner: for(intj=1;j<10;j++){ if(i<j){System.out.println(); continueouter; } System.out.print(""+i+"*"+j+"="+i*j); } } }}求出100以內(nèi)的素?cái)?shù),并將這些數(shù)在屏幕上5個(gè)一行地顯示出來。publicclassprimeIn100{
publicvoidprime(){
intcount=0;
Outer:
for(inti=2;i<100;i++){
for(intj=2;j<=Math.floor(Math.sqrt(i));j++){
if(i%j==0)continueOuter;
}
System.out.print(i+" ");
count++;
if(count%5==0)System.out.println();
}
}
publicstaticvoidmain(Stringargs[]){
primeIn100p=newprimeIn100();
p.prime();
}
}異常處理簡(jiǎn)介異常的根本概念又稱為例外,是特殊的運(yùn)行錯(cuò)誤對(duì)象,是面向?qū)ο髽?biāo)準(zhǔn)的一局部,是異常類的對(duì)象。Java中聲明了很多異常類,每個(gè)異常類都代表了一種運(yùn)行錯(cuò)誤,類中包含了該運(yùn)行錯(cuò)誤的信息和處理錯(cuò)誤的方法。每當(dāng)Java程序運(yùn)行過程中發(fā)生一個(gè)可識(shí)別的運(yùn)行錯(cuò)誤時(shí),即該錯(cuò)誤有一個(gè)異常類與之相對(duì)應(yīng)時(shí),系統(tǒng)都會(huì)產(chǎn)生一個(gè)相應(yīng)的該異常類的對(duì)象,即產(chǎn)生一個(gè)異常。錯(cuò)誤的分類通常程序中的錯(cuò)誤可以分成三類,即編譯錯(cuò)誤、運(yùn)行錯(cuò)誤和邏輯錯(cuò)誤。Java系統(tǒng)中根據(jù)錯(cuò)誤的嚴(yán)重程度不同,將錯(cuò)誤分為兩類:錯(cuò)誤:是致命性的,即程序遇到了非常嚴(yán)重的不正常狀態(tài),不能簡(jiǎn)單地恢復(fù)執(zhí)行。異常:是非致命的,通過某種修正后程序還能繼續(xù)執(zhí)行。異常的拋出和捕獲當(dāng)程序中發(fā)生異常時(shí),稱程序產(chǎn)生了一個(gè)異常事件,相應(yīng)地生成異常對(duì)象。生成的異常對(duì)象傳遞給Java運(yùn)行時(shí)系統(tǒng)。異常的產(chǎn)生和提交的這一過程稱為拋出。異常發(fā)生時(shí),Java運(yùn)行時(shí)系統(tǒng)從生成對(duì)象的代碼開始,沿方法的調(diào)用棧逐層回溯,尋找相應(yīng)的處理代碼,并把異常對(duì)象交給該方法處理,這一過程稱為捕獲。異常的處理對(duì)于檢查型異常,Java強(qiáng)迫程序必須進(jìn)行處理,處理方法有以下兩種:聲明拋出異常:不在當(dāng)前方法內(nèi)處理異常,而是把異常拋出到調(diào)用方法中。捕獲異常:使用try{}catch(){}塊,捕獲到所發(fā)生的異常,并進(jìn)行相應(yīng)的處理。用戶自定義異常用戶自定義的異常類都必須是Exception的子類。一般的聲明方法如下:publicclassMyExceptionNameextendsSuperclassOfMyException{ publicMyExceptionName(){ super("Somestringexplainingtheexception"); }}方法的重載方法的重載方法的重載〔overloading〕是指在一個(gè)類中可以有名字相同的多個(gè)方法,但這些方法的參數(shù)必須不同,或者是參數(shù)個(gè)數(shù)不同,或者是參數(shù)類型不同。返回值可以相同,也可以不同。類的重用類的繼承繼承繼承是一種由已有的類創(chuàng)立新類的機(jī)制,是面向?qū)ο蟪绦蛟O(shè)計(jì)的基石之一。一個(gè)新類可以從現(xiàn)有的類中派生,這個(gè)過程稱為類繼承。派生出的新類稱為已有類的子類,已有類稱為超類〔父類〕。屬性的隱藏子類對(duì)從父類繼承來的屬性變量重新加以定義,那么從父類繼承的屬性將被隱藏。訪問被隱藏的父類域有兩種方法:調(diào)用從父類繼承的方法,那么操作的是從父類繼承的域;使用super.域名屬性隱藏的例子classA1{intx=2;publicvoidsetx(inti){x=i;}voidprinta(){System.out.println(x);}}classB1extendsA1{intx=100;voidprintb(){super.x=super.x+10;System.out.println("super.x="+super.x+"x="+x);}}publicclassExam4_4Test{publicstaticvoidmain(String[]args){A1a1=newA1();a1.setx(4);a1.printa();B1b1=newB1();b1.printb();b1.printa();b1.setx(6);//將繼承來的x值設(shè)置為6b1.printb();b1.printa();a1.printa();}}運(yùn)行結(jié)果:4super.x=12x=10012super.x=16x=100164方法的覆蓋如果子類不需要使用從父類繼承來的方法的功能,那么可以聲明自己的方法。在聲明的時(shí)候,使用相同的方法名及參數(shù)表,但執(zhí)行不同的功能。這種情況稱為方法覆蓋。需要使用方法覆蓋的情況子類中實(shí)現(xiàn)與父類相同的功能,但采用不同的算法或公式。在名字相同的方法中,要做比父類更多的事情。有繼承時(shí)的構(gòu)造方法應(yīng)遵循的原那么子類不能從父類繼承構(gòu)造方法。好的程序設(shè)計(jì)方法是在子類的構(gòu)造方法中調(diào)用某一個(gè)父類構(gòu)造方法。super關(guān)鍵字也可以用于構(gòu)造方法中,其功能為調(diào)用父類的構(gòu)造方法。如果在子類的構(gòu)造方法的聲明中沒有明確調(diào)用父類的構(gòu)造方法,那么系統(tǒng)在執(zhí)行子類的構(gòu)造方法時(shí)會(huì)自動(dòng)調(diào)用父類的默認(rèn)構(gòu)造方法。如果在子類的構(gòu)造方法的聲明中調(diào)用父類的構(gòu)造方法,那么調(diào)用語(yǔ)句必須是子類的構(gòu)造方法的第一條語(yǔ)句。子類將繼承父類所有的屬性和方法嗎?為什么?方法的覆蓋與方法的重載有何不同?完成下面父類及子類的聲明:聲明Student類屬性包括學(xué)號(hào)、姓名、英語(yǔ)成績(jī)、數(shù)學(xué)成績(jī)、計(jì)算機(jī)成績(jī)和總成績(jī)。方法包括構(gòu)造方法、get方法、set方法、toString方法、equals方法、compare方法〔比擬兩個(gè)學(xué)生的總成績(jī),結(jié)果分為大于、小于、等于〕、sum方法〔計(jì)算總成績(jī)〕和testScore方法〔計(jì)算評(píng)測(cè)成績(jī)〕。注:評(píng)測(cè)成績(jī)可以取三門課成績(jī)的平均分,另外任何一門課的成績(jī)的改變都需要對(duì)總成績(jī)進(jìn)行重新計(jì)算,因此,在每一個(gè)set方法中應(yīng)調(diào)用sum方法計(jì)算總成績(jī)。聲明StudentXW〔學(xué)習(xí)委員〕類為Student類的子類。在StudentXW類中增加責(zé)任屬性,并重寫testScore方法〔計(jì)算評(píng)測(cè)成績(jī),評(píng)測(cè)成績(jī)=三門課的平均分+3〕。聲明StudentBZ〔班長(zhǎng)〕類為Student類的子類。在StudentBZ類中增加責(zé)任屬性,并重寫testScore方法〔計(jì)算評(píng)測(cè)成績(jī),評(píng)測(cè)成績(jī)=三門課的平均分+5〕。聲明測(cè)試類,生成假設(shè)干個(gè)Student類、StudentXW類及StudentBZ類對(duì)象,并分別計(jì)算它們的評(píng)測(cè)成績(jī)。Object類Object類Object類是Java程序中所有類的直接或間接父類,也是類庫(kù)中所有類的父類,處在類層次的最高點(diǎn)。相等和同一如果兩個(gè)對(duì)象具有相同的類型及相同的屬性值,那么稱兩個(gè)對(duì)象相等〔equal〕;如果兩個(gè)引用變量指向的是同一個(gè)對(duì)象,那么稱這兩個(gè)變量〔對(duì)象〕同一〔identical〕。Object類中的equals()方法的功能Object類中的equals()方法的功能是比擬接收者對(duì)象與參數(shù)對(duì)象是否是同一個(gè)對(duì)象,而不是判斷兩個(gè)對(duì)象各個(gè)屬性域的值是否相同。終結(jié)類與終結(jié)方法終結(jié)類如果一個(gè)類被final修飾符所修飾和限定,說明這個(gè)類不可能有子類,即final類不能有派生類。被聲明為final的類通常是一些有固定作用、用來完成某種標(biāo)準(zhǔn)功能的類,不能被繼承以到達(dá)修改的目的。在Java程序設(shè)計(jì)中,當(dāng)引用一個(gè)類或其對(duì)象時(shí)實(shí)際真正引用的既可能確是這個(gè)類或其對(duì)象本身,也可能是這個(gè)類的某個(gè)子類及子類對(duì)象,即具有一定的不確定性。將一個(gè)類聲明為final,那么可以將它的內(nèi)容、屬性和功能固定下來,與它的類名形成穩(wěn)定的映射關(guān)系,從而保證引用這個(gè)類時(shí)所實(shí)現(xiàn)功能的正確無誤。final類存在的兩個(gè)理由平安方面:黑客用來攪亂系統(tǒng)的一個(gè)手法是建立一個(gè)類的派生類,然后用他們的類代替原來的類。為了阻止各種顛覆活動(dòng),可以聲明此類為final類,從而不能派生任何子類。設(shè)計(jì)方面:從面向?qū)ο笤O(shè)計(jì)方面,如希望聲明的類為最終類,那么最好或從概念上講該類不應(yīng)該有任何派生類。終結(jié)方法final修飾符所修飾的方法是功能和內(nèi)部語(yǔ)句不能被更改的最終方法,即是不能被當(dāng)前類的子類重載的方法。這樣,就固定了這個(gè)方法所對(duì)應(yīng)的具體操作,可以防止子類對(duì)父類關(guān)鍵方法的錯(cuò)誤重寫,增加了代碼的平安性和正確性。將方法聲明為final的另一個(gè)原因是提高類的運(yùn)行效率。通常,當(dāng)Java運(yùn)行環(huán)境運(yùn)行方法時(shí),它將首先在當(dāng)前類中查找該方法,接下來在其超類中查找,并一直沿類層次向上查找,直到找到該方法為止。這提供了靈活性和開發(fā)工作的容易程度,但代價(jià)是速度更低。如果方法是final的,Java編譯器可以將該方法可執(zhí)行的字節(jié)碼直接放到調(diào)用它的程序中。這樣當(dāng)程序調(diào)用它們時(shí),執(zhí)行速度將更快。抽象類抽象類抽象類不能用new方法進(jìn)行實(shí)例化。當(dāng)一個(gè)類被聲明抽象類時(shí),要在這個(gè)類前加修飾符abstract。抽象類可以包含常規(guī)類能夠包含的任何東西,這包括構(gòu)造方法。抽象類也可以包括抽象方法,這種方法只有方法的聲明,而沒有方法的實(shí)現(xiàn)。抽象類也可以包含非抽象方法,但不能在非抽象類中聲明抽象方法。為什么要聲明抽象類?抽象類是類層次中較高層次的概括,抽象類的作用是讓其他類來繼承它的抽象化特征;在抽象類中可以包括被它的所有子類共享的公共行為;抽象類可以包括被它的所有子類共享的公共屬性;在程序中不能用抽象類作為模板來創(chuàng)立對(duì)象;在用戶生成實(shí)例時(shí)強(qiáng)迫用戶生成更具體的實(shí)例,保證代碼的平安性。抽象方法作為類方法修飾符,abstract聲明了一種僅有方法頭,而沒有具體的方法體和操作實(shí)現(xiàn)的抽象方法,為該類的子類聲明一個(gè)方法的接口標(biāo)準(zhǔn)。抽象方法體的具體實(shí)現(xiàn)是由當(dāng)前類的不同子類在它們各自的類聲明中完成的。抽象方法的優(yōu)點(diǎn)抽象方法可以隱藏具體的細(xì)節(jié)信息,使調(diào)用該方法的程序不必過分關(guān)注該類和它的子類的內(nèi)部狀況。方法頭里實(shí)際包含了調(diào)用該方法的程序語(yǔ)句所需要了解的全部信息。抽象方法強(qiáng)迫子類完成指定的行為,抽象類的所有非抽象子類都必須完成其父類中聲明的抽象方法,抽象類通常聲明抽象方法規(guī)定其子類需要用到的“標(biāo)準(zhǔn)〞行為。編寫一程序計(jì)算二維幾何形體的面積,所涉及的幾何形體至少應(yīng)包括圓、三角形、矩形?!差悓哟谓Y(jié)構(gòu)圖參見圖4-11〕類的組合組合Java的類中可以有其它類的對(duì)象作為成員,這便是類的組合??梢允褂谩癶asa〞語(yǔ)句來描述這種關(guān)系。組合與繼承的比擬“包含〞關(guān)系用組合來表達(dá)如果想利用新類內(nèi)部一個(gè)現(xiàn)有類的特性,而不想使用它的接口,通常應(yīng)選擇組合,我們需在新類里嵌入現(xiàn)有類的private對(duì)象。如果想讓類用戶直接訪問新類的組合成分,需要將成員對(duì)象的屬性變?yōu)閜ublic?!皩儆讪曣P(guān)系用繼承來表達(dá)取得一個(gè)現(xiàn)成的類,并制作它的一個(gè)特殊版本。通常,這意味著我們準(zhǔn)備使用一個(gè)常規(guī)用途的類,并根據(jù)特定需求對(duì)其進(jìn)行定制。組合與繼承舉例classPlate{//聲明盤子 publicPlate(inti){ System.out.println("Plateconstructor"); }}classDinnerPlateextendsPlate{//聲明餐盤為盤子的子類 publicDinnerPlate(inti){ super(i); System.out.println("DinnerPlateconstructor"); }}classUtensil{//聲明器具 Utensil(inti){ System.out.println("Utensilconstructor"); }}classSpoonextendsUtensil{//聲明勺子為器具的子類 publicSpoon(inti){ super(i); System.out.println("Spoonconstructor"); }}classForkextendsUtensil{//聲明餐叉為器具的子類 publicFork(inti){ super(i); System.out.println("Forkconstructor"); }}classKnifeextendsUtensil{//聲明餐刀為器具的子類 publicKnife(inti){ super(i); System.out.println("Knifeconstructor"); }}classCustom{//聲明做某事的習(xí)慣 publicCustom(inti){System.out.println("Customconstructor");}}publicclassPlaceSettingextendsCustom{//聲明餐桌的布置 Spoonsp;Forkfrk;Knifekn; DinnerPlatepl; publicPlaceSetting(inti){ super(i+1); sp=newSpoon(i+2); frk=newFork(i+3); kn=newKnife(i+4); pl=newDinnerPlate(i+5); System.out.println("PlaceSettingconstructor"); } publicstaticvoidmain(String[]args){ PlaceSettingx=newPlaceSetting(9); }}包的應(yīng)用包為了解決類名沖突,Java利用包來組織相關(guān)的類,并控制訪問權(quán)限。包是一種松散的類的集合。但是由于同一包中的類在默認(rèn)情況下可以互相訪問,所以為了方便編程和管理,通常把需要在一起工作的類放在一個(gè)包里。利用包來管理類,可實(shí)現(xiàn)類的共享與復(fù)用。語(yǔ)言包語(yǔ)言包java.lang提供了Java語(yǔ)言最根底的類,包括Object類、數(shù)據(jù)類型包裹類、字符串類〔String、StringBuffer〕、數(shù)學(xué)類〔Math〕、系統(tǒng)和運(yùn)行時(shí)類〔System、Runtime〕、類操作類〔Class、ClassLoader〕等實(shí)用包實(shí)用包java.util提供了實(shí)現(xiàn)各種不同實(shí)用功能的類,包括日期類、集合類等。文本包文本包java.text中的Format、DateFormat、SimpleDateFormat等類提供各種文本或日期格式。接口與多態(tài)接口接口接口與抽象類一樣都是定義多個(gè)類的共同屬性。接口使抽象的概念更深入了一層,是一個(gè)“純〞抽象類,它只提供一種形式,并不提供實(shí)現(xiàn)。允許創(chuàng)立者規(guī)定方法的根本形式:方法名、參數(shù)列表以及返回類型,但不規(guī)定方法主體。接口也可以包含根本數(shù)據(jù)類型的數(shù)據(jù)成員,但它們都默認(rèn)為static和final。接口的作用接口是面向?qū)ο蟮囊粋€(gè)重要機(jī)制。它的引進(jìn)是為了實(shí)現(xiàn)多繼承,同時(shí)免除C++中的多繼承那樣的復(fù)雜性。在使用中,接口類的變量可以用來代表任何實(shí)現(xiàn)了該接口的類的對(duì)象,這就相當(dāng)于把類根據(jù)其實(shí)現(xiàn)的功能來分別代表,而不必顧慮它所在的類繼承層次。這樣可以最大限度地利用動(dòng)態(tài)綁定,隱藏實(shí)現(xiàn)細(xì)節(jié)。接口還可以實(shí)現(xiàn)不同類之間的常量共享。聲明接口類型的變量,并用它來訪問對(duì)象舉例interfaceShape2D{doublepi=3.14;doublearea();}classCircleimplementsShape2D{doubleradius;publicCircle(doubler){radius=r;}publicdoublearea(){return(pi*radius*radius);}}classRectangleimplementsShape2D{intwidth,height;publicRectangle(intw,inth){width=w;height=h;}publicdoublearea(){return(width*height);}}publicclassVariableTester{ publicstaticvoidmain(String[]args) { Shape2Dvar1,var2; var1=newRectangle(5,6); System.out.println("Areaofvar1="+var1.area()); var2=newCircle(2.0); System.out.println("Areaofvar2="+var2.area()); }}輸出結(jié)果Areaofvar1=30.0Areaofvar2=12.56多重繼承Java不允許一個(gè)類有多個(gè)父類,但允許一個(gè)類實(shí)現(xiàn)多個(gè)接口,通過這種機(jī)制可以實(shí)現(xiàn)多重繼承。多重繼承舉例interfaceShape2D{//聲明Shape2D接口finaldoublepi=3.14;//數(shù)據(jù)成員一定要初始化publicabstractdoublearea();//抽象方法}interfaceColor{voidsetColor(Stringstr);//抽象方法}classCircleimplementsShape2D,Color//實(shí)現(xiàn)Circle類{doubleradius;Stringcolor;publicCircle(doubler)//構(gòu)造方法{radius=r;}publicdoublearea()//定義area()的處理方式{return(pi*radius*radius);}publicvoidsetColor(Stringstr)//定義setColor()的處理方式{color=str;System.out.println("color="+color);}}publicclassMultiInterfaceTester{publicstaticvoidmain(Stringargs[]){Circlecir;cir=newCircle(2.0);cir.setColor("blue");System.out.println("Area="+cir.area());}}輸出結(jié)果color=blueArea=12.56接口的擴(kuò)展接口可以通過擴(kuò)展〔extends〕技術(shù)派生出新的接口,原來的接口稱為根本接口〔baseinterface〕或父接口〔superinterface〕,派生出的接口稱為派生接口〔derivedinterface〕或子接口〔subinterface〕。派生接口不僅可以保有父接口的成員,同時(shí)也可以參加新的成員以滿足實(shí)際問題的需要。接口擴(kuò)展舉例interfaceShape{doublepi=3.14;voidsetColor(Stringstr);}//聲明Shape2D接口擴(kuò)展了Shape接口interfaceShape2DextendsShape{doublearea();}classCircleimplementsShape2D{doubleradius;Stringcolor;publicCircle(doubler){radius=r;}publicdoublearea(){return(pi*radius*radius);}publicvoidsetColor(Stringstr){color=str;System.out.println("color="+color);}}publicclassExtendsInterfaceTester{//測(cè)試類publicstaticvoidmain(String[]args){Circlecir;cir=newCircle(2.0);cir.setColor("blue");System.out.println("Area="+cir.area());}}運(yùn)行結(jié)果color=blueArea=12.56塑型對(duì)象的塑型類型轉(zhuǎn)換也稱為塑型。對(duì)象只能被塑型為:任何一個(gè)父類類型。任何一個(gè)子類的引用變量〔或?qū)ο蟆扯伎梢员划?dāng)成父類引用變量〔或?qū)ο蟆硜韺?duì)待;但反過來卻不成立。對(duì)象所屬的類實(shí)現(xiàn)的一個(gè)接口。雖然不能用接口生成對(duì)象,但可以聲明接口的引用變量,接口的引用變量可以指向任何實(shí)現(xiàn)了此接口的類對(duì)象?;蛘呋氐剿约核诘念悺R粋€(gè)對(duì)象被塑型為父類或接口后,還可以再被塑型回到它自己所在的類。在什么情況下,可以對(duì)父類對(duì)象的引用進(jìn)行強(qiáng)制類型轉(zhuǎn)換,使其轉(zhuǎn)化成子類對(duì)象的引用?塑型的應(yīng)用場(chǎng)合塑型主要應(yīng)用于:賦值轉(zhuǎn)換賦值號(hào)右邊的表達(dá)式類型或?qū)ο筠D(zhuǎn)換為左邊的類型方法調(diào)用轉(zhuǎn)換實(shí)參的類型轉(zhuǎn)換為形參的類型算術(shù)表達(dá)式轉(zhuǎn)換算術(shù)混合運(yùn)算時(shí),不同類型的項(xiàng)轉(zhuǎn)換為相同的類型再進(jìn)行運(yùn)算字符串轉(zhuǎn)換字符串連接運(yùn)算時(shí),如果一個(gè)操作數(shù)為字符串,一個(gè)操作數(shù)為數(shù)值型,那么會(huì)自動(dòng)將數(shù)值型轉(zhuǎn)換為字符串實(shí)例方法查找舉例類層次如下列圖:Manager
man=newManager();Employee
emp1=newEmployee();Employee
emp2=(Employee)man;emp1putePay();//調(diào)用Employee類中的computePay()方法manputePay();
//調(diào)用Manager類中的computePay()方法emp2putePay();//調(diào)用Manager類中的computePay()方法多態(tài)的概念多態(tài)多態(tài)性是指不同的類型的對(duì)象可以響應(yīng)相同的消息。動(dòng)態(tài)綁定舉例classShape{voiddraw(){}voiderase(){}}classCircleextendsShape{ voiddraw(){System.out.println("Circle.draw()");} voiderase(){System.out.println("Circle.erase()");}}classSquareextendsShape{ voiddraw(){System.out.println("Square.draw()");} voiderase(){System.out.println("Square.erase()");}}classTriangleextendsShape{ voiddraw(){System.out.println("Triangle.draw()");}voiderase(){System.out.println("Triangle.erase()");}}publicclassBindingTester{publicstaticvoidmain(String[]args){Shape[]s=newShape[9];intn;for(inti=0;i<s.length;i++){n=(int)(Math.random()*3);switch(n){case0:s[i]=newCircle();break;case1:s[i]=newSquare();break;case2:s[i]=newTriangle();}}for(inti=0;i<s.length;i++)s[i].draw();}}將上例中,如果將Shape改為如下的抽象類,能否得到正確的結(jié)果?abstractclassShape{ abstractvoiddraw(); abstractvoiderase();}多態(tài)的應(yīng)用構(gòu)造方法與多態(tài)構(gòu)造方法的調(diào)用順序舉例classMeal{//飯類Meal(){System.out.println("Meal()");}}classBread{//面包類Bread(){System.out.println("Bread()");}}classCheese{//奶酪類Cheese(){System.out.println("Cheese()");}}classLettuce{//萵苣類Lettuce(){System.out.println("Lettuce()");}}classLunchextendsMeal{//午餐類繼承自飯類Lunch(){System.out.println("Lunch()");}}classPortableLunchextendsLunch{PortableLunch(){System.out.println("PortableLunch()");}}publicclassSandwichextendsPortableLunch{Breadb=newBread();Cheesec=newCheese();Lettucel=newLettuce();Sandwich(){System.out.println("Sandwich()");}publicstaticvoidmain(String[]args){newSandwich();}}輸出結(jié)果:Meal()Lunch()PortableLunch()Bread()Cheese()Lettuce()Sandwich()構(gòu)造方法中的多態(tài)方法舉例abstractclassGlyph{abstractvoiddraw();Glyph(){System.out.println("Glyph()beforedraw()");draw();System.out.println("Glyph()afterdraw()");}}classRoundGlyphextendsGlyph{intradius=1;RoundGlyph(intr){radius=r;System.out.println("RoundGlyph.RoundGlyph(),radius="+radius);}voiddraw(){System.out.println("RoundGlyph.draw(),radius="+radius);}}publicclassPolyConstructors{publicstaticvoidmain(String[]args){newRoundGlyph(5);}}運(yùn)行結(jié)果Glyph()beforedraw()RoundGlyph.draw(),radius=0Glyph()afterdraw()RoundGlyph.RoundGlyph(),radius=5定義構(gòu)造方法時(shí)應(yīng)遵循的原那么用盡可能少的動(dòng)作把對(duì)象的狀態(tài)設(shè)置好。如果可以防止,不要調(diào)用任何方法。在構(gòu)造方法內(nèi)唯一能夠平安調(diào)用的是在基類中具有final屬性的那些方法〔也適用于private方法,它們自動(dòng)具有final屬性〕。這些方法不能被覆蓋,所以不會(huì)出現(xiàn)上述潛在的問題。內(nèi)部類內(nèi)部類將一個(gè)類聲明置入另一個(gè)類聲明中,稱這種類為“內(nèi)部類〞。在內(nèi)部類中可以訪問它的外部類的所有數(shù)據(jù)成員和方法。聲明內(nèi)部類的兩種方法命名的內(nèi)部類:可在類的內(nèi)部屢次使用匿名內(nèi)部類:可在new關(guān)鍵字后聲明內(nèi)部類,并立即創(chuàng)立一個(gè)對(duì)象輸入輸出流概論I/O流的概念Java將信息的輸入與輸出過程抽象為輸入輸出流。輸入是指數(shù)據(jù)流入程序,輸出是指數(shù)據(jù)從程序流出。Java中的輸入輸出操作通常都是通過輸入輸出流實(shí)現(xiàn)的。一個(gè)流就是一個(gè)從源流向目的地的數(shù)據(jù)序列。輸入輸出流可以與各種數(shù)據(jù)源和目標(biāo)相連。輸入輸出流的分類從流的方向劃分:輸入流或輸出流從流的分工劃分:節(jié)點(diǎn)流或處理流從流的內(nèi)容劃分:面向字符的流或面向字節(jié)的流面向字符的流——Reader和Writer類針對(duì)字符數(shù)據(jù)的特點(diǎn)進(jìn)行過優(yōu)化,提供一些面向字符的有用特性,源或目標(biāo)通常是文本文件。字節(jié)流——InputStream和OutputStream類是用來處理8位字節(jié)流的抽象基類,程序使用這兩個(gè)類的子類來讀寫8位的字節(jié)信息。文件讀寫寫文本文件的例子在C盤根目錄下創(chuàng)立文本文件Hello.txt,并寫入假設(shè)干行文本。importjava.io.*;classEx6_2{publicstaticvoidmain(String[]args)throwsIOException{//main方法中聲明拋出IO異常StringfileName="C:\\Hello.txt";FileWriterwriter=newFileWriter(fileName);writer.write("Hello!\n");writer.write("Thisismyfirsttextfile,\n");writer.write("Youcanseehowthisisdone.\n");writer.write("輸入一行中文也可以\n");writer.close();}}讀文本文件的例子從C盤根目錄的文本文件Hello.txt中讀取文本并顯示在屏幕上。importjava.io.*;classEx6_5{publicstaticvoidmain(String[]args){StringfileName="C:/Hello.txt",line;try{BufferedReaderin=newBufferedReader(newFileReader(fileName));line=in.readLine();//讀取一行內(nèi)容while(line!=null){ System.out.println(line); line=in.readLine(); }in.close();}catch(IOExceptioniox){System.out.println("Problemreading"+fileName);}}}寫二進(jìn)制文件的例子將三個(gè)int型整數(shù)255,0,-1寫入數(shù)據(jù)文件data1.dat。importjava.io.*;classEx6_7{publicstaticvoidmain(String[]args){StringfileName="c:/data1.dat";intvalue0=255,value1=0,value2=-1;try{DataOutputStreamout=newDataOutputStream(newFileOutputStream(fileName));out.writeInt(value0);out.writeInt(value1);out.writeInt(value2);out.close();}catch(IOExceptioniox){ System.out.println("Problemwriting"+fileName);}}}讀二進(jìn)制文件的例子讀取C盤根目錄data1.dat中的三個(gè)int型數(shù)字,顯示相加結(jié)果。importjava.io.*;classEx6_10{ publicstaticvoidmain(String[]args){ StringfileName="c:\\data1.dat"; intsum=0;try{DataInputStreaminstr=newDataInputStream(newBufferedInputStream(newFileInputStream(fileName)));sum+=instr.readInt();sum+=instr.readInt();sum+=instr.readInt();System.out.println("Thesumis:"+sum);instr.close();} catch(IOExceptioniox){ System.out.println("Problemreading"+fileName);} }}}File類使用舉例在C盤創(chuàng)立文件Hello.txt,如果存在那么刪除舊文件,不存在那么直接創(chuàng)立新文件。importjava.io.*;publicclassEx6_13{ publicstaticvoidmain(String[]args){ Filef=newFile("c:"+File.separator+"Hello.txt"); if(f.exists())f.delete(); else try{ f.createNewFile(); } catch(Exceptione){ System.out.println(e.getMessage()); } }}對(duì)象序列化概念對(duì)象序列化舉例創(chuàng)立一個(gè)書籍對(duì)象,并把它輸出到一個(gè)文件book.dat中,然后再把該對(duì)象讀出,在屏幕上顯示對(duì)象信息。importjava.io.*;publicclassEx6_17{ publicstaticvoidmain(Stringargs[])throwsIOException,ClassNotFoundException{ Bookbook=newBook(100032,"JavaProgrammingSkills","WangSir",30); ObjectOutputStreamoos=newObjectOutputStream(newFileOutputStream("c:/book.dat"));oos.writeObject(book); oos.close(); book=null; ObjectInputStreamois=newObjectInputStream( newFileInputStream("c:/book.dat"));book=(Book)ois.readObject(); ois.close(); System.out.println("IDis:"+book.id); System.out.println("nameis:"+); System.out.println("authoris:"+book.author); System.out.println("priceis:"+book.price); }}classBookimplementsSerializable{ intid; Stringname; Stringauthor; floatprice; publicBook(intid,Stringname,Stringauthor,floatprice){ this.id=id; =name; this.author=author; this.price=price; }}運(yùn)行結(jié)果將生成book.dat文件,并在屏幕顯示:IDis:100032nameis:JavaProgrammingSkillsauthoris:WangSirpriceis:30.0FillWriter類和BufferWriter類比擬File類DataOutputStream類的方法對(duì)象群體的組織對(duì)象數(shù)組對(duì)象數(shù)組的初始化對(duì)象數(shù)組的初始化分為靜態(tài)初始化和動(dòng)態(tài)初始化兩種。靜態(tài)初始化:在聲明和定義數(shù)組的同時(shí)對(duì)數(shù)組元素進(jìn)行初始化,例如:BankAccount[]accounts={newBankAccount(“Zhang",100.00), newBankAccount(“Li",2380.00),newBankAccount(“Wang",500.00), newBankAccount(“Liu",175.56),newBankAccount(“Ma",924.02)};動(dòng)態(tài)初始化:使用運(yùn)算符new,需要經(jīng)過兩步:首先給數(shù)組分配空間typearrayName[]=newtype[arraySize];然后給每一個(gè)數(shù)組元素分配空間arrayName[0]=newtype(paramList); … arrayName[arraySize-1]=newtype(paramList);二維數(shù)組集合數(shù)組的優(yōu)缺點(diǎn)數(shù)組是Java提供的隨機(jī)訪問對(duì)象序列的最有效方法,數(shù)組是一個(gè)簡(jiǎn)單的線性序列,訪問元素的速度較快,但是其缺點(diǎn)是數(shù)組大小自創(chuàng)立以后就固定了,在數(shù)組對(duì)象的整個(gè)生存期內(nèi)其大小不可改變。而且,數(shù)組元素只能是同一類型。Java集合框架Java集合框架提供了一些現(xiàn)成的數(shù)據(jù)結(jié)構(gòu)可供使用,程序員可以利用集合框架快速編寫代碼,并獲得優(yōu)良特性。集合框架是為表示和操作集合而規(guī)定的一種統(tǒng)一的標(biāo)準(zhǔn)的體系結(jié)構(gòu),包括三大塊內(nèi)容,即對(duì)外的接口、接口的實(shí)現(xiàn)和對(duì)集合運(yùn)算的算法。接口是表示集合的抽象數(shù)據(jù)類型,使集合的操作和表示分開。實(shí)現(xiàn)是指實(shí)現(xiàn)集合接口的Java類,是可重用的數(shù)據(jù)結(jié)構(gòu)。算法是指執(zhí)行運(yùn)算的方法。接口Java集合框架接口的根本結(jié)構(gòu)如下列圖:Collection接口中聲明了很多抽象方法,這些方法可分為查詢方法及修改方法。Set接口是一個(gè)不含重復(fù)元素的集合,是數(shù)學(xué)中“集合〞的抽象。實(shí)現(xiàn)接口List的類中的元素是有順序的、可以包含重復(fù)元素、且每個(gè)元素都有一個(gè)index值〔從0開始〕標(biāo)明元素在列表中的位置。Map是一個(gè)從關(guān)鍵字到值的映射對(duì)象,Map中不能有重復(fù)的關(guān)鍵字,每個(gè)關(guān)鍵字最多能夠映射到一個(gè)值。SortedSet是一種特殊的Set,其中的元素是升序排列的,并且還增加了與次序相關(guān)的操作,通常用于存放詞匯表這樣的內(nèi)容。SortedMap是一種特殊的Map,其中的關(guān)鍵字是升序排列的,通常用于詞典和目錄等。Collection接口LinkedList、Vector、Stack、ArrayList、HashSet、TreeSet中哪些類中的元素不重復(fù),哪些類中的元素重復(fù)?Vector和ArrayList類Vector/ArrayList是實(shí)現(xiàn)了Collection接口的具體類,其功能如下:能夠存儲(chǔ)任意對(duì)象,但通常情況下,這些不同類型的對(duì)象都具有相同的父類或接口不能存儲(chǔ)根本類型〔primitive〕的數(shù)據(jù),除非將這些數(shù)據(jù)包裹在包裹類中其容量能夠根據(jù)空間需要自動(dòng)擴(kuò)充增加元素方法的效率較高,除非空間已滿,在這種情況下,在增加之前需要先擴(kuò)充容量Vector方法是同步的,線程平安ArrayList方法是非同步的,效率較高Enumeration類使用舉例importjava.util.Vector;importjava.util.Enumeration;publicclassEnumerationTester{publicstaticvoidmain(Stringargs[]){Enumerationdays;VectordayNames=newVector();dayNames.add("Sunday");dayNames.add("Monday");dayNames.add("Tuesday");dayNames.add("Wednesday");dayNames.add("Thursday");dayNames.add("Friday");dayNames.add("Saturday");days=dayNames.elements();while(days.hasMoreElements())System.out.println(days.nextElement());}}Iterator類使用舉例importjava.util.Vector;importjava.util.Iterator;publicclassIteratorTester{publicstaticvoidmain(Stringargs[]){String[]num={"one","two","three","four","five","six","seven","eight","nine","ten"};VectoraVector=newVector(java.util.Arrays.asList(num));System.out.println("BeforeVector:"+aVector);Iteratornums=aVector.iterator();while(nums.hasNext()){StringaString=(String)nums.next();System.out.println(aString);if(aString.length()>4)nums.remove();}System.out.println("AfterVector:"+aVector);}}哈希表哈希表〔HashTable、HashMap〕也稱為散列表,是用來存儲(chǔ)群體對(duì)象的集合類結(jié)構(gòu)。哈希表中,對(duì)象的存儲(chǔ)位置和對(duì)象的關(guān)鍵屬性k之間有一個(gè)特定的對(duì)應(yīng)關(guān)系f,我們稱之為哈希(Hash)函數(shù)。它使每個(gè)對(duì)象與一個(gè)唯一的存儲(chǔ)位置相對(duì)應(yīng)。因而在查找時(shí),只要根據(jù)待查對(duì)象的關(guān)鍵屬性k,計(jì)算f(k)的值即可知其存儲(chǔ)位置與哈希表相關(guān)的一些主要概念容量〔capacity〕——哈希表的容量不是固定的,隨對(duì)象的參加,其容量可以自動(dòng)擴(kuò)充關(guān)鍵字/鍵〔key〕——每個(gè)存儲(chǔ)的對(duì)象都需要有一個(gè)關(guān)鍵字key,key可以是對(duì)象本身,也可以是對(duì)象的一局部〔如對(duì)象的某一個(gè)屬性〕哈希碼〔hashcode〕——要將對(duì)象存儲(chǔ)到HashTable,就需要將其關(guān)鍵字key映射到一個(gè)整型數(shù)據(jù),稱為key的哈希碼〔hashcode〕哈希函數(shù)〔hashfunction〕——返回對(duì)象的哈希碼項(xiàng)〔item〕——哈希表中的每一項(xiàng)都有兩個(gè)域:關(guān)鍵字域key及值域value〔即存儲(chǔ)的對(duì)象〕。key及value都可以是任意的Object類型的對(duì)象,但不能為空(null),HashTable中的所有關(guān)鍵字都是唯一的裝填因子〔loadfactor〕——(表中填入的項(xiàng)數(shù))/(表的容量)HashTable應(yīng)用舉例有一個(gè)音像店出租電影片業(yè)務(wù),需要編寫一個(gè)應(yīng)用程序進(jìn)行管理,在進(jìn)行出租時(shí)能夠很快找到顧客需要的電影片?!泊a略〕聲明一個(gè)矩陣類Matrix,其成員變量是一個(gè)二維數(shù)組,數(shù)組元素類型為int,設(shè)計(jì)下面的方法,并聲明測(cè)試類對(duì)這些方法進(jìn)行測(cè)試。構(gòu)造方法。Matrix() //構(gòu)造一個(gè)10×10個(gè)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度個(gè)人教育培訓(xùn)機(jī)構(gòu)課程研發(fā)合同2篇
- 2025企業(yè)廠房融資租賃合同
- 2025年度個(gè)人留置車輛借款合同(車輛留置權(quán)保險(xiǎn)配套)2篇
- 2025年度出租車安全責(zé)任保險(xiǎn)服務(wù)合同4篇
- 個(gè)人抵押貸款協(xié)議模板(2024年修訂版)版
- 二零二五年度土地開發(fā)承包借款合同標(biāo)準(zhǔn)格式3篇
- 二零二五年度承臺(tái)施工安全應(yīng)急救援預(yù)案合同4篇
- 二零二五年度車輛收費(fèi)員突發(fā)事件應(yīng)對(duì)與應(yīng)急預(yù)案協(xié)議材料4篇
- 二零二五年度陶瓷文化體驗(yàn)館代理合作協(xié)議3篇
- 二零二五年度拍賣企業(yè)信息安全保密合同
- 鏈家、貝殼專業(yè)租房協(xié)議、房屋租賃合同、房屋出租協(xié)議
- 2024年電力算力協(xié)同:需求、理念與關(guān)鍵技術(shù)報(bào)告-南網(wǎng)數(shù)研院(蔡田田)
- 云南省西雙版納傣族自治州(2024年-2025年小學(xué)六年級(jí)語(yǔ)文)統(tǒng)編版小升初模擬(上學(xué)期)試卷及答案
- 2024年新高考I卷數(shù)學(xué)高考試卷(原卷+答案)
- 遼寧中考英語(yǔ)2022-2024真題匯編-教師版-專題06 語(yǔ)篇填空
- 篝火晚會(huì)流程
- 老年髖部骨折患者圍術(shù)期下肢深靜脈血栓基礎(chǔ)預(yù)防專家共識(shí)(2024版)解讀 課件
- 江蘇省無錫市2024年中考語(yǔ)文試卷【附答案】
- 五年級(jí)上冊(cè)小數(shù)脫式計(jì)算200道及答案
- 2024-2030年中國(guó)護(hù)肝解酒市場(chǎng)營(yíng)銷策略分析與未來銷售渠道調(diào)研研究報(bào)告
- 人教版高中數(shù)學(xué)必修二《第十章 概率》單元同步練習(xí)及答案
評(píng)論
0/150
提交評(píng)論