版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第六章內(nèi)部類與異常類6.1內(nèi)部類6.2匿名類6.3異常類6.4斷言6.5Class類6.1內(nèi)部類
Java支持在一個類中定義另一個類,這樣的類稱作內(nèi)部類,而包含內(nèi)部類的類成為內(nèi)部類的外嵌類。
內(nèi)部類的類體中不可以聲明類變量和類方法。外嵌類的類體中可以用內(nèi)部類聲明對象,作為外嵌類的成員。例子1classChina{finalStringsong="義勇軍進(jìn)行曲";privateBeijingbeijing;China(){beijing=newBeijing();}publicBeijinggetBeijing(){returnbeijing;}StringgetSong(){returnsong;}
classBeijing//內(nèi)部類的聲明{Stringname="北京";voidspeak(){System.out.println("我們是"+name+"我們的國歌是:"+getSong());}}}publicclassExample6_1{publicstaticvoidmain(Stringargs[]){Chinachina=newChina();china.getBeijing().speak();}}
6.2匿名類
6.2.1和類有關(guān)的匿名類
當(dāng)使用類創(chuàng)建對象時,程序允許我們把類體與對象的創(chuàng)建組合在一起,也就是說,類創(chuàng)建對象時,除了構(gòu)造方法還有類體,此類體被認(rèn)為是該類的一個子類去掉類聲明后的類體,稱作匿名類。例如:
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)型對象speak調(diào)用匿名類重寫的speakHello方法
}}6.2.2和接口有關(guān)的匿名類
Java允許直接用接口名和一個類體創(chuàng)建一個匿名對象,此類體被認(rèn)為是實現(xiàn)了接口的類去掉類聲明后的類體,稱作匿名類。例如:
newComputable(){
使用了Computeable接口的類的類體
}例子3interfaceCubic{doublegetCubic(doublex);}classA{voidf(Cubiccubic){doubleresult=cubic.getCubic(3);//執(zhí)行匿名類體中實現(xiàn)的getCubic方法
System.out.println(result);}}publicclassExample6_3{publicstaticvoidmain(Stringargs[]){Aa=newA();a.f(newCubic()//使用匿名類創(chuàng)建對象,將該對象傳遞給方法f的參數(shù)cubic{publicdoublegetCubic(doublex){returnx*x*x;}});Cubiccu=newCubic()//使用匿名類創(chuàng)建對象,接口cu存放該對象的引用
{publicdoublegetCubic(doublex)//匿名類是實現(xiàn)Cubic接口的類
{returnx*x*x;//所以必須要實現(xiàn)getCubic方法
}};doublem=cu.getCubic(5);//接口回調(diào)
System.out.println(m);}}6.3異常類
所謂異常就是運(yùn)行時可能出現(xiàn)一些錯誤,程序運(yùn)行出現(xiàn)異常時,Java運(yùn)行環(huán)境就用異常類Exception的相應(yīng)子類創(chuàng)建一個異常對象,并等待處理,例如,讀取一個不存在的文件時,運(yùn)行環(huán)境就用異常類IOException創(chuàng)建一個對象,異常對象可以調(diào)用如下方法得到或輸出有關(guān)異常的信息:publicStringgetMessage()publicvoidprintStackTrace()publicStringtoString()Java的異常類是處理運(yùn)行時錯誤的特殊類,每一種異常類對應(yīng)一種特定的運(yùn)行錯誤。Java中的每個異常都是Throwable類及其子類的實例對象,異常類的層次結(jié)構(gòu)圖如圖6-1所示。
Throwable類分為java.lang.Exception類和java.lang.Error類,即錯誤和異常子類。
Error是指與虛擬機(jī)或動態(tài)裝載等相關(guān)的問題,異常則是指一些可以被捕獲且可以被恢復(fù)的錯誤。圖6-1異常處理的類層次ObjectThrowableError…Exception…RuntimeExeption…
其中Error類由系統(tǒng)保留,而Exception類則供應(yīng)用程序使用。
Exception類又分為兩種:運(yùn)行時異常和非運(yùn)行時異常。
運(yùn)行時異常(RuntimeException)是在Java運(yùn)行系統(tǒng)執(zhí)行過程中出現(xiàn)的異常。
非運(yùn)行時異常(Non-RuntimeException)是由編譯器檢測到的,在程序運(yùn)行過程中可能發(fā)生而要求必須處理的異常。系統(tǒng)定義的運(yùn)行異常異常對應(yīng)的系統(tǒng)運(yùn)行錯誤ClassNotFoundException未找到欲裝載使用的類FileNotFoundException未找到指定的文件或目錄IOException輸入、輸出錯誤InterruptedException線程在睡眠、等待或因其他原因暫停時被其他線程打斷UnknownHostException無法確定主機(jī)的IP地址SecurityException安全性錯誤,如Applet欲讀寫文件MalformedURLExceptionURL格式錯誤下表中列出了若干常見的系統(tǒng)定義異常6.3.1try~catch~finally語句
使用try~catch~finally語句來處理異常,將可能出現(xiàn)的異常操作放在try~catch~finally語句的try部分,當(dāng)try部分中的某個語句發(fā)生異常后,try部分將立刻結(jié)束執(zhí)行,而轉(zhuǎn)向執(zhí)行相應(yīng)的catch部分;所以程序可以將發(fā)生異常后的處理放在catch部分;finally部分表示try或catch執(zhí)行完后,均需要執(zhí)行的部分try~catch,表示為try~catch提供一個統(tǒng)一的“出口”。try~catch~finally語句可以出現(xiàn)多個catch,分別處理發(fā)生的相應(yīng)異常。try{Java語句塊}catch(異常錯誤類對象名){
異常處理語句塊}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)生這樣的異常。這時就要用到throws和throw兩個關(guān)鍵字。
throws包含在方法的聲明中,其格式如下:返回類型方法名(參數(shù))throws異常類名{
語句體}
其中,異常類名可以是多個,但需要用逗號隔開。此時,方法并不需要處理它所生成的異常,而是向上傳遞,由調(diào)用它的方法來處理這些異常。
異常的主動拋出由throw關(guān)鍵字完成。throw語句的格式為:
throwThrowableobject;
其中ThrowableObject必須為Throwable類或其子類的對象。例如: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());}}}
在使用異常的過程中,要遵循以下的四點原則:(1)不要過多地使用異常,更不要在循環(huán)體內(nèi)使用異常。(2)在捕獲或聲明異常時,要選取合適類型的異常類。(3)一旦捕獲了一個異常,就應(yīng)對其做出相應(yīng)的處理,而不應(yīng)放任不管。(4)對于自定義的異常類,通常把它作為類Exception的子類,而不作為類Error的子類。并且在多數(shù)情況下,不要把自定義的異常類作為運(yùn)行時異常類RuntimeException的子類。另外,自定義異常類的類名常常以Exception結(jié)尾。6.4斷言
斷言語句在調(diào)試代碼階段非常有用,斷言語句一般用于程序不準(zhǔn)備通過捕獲異常來處理的錯誤。例如,當(dāng)發(fā)生某個錯誤時,要求程序必須立即停止執(zhí)行。使用關(guān)鍵字assert聲明一條斷言語句,斷言語句有一下兩種格式:
assertbooleanExpression;assertbooleanExpression:messageException;
其中booleanExpression必須是求值為boolean型的表達(dá)式;messageException可以是值為字符串的表達(dá)式。例子6importjava.util.Scanner;publicclassExample6_6{publicstaticvoidmain(Stringargs[]){System.out.println("請正數(shù)回車確認(rèn)");Scannerscan=newScanner(System.in);doublenumber=scan.nextDouble();assertnumber>0:"負(fù)數(shù)不能計算平方根";System.out.println(number+"的平方根:"+Math.sqrt(number));}}6.5Class類6.5.1獲取類的有關(guān)信息
Class是java.lang包中的類,該類的實例用來封裝對象運(yùn)行時的狀態(tài)。當(dāng)一個類被加載且創(chuàng)建對象時,和該類相關(guān)的一個類型為Calss的對象就會自動創(chuàng)建。
Class類本身不提供構(gòu)造方法,因此,不能使用new運(yùn)算符和構(gòu)造方法顯示地創(chuàng)建一個Class對象。
任何對象調(diào)用getClass()方法都可以獲取和該對象相關(guān)的一個Class對象,這個Class對象調(diào)用如下的方法可以獲取創(chuàng)建對象的類的有關(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實例化一個對象
創(chuàng)建對象最常用的方式就是使用new運(yùn)算符和類的構(gòu)造方法,實際上我們也可以使用Class對象得到一個類的實例
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 股東協(xié)議合同范例范例
- 轉(zhuǎn)讓木業(yè)廠房合同范例
- 私房房買賣合同范例
- 填寫公司合同范例
- 電器線路安裝合同范例
- 家私電器購銷合同范例
- 信托支付合同范例
- 瓷磚鐵托銷售合同范例
- 品牌銷售合作合同范例
- 公路運(yùn)輸招標(biāo)合同范例
- 金剛砂耐磨地面施工安全方案
- 期末測試(試題)-2024-2025學(xué)年六年級上冊數(shù)學(xué)蘇教版
- GB/T 36547-2024電化學(xué)儲能電站接入電網(wǎng)技術(shù)規(guī)定
- 品牌合作經(jīng)營合同
- 期末測試卷(一)2024-2025學(xué)年 人教版PEP英語五年級上冊(含答案含聽力原文無聽力音頻)
- 2023-2024學(xué)年廣東省深圳市南山區(qū)八年級(上)期末英語試卷
- 2024廣西專業(yè)技術(shù)人員繼續(xù)教育公需科目參考答案(100分)
- 2024年上海市中考語文備考之150個文言實詞刷題表格及答案
- 2024年漢口銀行股份有限公司招聘筆試沖刺題(帶答案解析)
- 中醫(yī)跨文化傳播智慧樹知到期末考試答案章節(jié)答案2024年浙江中醫(yī)藥大學(xué)
- 2024年日歷表(空白)(一月一張-可編輯做工作日歷)
評論
0/150
提交評論