版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、Java語言程序設(shè)計p內(nèi)部類內(nèi)部類p匿名類匿名類p異常類異常類p斷言斷言pClass類類主要內(nèi)容6.1 內(nèi)部類pJava支持在一個類中聲明另一個類,這樣的類稱作內(nèi)部類,而包含內(nèi)部類的類成為內(nèi)部類的外嵌類。 p內(nèi)部類的外嵌類的成員變量在內(nèi)部類中仍有效,內(nèi)部類中的方法也可以調(diào)用外嵌類中的方法。p內(nèi)部類的類體中不可以聲明類變量和類方法,外嵌類的類體中可以用內(nèi)部類聲明對象,作為外嵌類的成員。例6.1public class China final String song=義勇軍進(jìn)行曲義勇軍進(jìn)行曲; private Beijing beijing; /內(nèi)部類聲明的對象,作為外嵌類的成員內(nèi)部類聲明的對象,
2、作為外嵌類的成員 China() beijing=new Beijing(); public Beijing getBeijing() return beijing; String getSong() return song; class Beijing /內(nèi)部類的聲明內(nèi)部類的聲明 String name=北京北京; void speak() System.out.printf(%sn%s,我們是我們是+name,我們的國歌是我們的國歌是:+getSong(); public class Example6_1 public static void main(String args) China
3、 china=new China(); china.getBeijing().speak(); 為何使用內(nèi)部類原因是:原因是:1.一個內(nèi)部類的對象能夠訪問創(chuàng)建它的對象一個內(nèi)部類的對象能夠訪問創(chuàng)建它的對象的實現(xiàn),包括的實現(xiàn),包括私有數(shù)據(jù)私有數(shù)據(jù)。2. 對于同一個包中的其他類來說,對于同一個包中的其他類來說,內(nèi)部類能內(nèi)部類能夠隱藏起來夠隱藏起來。3.匿名內(nèi)部類可以匿名內(nèi)部類可以很方便的定義回調(diào)很方便的定義回調(diào)。4.使用內(nèi)部類可以非常使用內(nèi)部類可以非常方便的編寫事件驅(qū)動方便的編寫事件驅(qū)動程程 序序注意p和普通的類一樣,內(nèi)部類也可以有靜態(tài)的。和普通的類一樣,內(nèi)部類也可以有靜態(tài)的。不過和非靜態(tài)內(nèi)部類相比
4、,不過和非靜態(tài)內(nèi)部類相比,區(qū)別就在于靜區(qū)別就在于靜態(tài)內(nèi)部類沒有了指向態(tài)內(nèi)部類沒有了指向 外部的引用外部的引用。這實際。這實際上和上和 C+ 中的嵌套類很相像了,中的嵌套類很相像了,Java 內(nèi)部內(nèi)部類與類與 C+ 嵌套類最大的不同就在于是否有嵌套類最大的不同就在于是否有指向外部的引用這一點上。指向外部的引用這一點上。p除此之外,在任何非靜態(tài)內(nèi)部類中,都不除此之外,在任何非靜態(tài)內(nèi)部類中,都不能有靜態(tài)數(shù)據(jù),靜態(tài)方法或者又一個靜態(tài)能有靜態(tài)數(shù)據(jù),靜態(tài)方法或者又一個靜態(tài)內(nèi)部類(內(nèi)部類(內(nèi)部類的嵌套可以不止一層內(nèi)部類的嵌套可以不止一層)。)。不過靜態(tài)內(nèi)部類中卻可以擁有這一切。不過靜態(tài)內(nèi)部類中卻可以擁有這一
5、切。6.2 匿名類6.2.1 和類有關(guān)的匿名類 Java允許直接使用一個類的子類的類體創(chuàng)建一個子類對象。 創(chuàng)建子類對象時,除了使用父類的構(gòu)造方法外還有類體,此類體被認(rèn)為是一個子類去掉類聲明后的類體,稱作匿名類。 假設(shè)People是類,那么下列代碼就是用People的一個子類(匿名類)創(chuàng)建對象: new People () 匿名類的類體 ; p匿名類可以繼承也可以重寫父類的方法。匿名類可以繼承也可以重寫父類的方法。p匿名類一定是內(nèi)部類。匿名類一定是內(nèi)部類。p匿名類的類體重不可以聲明匿名類的類體重不可以聲明static 成員變成員變量及方法。量及方法。p用匿名類創(chuàng)建對象時,要使用父類的構(gòu)造用匿名類
6、創(chuàng)建對象時,要使用父類的構(gòu)造方法。方法。p匿名類的常用方式是向方法的參數(shù)傳值。匿名類的常用方式是向方法的參數(shù)傳值。例6.2abstract class Speak public abstract void speakHello();class Student void f(Speak sp) sp.speakHello(); public class Example6_2 public static void main(String args) Speak speak=new Speak() public void speakHello() System.out.println(大家好,祝工作
7、順利!大家好,祝工作順利!); ; speak.speakHello(); /上轉(zhuǎn)型對象上轉(zhuǎn)型對象speak調(diào)用匿名類重寫的調(diào)用匿名類重寫的speakHello方法方法 Student st=new Student(); st.f(new Speak() public void speakHello() System.out.println(I am a student,how are you); ); p注意匿名類的聲明是在編譯時進(jìn)行的,實注意匿名類的聲明是在編譯時進(jìn)行的,實例化在運行時進(jìn)行。這意味著例化在運行時進(jìn)行。這意味著 for循環(huán)中的循環(huán)中的一個一個new語句會創(chuàng)建相同匿名類的幾個實
8、例,語句會創(chuàng)建相同匿名類的幾個實例,而不是創(chuàng)建幾個不同匿名類的一個實例。而不是創(chuàng)建幾個不同匿名類的一個實例。6.2.2 和接口有關(guān)的匿名類 假設(shè)Computable是一個接口,那么,Java允許直接用接口名和一個類體創(chuàng)建一個匿名對象,此類體被認(rèn)為是實現(xiàn)了Computable接口的類去掉類聲明后的類體,稱作匿名類。 下列代碼就是用實現(xiàn)了Computable接口的類(匿名類)創(chuàng)建對象: new Computable() 實現(xiàn)接口的匿名類的類體 例6.3interface Cubic double getCubic(double x);class A void f(Cubic cubic) doub
9、le result=cubic.getCubic(3); System.out.println(result=+result); public class Example6_3 public static void main(String args) Cubic cu=new Cubic() public double getCubic(double x) return x*x*x; ; double m=cu.getCubic(5); /接口回調(diào)接口回調(diào) System.out.println(m=+m); A a=new A(); a.f(new Cubic() /使用匿名類創(chuàng)建對象使用匿名
10、類創(chuàng)建對象,將該對象傳遞給方法將該對象傳遞給方法f的參數(shù)的參數(shù)cubic public double getCubic(double x) return x*x*x; ); 6.3 6.3 異常類 異常類定義解釋Exception類的構(gòu)造函數(shù)n public Exception( );n public Exception( String s ); n 第二個構(gòu)造函數(shù)可以接受字符串參數(shù)傳入的信息,該信息通常是對該異常所對應(yīng)的錯誤的描述。 Exception類的常用方法ppublic String toString ( )toString ( )方法返回描述當(dāng)前Exception類信息的字符串。p
11、public void printStackTrace ( ) 打印輸出當(dāng)前異常對象的堆棧使用軌跡ppublic String getMessage() 打印錯誤信息6.3.1 trycatchfinally語句6.3.2自定義異常類自定義異常類補充p多異常的處理n一個try塊可能產(chǎn)生多種不同的異常,如果希望能采取不同的方法來處理這些異常,就需要使用多異常處理機(jī)制。n多異常處理是通過在一個try塊后面定義若干個catch塊來實現(xiàn)的,每個catch塊用來接收和處理一種特定的異常對象,每個catch塊都有一個異常對象作為參數(shù)。補充n多異常的處理一般格式try /有異常拋出的語句組;有異常拋出的語句
12、組;catch ( 異常類名異常類名1 異常形式參數(shù)名異常形式參數(shù)名1)/異常處理語句組異常處理語句組1; catch ( 異常類名異常類名2 異常形式參數(shù)名異常形式參數(shù)名2)/異常處理語句組異常處理語句組2; finally /無論有否異常,都應(yīng)被執(zhí)行的語句組;無論有否異常,都應(yīng)被執(zhí)行的語句組;補充n當(dāng)try塊拋出一個異常時,程序的流程首先轉(zhuǎn)向第一個catch塊,并審查當(dāng)前異常對象可否為這個catch塊所接收。n如果try塊產(chǎn)生的異常對象被一個catch塊所接收,則程序的流程將直接跳轉(zhuǎn)到這個catch語句塊中,語句塊執(zhí)行完畢后,執(zhí)行finally塊(如果有的話),try塊中尚未執(zhí)行的語句和其
13、他的catch塊將被忽略;n如果所有的catch塊都不能與當(dāng)前的異常對象匹配,則說明當(dāng)前方法不能處理這個異常對象,程序流程將返回到調(diào)用該方法的上層方法。補充n如果這個上層方法中定義了與所產(chǎn)生的異常對象相匹配的catch塊,流程就跳轉(zhuǎn)到這個catch塊中; 否則繼續(xù)回溯更上層的方法。n如果所有的方法中都找不到合適的catch塊,則由Java運行系統(tǒng)來處理這個異常對象。n一個異常對象能否被一個catch語句塊所接收,主要看該異常對象與catch塊的異常參數(shù)的匹配情況。補充n異常對象將被接收的條件p(1) (1) 異常對象與參數(shù)屬于相同的異常類。異常對象與參數(shù)屬于相同的異常類。p(2) (2) 異常
14、對象屬于參數(shù)異常類的子類。異常對象屬于參數(shù)異常類的子類。p(3) (3) 異常對象實現(xiàn)了參數(shù)所定義的接口。異常對象實現(xiàn)了參數(shù)所定義的接口。p注:三個條件滿足任何一個即被接受。注:三個條件滿足任何一個即被接受。n假設(shè)try塊中所有語句的執(zhí)行都沒有引發(fā)異常,則所有的catch塊都會被忽略而不予執(zhí)行。n無論是否發(fā)生異常finally塊都將被執(zhí)行(如果有的話)。補充n在設(shè)計catch塊處理不同異常時應(yīng)注意的問題p比較通用的操作是打印異常和錯誤的相比較通用的操作是打印異常和錯誤的相關(guān)信息,包括異常名稱、產(chǎn)生異常的方關(guān)信息,包括異常名稱、產(chǎn)生異常的方法名等。法名等。p在處理多異常時應(yīng)注意認(rèn)真設(shè)計各在處理多
15、異常時應(yīng)注意認(rèn)真設(shè)計各catch塊的排列順序。塊的排列順序。p一般地,處理較具體和較常見的異常的一般地,處理較具體和較常見的異常的catch塊應(yīng)放在前面,與多種異常相匹塊應(yīng)放在前面,與多種異常相匹配的配的catch塊應(yīng)放在較后的位置。塊應(yīng)放在較后的位置。補充p現(xiàn)階段常用示意代碼try /有異常拋出的語句組;catch (Exception e ) e.printStackTrace ( ); System.out.println( e.toString ( ) ); System.out.println(e); System.out.println( “error in mymethod th
16、en what” ); 練習(xí)根據(jù)編號輸出課程名稱p需求說明:需求說明:n按照控制臺提示輸入按照控制臺提示輸入13之間任一個數(shù)字,之間任一個數(shù)字,程序?qū)⑤敵鱿鄳?yīng)的課程名稱程序?qū)⑤敵鱿鄳?yīng)的課程名稱n根據(jù)鍵盤輸入進(jìn)行判斷。如果輸入正確,根據(jù)鍵盤輸入進(jìn)行判斷。如果輸入正確,輸出對應(yīng)課程名稱。如果輸入錯誤,給出輸出對應(yīng)課程名稱。如果輸入錯誤,給出錯誤提示錯誤提示n不管輸入是否正確,均輸出不管輸入是否正確,均輸出“歡迎提出建歡迎提出建議議”語句語句6.4 斷言p斷言語句在調(diào)試代碼階段非常有用,斷言語句在調(diào)試代碼階段非常有用,斷言斷言語句一般用于程序不準(zhǔn)備通過捕獲異常來語句一般用于程序不準(zhǔn)備通過捕獲異常來處
17、理的錯誤處理的錯誤,例如,當(dāng)發(fā)生某個錯誤時,例如,當(dāng)發(fā)生某個錯誤時,要求程序必須立即停止執(zhí)行。要求程序必須立即停止執(zhí)行。p使用關(guān)鍵字使用關(guān)鍵字assert聲明一條斷言語句,斷言聲明一條斷言語句,斷言語句有一下兩種格式:語句有一下兩種格式:passert booleanExpression;passert booleanExpression:messageException;p其中其中booleanExpression必須是求值為必須是求值為boolean型的表達(dá)式;型的表達(dá)式;messageException可可以是求值為字符串的表達(dá)式。以是求值為字符串的表達(dá)式。p當(dāng)當(dāng)booleanExpre
18、ssion的值為的值為false時,程序時,程序從斷言語句處停止執(zhí)行,如果使用第二種從斷言語句處停止執(zhí)行,如果使用第二種形式的斷言語句同時輸出形式的斷言語句同時輸出messageException表達(dá)式的值表達(dá)式的值 ;當(dāng);當(dāng)booleanExpression的值為的值為true時,程序從斷言語句處繼續(xù)執(zhí)行。時,程序從斷言語句處繼續(xù)執(zhí)行。p當(dāng)使用當(dāng)使用java解釋器直接運行應(yīng)用程序時,默解釋器直接運行應(yīng)用程序時,默認(rèn)地關(guān)閉斷言語句,認(rèn)地關(guān)閉斷言語句,在調(diào)試程序時可以使在調(diào)試程序時可以使用用-ea啟用斷言語句啟用斷言語句,如:,如:pjava -ea mainClassp例子例子6在計算平方根時
19、使用了斷言語句。在計算平方根時使用了斷言語句。import java.util.Scanner;public class Example6_6 public static void main (String args ) System.out.println(請正數(shù)回車確認(rèn)請正數(shù)回車確認(rèn)); Scanner scan=new Scanner(System.in); double number=scan.nextDouble(); assert number0:負(fù)數(shù)不能計算平方根負(fù)數(shù)不能計算平方根; System.out.println(number+的平方根:的平方根:+Math.sqrt(n
20、umber); p也可以對某個類或某個包打開斷言功能,例如:也可以對某個類或某個包打開斷言功能,例如:pjava ea:Myclass ea:com.mydx.mylib 該命令打開類該命令打開類Myclass以及在以及在com.mydx.mylib包中及其子包中全部類的斷言功包中及其子包中全部類的斷言功能(能(包名后的省略號是必須的包名后的省略號是必須的)p可以使用可以使用-da選項來關(guān)閉特定類或包的斷言功能:選項來關(guān)閉特定類或包的斷言功能:pjava da:Myclass da:com.mydx.mylibpea和和-da選項對系統(tǒng)類(不通過類裝載器而由選項對系統(tǒng)類(不通過類裝載器而由JV
21、M直接裝載的類)無效,對系統(tǒng)類使用直接裝載的類)無效,對系統(tǒng)類使用esa和和-dsa選項選項何時使用斷言p記住兩點:記住兩點:1.斷言失敗是致命的、不可恢復(fù)的錯誤。斷言失敗是致命的、不可恢復(fù)的錯誤。2.斷言檢查僅僅用在程序開發(fā)和測試階段。斷言檢查僅僅用在程序開發(fā)和測試階段。p因此,斷言僅僅應(yīng)該在測試階段用來定位程序內(nèi)部錯因此,斷言僅僅應(yīng)該在測試階段用來定位程序內(nèi)部錯誤。誤。p可以將斷言語句作為方法的前置條件或后置條件來添可以將斷言語句作為方法的前置條件或后置條件來添加,也可以將其置于任何方法內(nèi),或放在加,也可以將其置于任何方法內(nèi),或放在ifelse塊塊和和switch塊中。塊中。assert
22、關(guān)鍵字的唯一限制在于它必關(guān)鍵字的唯一限制在于它必須位于可執(zhí)行塊中。須位于可執(zhí)行塊中。 p對一個方法調(diào)用是否使用斷言,應(yīng)先看看該方法的文對一個方法調(diào)用是否使用斷言,應(yīng)先看看該方法的文檔。如果文檔指明在某種情況下會拋出異常,那么對檔。如果文檔指明在某種情況下會拋出異常,那么對這種情況不需使用斷言;如果文檔指明一個限制條件,這種情況不需使用斷言;如果文檔指明一個限制條件,但沒有說明違反該條件會拋出異常,此時就可以使用但沒有說明違反該條件會拋出異常,此時就可以使用斷言斷言斷言程序分析1. public class Test2. public static void main( String argv
23、)3. / insert statement here4. 5. Which statement, inserted at line 3, produces the following output?Exception in thread “main” java.lang.AssertionError: true /注意這里有提示信息的!注意這里有提示信息的!at Test.main(Test.java:3)A. assert true;B. assert false;C. assert false : true;D. assert false = true;E. assert false:
24、false;6.5 Class類 6.5.1 獲取類的有關(guān)信息獲取類的有關(guān)信息pClass是是java.lang包中的類包中的類,該類的實例用該類的實例用來封裝對象運行時的狀態(tài)。來封裝對象運行時的狀態(tài)。當(dāng)一個類被加當(dāng)一個類被加載且創(chuàng)建對象時,和該類相關(guān)的一個類型載且創(chuàng)建對象時,和該類相關(guān)的一個類型為為Calss的對象就會自動創(chuàng)建。的對象就會自動創(chuàng)建。Class類本身類本身不提供構(gòu)造方法,因此,不能使用不提供構(gòu)造方法,因此,不能使用new運算運算符和構(gòu)造方法顯示地創(chuàng)建一個符和構(gòu)造方法顯示地創(chuàng)建一個Class對象。對象。任何對象調(diào)用任何對象調(diào)用getClass()方法都可以獲取和方法都可以獲取和該
25、對象相關(guān)的一個該對象相關(guān)的一個Class對象,這個對象,這個Class對對象調(diào)用如下的方法可以獲取創(chuàng)建對象的類象調(diào)用如下的方法可以獲取創(chuàng)建對象的類的有關(guān)信息的有關(guān)信息. 例子例子6.7import java.lang.reflect.*;class Rect double width,height,area; public double getArea() area=height*width; return area; public class Example6_7 public static void main(String args) Rect rect=new Rect(); Class
26、 cs=rect.getClass(); String className=cs.getName(); Constructor con=cs.getDeclaredConstructors(); Field field=cs.getDeclaredFields() ; Method method=cs.getDeclaredMethods(); System.out.println(類的名字:+className); System.out.println(類中有如下的成員變量:); for(int i=0;ifield.length;i+) System.out.println(fieldi.
27、toString(); System.out.println(類中有如下的方法:); for(int i=0;imethod.length;i+) System.out.println(methodi.toString(); System.out.println(類中有如下的構(gòu)造方法:); for(int i=0;icon.length;i+) System.out.println(coni.toString(); 6.5.2使用Class實例化一個對象p創(chuàng)建對象最常用的方式就是使用創(chuàng)建對象最常用的方式就是使用new運算符和類的構(gòu)運算符和類的構(gòu)造方法,實際上我們也可以使用造方法,實際上我們也可以使用Class對象得到一個對象得到一個類的實例。為了得到一個類的對象,可以先得到一個類的實例。為了得到一個類的對象,可以先得到一個和該類相關(guān)的和該類相關(guān)的Class對象,做到這一點并不困難,只對象,做到這一點并不困難,只要使用要使用Class的類方法的類方法public static Class forName(String className) throws ClassNotFoundException就可以返回一個和參數(shù)就可以返回一個和參數(shù)className指定的類相關(guān)的指定的類相關(guān)的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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年物流園區(qū)建設(shè)項目合作開發(fā)合同
- 2024年版銷售人員全面工作合同樣本
- 2024年研發(fā)合作合同范本:新產(chǎn)品研發(fā)與推廣
- 義務(wù)教育數(shù)學(xué)課程標(biāo)準(zhǔn)(2022年版)題庫答案
- 2024年跨境電商銷售合同英文版版B版
- 2024年土特產(chǎn)區(qū)域代理合作協(xié)議范本3篇
- 2024年電子支付系統(tǒng)技術(shù)許可合同
- 2025年度軟件園辦公場地使用權(quán)及廣告發(fā)布合同3篇
- 2025年度二零二五年度邊坡防護(hù)施工與地質(zhì)勘察合同2篇
- 2024年股東權(quán)益共享協(xié)議書
- 江西省2023-2024學(xué)年高二上學(xué)期期末教學(xué)檢測數(shù)學(xué)試題 附答案
- Python試題庫(附參考答案)
- 碳匯計量與監(jiān)測技術(shù)智慧樹知到期末考試答案章節(jié)答案2024年浙江農(nóng)林大學(xué)
- 可用性控制程序
- GB/T 17554.1-2006識別卡測試方法第1部分:一般特性測試
- 說明書hid500系列變頻調(diào)速器使用說明書s1.1(1)
- 橫版榮譽證書模板可修改打印 (9)
- 建設(shè)銀行股份關(guān)聯(lián)交易申報及信息披露系統(tǒng)操作手冊新一代
- 建筑工程施工勞務(wù)清包工合同
- 成都市國土資源局關(guān)于加強(qiáng)國有建設(shè)用地土地用途變更和
- 工作證明(通用)
評論
0/150
提交評論