第6章 內(nèi)部類與異常類_第1頁
第6章 內(nèi)部類與異常類_第2頁
第6章 內(nèi)部類與異常類_第3頁
第6章 內(nèi)部類與異常類_第4頁
第6章 內(nèi)部類與異常類_第5頁
已閱讀5頁,還剩31頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第六章內(nèi)部類與異常類6.1內(nèi)部類6.2匿名類6.3異常類6.4斷言6.5Class類6.1內(nèi)部類

Java支持在一個(gè)類中定義另一個(gè)類,這樣的類稱作內(nèi)部類,而包含內(nèi)部類的類成為內(nèi)部類的外嵌類。

內(nèi)部類的類體中不可以聲明類變量和類方法。外嵌類的類體中可以用內(nèi)部類聲明對(duì)象,作為外嵌類的成員。例子1classChina{finalStringsong="義勇軍進(jìn)行曲";privateBeijingbeijing;China(){beijing=newBeijing();}publicBeijinggetBeijing(){returnbeijing;}StringgetSong(){returnsong;}

classBeijing//內(nèi)部類的聲明{Stringname="北京";voidspeak(){System.out.println("我們是"+name+"我們的國(guó)歌是:"+getSong());}}}publicclassExample6_1{publicstaticvoidmain(Stringargs[]){Chinachina=newChina();china.getBeijing().speak();}}

6.2匿名類

6.2.1和類有關(guān)的匿名類

當(dāng)使用類創(chuàng)建對(duì)象時(shí),程序允許我們把類體與對(duì)象的創(chuàng)建組合在一起,也就是說,類創(chuàng)建對(duì)象時(shí),除了構(gòu)造方法還有類體,此類體被認(rèn)為是該類的一個(gè)子類去掉類聲明后的類體,稱作匿名類。例如:

newPeople(){People類的子類的類體

}例子2abstractclassSpeak{publicabstractvoidspeakHello();}classStudent{voidf(Speaksp){sp.speakHello();}}publicclassExample6_2{publicstaticvoidmain(Stringargs[]){Studentst=newStudent();st.f(newSpeak(){publicvoidspeakHello(){System.out.println("Iamastudent,howareyou");}});

Speakspeak=newSpeak(){publicvoidspeakHello(){System.out.println("大家好,祝工作順利!");}};speak.speakHello();//上轉(zhuǎn)型對(duì)象speak調(diào)用匿名類重寫的speakHello方法

}}6.2.2和接口有關(guān)的匿名類

Java允許直接用接口名和一個(gè)類體創(chuàng)建一個(gè)匿名對(duì)象,此類體被認(rèn)為是實(shí)現(xiàn)了接口的類去掉類聲明后的類體,稱作匿名類。例如:

newComputable(){

使用了Computeable接口的類的類體

}例子3interfaceCubic{doublegetCubic(doublex);}classA{voidf(Cubiccubic){doubleresult=cubic.getCubic(3);//執(zhí)行匿名類體中實(shí)現(xiàn)的getCubic方法

System.out.println(result);}}publicclassExample6_3{publicstaticvoidmain(Stringargs[]){Aa=newA();a.f(newCubic()//使用匿名類創(chuàng)建對(duì)象,將該對(duì)象傳遞給方法f的參數(shù)cubic{publicdoublegetCubic(doublex){returnx*x*x;}});Cubiccu=newCubic()//使用匿名類創(chuàng)建對(duì)象,接口cu存放該對(duì)象的引用

{publicdoublegetCubic(doublex)//匿名類是實(shí)現(xiàn)Cubic接口的類

{returnx*x*x;//所以必須要實(shí)現(xiàn)getCubic方法

}};doublem=cu.getCubic(5);//接口回調(diào)

System.out.println(m);}}6.3異常類

所謂異常就是運(yùn)行時(shí)可能出現(xiàn)一些錯(cuò)誤,程序運(yùn)行出現(xiàn)異常時(shí),Java運(yùn)行環(huán)境就用異常類Exception的相應(yīng)子類創(chuàng)建一個(gè)異常對(duì)象,并等待處理,例如,讀取一個(gè)不存在的文件時(shí),運(yùn)行環(huán)境就用異常類IOException創(chuàng)建一個(gè)對(duì)象,異常對(duì)象可以調(diào)用如下方法得到或輸出有關(guān)異常的信息:publicStringgetMessage()publicvoidprintStackTrace()publicStringtoString()Java的異常類是處理運(yùn)行時(shí)錯(cuò)誤的特殊類,每一種異常類對(duì)應(yīng)一種特定的運(yùn)行錯(cuò)誤。Java中的每個(gè)異常都是Throwable類及其子類的實(shí)例對(duì)象,異常類的層次結(jié)構(gòu)圖如圖6-1所示。

Throwable類分為java.lang.Exception類和java.lang.Error類,即錯(cuò)誤和異常子類。

Error是指與虛擬機(jī)或動(dòng)態(tài)裝載等相關(guān)的問題,異常則是指一些可以被捕獲且可以被恢復(fù)的錯(cuò)誤。圖6-1異常處理的類層次ObjectThrowableError…Exception…RuntimeExeption…

其中Error類由系統(tǒng)保留,而Exception類則供應(yīng)用程序使用。

Exception類又分為兩種:運(yùn)行時(shí)異常和非運(yùn)行時(shí)異常。

運(yùn)行時(shí)異常(RuntimeException)是在Java運(yùn)行系統(tǒng)執(zhí)行過程中出現(xiàn)的異常。

非運(yùn)行時(shí)異常(Non-RuntimeException)是由編譯器檢測(cè)到的,在程序運(yùn)行過程中可能發(fā)生而要求必須處理的異常。系統(tǒng)定義的運(yùn)行異常異常對(duì)應(yīng)的系統(tǒng)運(yùn)行錯(cuò)誤ClassNotFoundException未找到欲裝載使用的類FileNotFoundException未找到指定的文件或目錄IOException輸入、輸出錯(cuò)誤InterruptedException線程在睡眠、等待或因其他原因暫停時(shí)被其他線程打斷UnknownHostException無法確定主機(jī)的IP地址SecurityException安全性錯(cuò)誤,如Applet欲讀寫文件MalformedURLExceptionURL格式錯(cuò)誤下表中列出了若干常見的系統(tǒng)定義異常6.3.1try~catch~finally語句

使用try~catch~finally語句來處理異常,將可能出現(xiàn)的異常操作放在try~catch~finally語句的try部分,當(dāng)try部分中的某個(gè)語句發(fā)生異常后,try部分將立刻結(jié)束執(zhí)行,而轉(zhuǎn)向執(zhí)行相應(yīng)的catch部分;所以程序可以將發(fā)生異常后的處理放在catch部分;finally部分表示try或catch執(zhí)行完后,均需要執(zhí)行的部分try~catch,表示為try~catch提供一個(gè)統(tǒng)一的“出口”。try~catch~finally語句可以出現(xiàn)多個(gè)catch,分別處理發(fā)生的相應(yīng)異常。try{Java語句塊}catch(異常錯(cuò)誤類對(duì)象名){

異常處理語句塊}finally{Java語句塊}例:classExce{ publicstaticvoidmain(Stringargs[]) { inta,b,c,d; a=b=c=10; try{ d=a/(b-c); System.out.println("d="+d); }catch(ArithmeticExceptione){ System.out.println("除數(shù)不能為0");}finally{ d=1;System.out.println("d="+d);}}}例子4(效果如圖所示)publicclassExample6_4{publicstaticvoidmain(Stringargs[]){intn=0,m=0,t=555;try{m=Integer.parseInt("8888");n=Integer.parseInt("abc789");t=9999;}catch(NumberFormatExceptione){System.out.println("發(fā)生異常:"+e.getMessage());e.printStackTrace();n=123;}System.out.println("n="+n+",m="+m+",t="+t);}}6.3.2自定義異常類在程序中也可以定義Exception類的子類作為自定義異常類,然后規(guī)定哪些方法產(chǎn)生這樣的異常。這時(shí)就要用到throws和throw兩個(gè)關(guān)鍵字。

throws包含在方法的聲明中,其格式如下:返回類型方法名(參數(shù))throws異常類名{

語句體}

其中,異常類名可以是多個(gè),但需要用逗號(hào)隔開。此時(shí),方法并不需要處理它所生成的異常,而是向上傳遞,由調(diào)用它的方法來處理這些異常。

異常的主動(dòng)拋出由throw關(guān)鍵字完成。throw語句的格式為:

throwThrowableobject;

其中ThrowableObject必須為Throwable類或其子類的對(duì)象。例如:thrownewArithmeticExcption()例子5classIntegerExceptionextendsException{Stringmessage;IntegerException(intm){message="年齡"+m+"不合理";}publicStringtoString(){returnmessage;}}classPeople{privateintage=1;publicvoidsetAge(intage)throwsIntegerException{if(age>=160||age<=0)thrownewIntegerException(age);elsethis.age=age;}publicintgetAge(){System.out.println("年齡"+age+"合理");returnage;}}publicclassExample6_5{publicstaticvoidmain(Stringargs[]){Peoplewang=newPeople(),zhang=newPeople();try{wang.setAge(189);System.out.println(wang.getAge());}catch(IntegerExceptione){System.out.println(e.toString());}try{zhang.setAge(28);System.out.println(zhang.getAge());}catch(IntegerExceptione){System.out.println(e.toString());}}}

在使用異常的過程中,要遵循以下的四點(diǎn)原則:(1)不要過多地使用異常,更不要在循環(huán)體內(nèi)使用異常。(2)在捕獲或聲明異常時(shí),要選取合適類型的異常類。(3)一旦捕獲了一個(gè)異常,就應(yīng)對(duì)其做出相應(yīng)的處理,而不應(yīng)放任不管。(4)對(duì)于自定義的異常類,通常把它作為類Exception的子類,而不作為類Error的子類。并且在多數(shù)情況下,不要把自定義的異常類作為運(yùn)行時(shí)異常類RuntimeException的子類。另外,自定義異常類的類名常常以Exception結(jié)尾。6.4斷言

斷言語句在調(diào)試代碼階段非常有用,斷言語句一般用于程序不準(zhǔn)備通過捕獲異常來處理的錯(cuò)誤。例如,當(dāng)發(fā)生某個(gè)錯(cuò)誤時(shí),要求程序必須立即停止執(zhí)行。使用關(guān)鍵字assert聲明一條斷言語句,斷言語句有一下兩種格式:

assertbooleanExpression;assertbooleanExpression:messageException;

其中booleanExpression必須是求值為boolean型的表達(dá)式;messageException可以是值為字符串的表達(dá)式。例子6importjava.util.Scanner;publicclassExample6_6{publicstaticvoidmain(Stringargs[]){System.out.println("請(qǐng)正數(shù)回車確認(rèn)");Scannerscan=newScanner(System.in);doublenumber=scan.nextDouble();assertnumber>0:"負(fù)數(shù)不能計(jì)算平方根";System.out.println(number+"的平方根:"+Math.sqrt(number));}}6.5Class類6.5.1獲取類的有關(guān)信息

Class是java.lang包中的類,該類的實(shí)例用來封裝對(duì)象運(yùn)行時(shí)的狀態(tài)。當(dāng)一個(gè)類被加載且創(chuàng)建對(duì)象時(shí),和該類相關(guān)的一個(gè)類型為Calss的對(duì)象就會(huì)自動(dòng)創(chuàng)建。

Class類本身不提供構(gòu)造方法,因此,不能使用new運(yùn)算符和構(gòu)造方法顯示地創(chuàng)建一個(gè)Class對(duì)象。

任何對(duì)象調(diào)用getClass()方法都可以獲取和該對(duì)象相關(guān)的一個(gè)Class對(duì)象,這個(gè)Class對(duì)象調(diào)用如下的方法可以獲取創(chuàng)建對(duì)象的類的有關(guān)信息:

publicStringgetName()publicConstructor[]getDeclaredConstructors()publicField[]getDeclareFields()publicMethod[]getDeclaredMethods()例子7importjava.lang.reflect.*;classRect{doublewidth,height,area;publicdoublegetArea(){area=height*width;returnarea;}}publicclassExample6_7{publicstaticvoidmain(Stringargs[]){Rectrect=newRect();Classcs=rect.getClass(); StringclassName=cs.getName();Constructor[]con=cs.getDeclaredConstructors();Field[]field=cs.getDeclaredFields();Method[]method=cs.getDeclaredMethods();System.out.println("類的名字:"+className);System.out.println("類中有如下的成員變量:");for(inti=0;i<field.length;i++){System.out.println(field[i].toString());}System.out.println("類中有如下的方法:");for(inti=0;i<method.length;i++){System.out.println(method[i].toString());}System.out.println("類中有如下的構(gòu)造方法:");for(inti=0;i<con.length;i++){System.out.println(con[i].toString());}}}6.5.2使用Class實(shí)例化一個(gè)對(duì)象

創(chuàng)建對(duì)象最常用的方式就是使用new運(yùn)算符和類的構(gòu)造方法,實(shí)際上我們也可以使用Class對(duì)象得到一個(gè)類的實(shí)例

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論