版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
在線教務(wù)輔導(dǎo)網(wǎng):://教材其余課件及動畫素材請查閱在線教務(wù)輔導(dǎo)網(wǎng)QQ:349134187或者直接輸入下面地址:4.1繼承的根底4.2super關(guān)鍵字4.3多層繼承4.4方法的重寫〔多態(tài)與繼承〕4.5動態(tài)方法調(diào)度4.6abstact關(guān)鍵字4.7final關(guān)鍵字4.8本章小結(jié)第4章
繼承
繼承是面向?qū)ο缶幊痰囊粋€重要特性。繼承與人類認識客觀世界的過程是息息相關(guān)的。
【4.1繼承的根底】在Java中,我們把“學(xué)生〞類稱為超類,“大學(xué)生〞類稱為子類。在實際應(yīng)用中為了更符合自然現(xiàn)象,超類也可以稱為基類或父類,相應(yīng)的也可以把子類稱為派生類。在本書中,我們采用直譯的方法把superclass翻譯為超類,把subclass翻譯為子類。一個超類可以有多個子類,每個子類是唯一的,與其他子類互不相同,子類又可以作為其他子類的超類?!衾^承的格式
為實現(xiàn)繼承,Java語言使用了extends關(guān)鍵字,其格式如下:class子類名extends超類名{ 類體;}
classA{inti;A(){System.out.println("Ainit...");} voidshowi(){System.out.println("i="+i);}}classBextendsA{intj;B(){System.out.println("Binit...");}voidshowj()
{System.out.println("j="+j);}}publicclassEx{publicstaticvoidmain(Stringargs[]){ Bb=newB(); b.i=10; b.j=20; b.showi(); b.showj();}}本程序的運行結(jié)果是:Ainit...Binit...i=10j=20protected關(guān)鍵字說明的成員變量和成員方法只能被其子類使用,也就是說,只有子類才能繼承使用其超類中被protected關(guān)鍵字修飾的成員變量和成員方法?!粼L問控制符protected
【例4.3】protected權(quán)限的使用。classA{publicinti;privateintj;protectedintk;voidshowA(){System.out.println("i="+i+"j="+j+"k="+k);}}classBextendsA{voidshowB(){System.out.println("i="+i+"k="+k);}}
publicclassEx{publicstaticvoidmain(Stringargs[]){Bb=newB();b.i=10; //b.j=20;錯誤,j是私有的成員變量b.k=30;b.showA();b.showB();}}本程序的運行結(jié)果是:i=10j=0k=30i=10k=30【
4.2super關(guān)鍵字
】◆調(diào)用超類構(gòu)造方法
super關(guān)鍵字常見的用法有兩種,一種是調(diào)用超類的構(gòu)造方法,另一種是當子類定義了和超類同名的成員變量或成員方法,需要super關(guān)鍵字調(diào)用超類的成員變量和成員方法。【例4.4】調(diào)用超類的構(gòu)造方法。classA{ privateinti; A(inta) { i=a; } voidshowi()
{ System.out.println("i="+i); }}classBextendsA{ privateintj; B(intb) { j=b; } voidshowj()
{ System.out.println("j="+j); }}publicclassEx{ publicstaticvoidmain(Stringargs[]) { Bb=newB(10); b.showi(); b.showj(); }}
編譯出錯???【例4.5】調(diào)用超類的成員變量。classA{inti;voidshowi(){System.out.println("A.i="+i);}}
classBextendsA{inti;B(inta,intb){super.i=a;//使用super訪問超類A的成員變量ii=b;}voidshowi(){super.showi(); //使用super訪問超類A的成員方法showi()
System.out.println("B.i="+i);}}publicclassEx{ publicstaticvoidmain(Stringargs[]) { Bb=newB(5,10); b.showi(); }}本程序的運行結(jié)果是:A.i=5B.i=10◆調(diào)用超類的成員變量
【
4.3多層繼承
】Java支持多層繼承,例如B類繼承了A類,我們稱B類為子類,A類是超類。如果C類繼承了B類,那么相對C類來說,B類是超類。這就好似某人在父親面前是兒子,在自己兒子面前是父親,擁有雙重身份。classA{privateinti;A(inta){i=a;} voidshowi()
{System.out.println("i="+i);}}classBextendsA{privateintj;B(inta,intb){super(a); //調(diào)用超類A的構(gòu)造方法j=b;}voidshowij(){showi();System.out.println("j="+j);}}classCextendsB{ privateintk; C(inta,intb,intc) { super(a,b); //調(diào)用超類B的構(gòu)造方法 k=c; } voidshowijk() { showij(); System.out.println("k="+k); }}
【4.4方法的重寫〔多態(tài)與繼承〕】◆繼承中的方法重載
【例4.7】子類中的方法重載。classA{inti=5;voidshow(){System.out.println("i="+i);}}classBextendsA{intj=10;voidshow(inta){System.out.println("j="+j+""+a);}}publicclassEx{publicstaticvoidmain(Stringargs[]){Bb=newB();b.show();b.show(5);}}本程序的運行結(jié)果是:i=5j=105注意:方法重寫和方法重載的區(qū)別:1、重寫不能改變參數(shù)列表〔包括參數(shù)個數(shù),參數(shù)數(shù)據(jù)類型和參數(shù)的位置〕;重載必須改變參數(shù)列表;2、重寫不能改變返回值類型,重載可以改變返回值類型;3、重寫方法不能有比被重寫方法限制更嚴格的訪問修飾符,重載可以改變訪問修飾符?!舴椒ㄖ貙?override)方法重寫,是指在子類中對超類的某方法進行重新定義,其子類的該方法名以及參數(shù)位置和個數(shù)均與超類相同,從而在調(diào)用子類的該方法時,不會執(zhí)行父類的方法。注意:1.構(gòu)造方法不能被重寫,可以被重載。2.用final〔詳見章節(jié)4.7〕、private、static修飾的方法不能被重寫,可以被重載。3.方法的重載能在同一個類中或者子類中進行。4.方法的重寫能在實現(xiàn)接口〔詳見第5章〕的具體類中或者子類中進行。5.子類里的方法與超類里用final、private、static關(guān)鍵字修飾的方法即使方法名相同,也不是重寫,有可能是方法重載,或者是父類沒有而子類所有的方法?!?/p>
4.5動態(tài)方法調(diào)度】動態(tài)方法調(diào)度是一種在調(diào)用方法重寫時實現(xiàn)了運行時的Java多態(tài)性,而不是編譯時的多態(tài)性。動態(tài)方法調(diào)度告訴Java如何實現(xiàn)運行時的多態(tài)性,因此它是一種重要的運行機制。【例4.9】動態(tài)方法調(diào)度。classA{inti;A(inta){i=a;}voidshow()
{System.out.println("i="+i);}}classBextendsA{intj;B(inta,intb){super(a);j=b;}voidshow(){
System.out.println("i="+i+"j="+j);}}
publicclassEx{ publicstaticvoidmain(Stringargs[]) { Aa; Bb=newB(5,6); a=b;//在運行的時候為對象a賦值 a.show();//調(diào)用的是類B的show()方法 }}本程序的運行結(jié)果是:i=5j=6【
4.6abstact關(guān)鍵字
】“抽象〞從字面上就是不具體的意思。所以,抽象類就表示該類中肯定有類體為空,沒有具體實現(xiàn)的方法。抽象方法就表示該方法沒有具體實現(xiàn)某種操作,只是一個空架子而已。如果在定義類的時候前面加上abstract關(guān)鍵字,那么這個類被稱為抽象類。如果類定義中的某個成員方法前被abstract關(guān)鍵字修飾,那么這個成員方法是抽象方法。◆抽象類
抽象類的格式如下:abstractclass類名{類體;}abstractclassA //抽象類{inti;A(inta){i=a;}voidshow(){System.out.println("i="+i);}}◆抽象方法
抽象方法就是只有聲明而沒有實現(xiàn)的方法。它說明了方法具有功能,但是沒有說明具體有什么功能,而是在子類中去實現(xiàn)功能。
【例4.12】B類繼承并實現(xiàn)了A類的抽象方法。abstractclassA{inti;A(inta){i=a;}abstractvoidshow();//抽象方法}classBextendsA{intj;B(inta,intb){super(a);j=b;} voidshow(){
System.out.println("i="+i+"j="+j);}}publicclassEx{ publicstaticvoidmain(Stringargs[]) { Aa=newB(5,6); a.show(); }}本程序的運行結(jié)果是:i=5j=6需要關(guān)注的幾個問題:第一,前面我們提到過一個抽象類中可以沒有抽象方法,但是如果一個類定義中包含一個或多個抽象方法,這個類必須為抽象類。這是因為至少包含一個抽象方法的類,是不能實例化的,因為其包含的抽象方法沒有具體定義,實例化后無法調(diào)用。第二,我們還需要強調(diào)的是沒有抽象的構(gòu)造方法,這是因為構(gòu)造方法是在使用new關(guān)鍵字創(chuàng)建對象的時候系統(tǒng)自動調(diào)用的,二者矛盾。方法前不能同時有abstract和static關(guān)鍵字修飾,例如:abstractstaticvoidshow();【
4.7final關(guān)鍵字
】final關(guān)鍵字修飾的量是常量。final關(guān)鍵字修飾的方法是final方法,final修飾的類稱為final類。
◆final常量
【例4.14】final常量的使用。classA{finalinti=5;//i是常量intj;A(finalinta)//局部變量a是常量{//a++;錯誤1//i=a;錯誤2 j=a;}voidshow(){System.out.println("i="+i+""+"j="+j);}}publicclassEx{publicstaticvoidmain(Stringargs[]){ Aa=newA(15);a.show();}}本程序的運行結(jié)果是:i=5j=15◆final方法
【例4.15】final方法的使用。classA{inti; A(inta) {i=a;}finalvoidshow(){System.out.println("i="+i);}}classBextendsA{intj;B(inta,intb){super(a);j=b;}/*voidshow()錯誤{System.out.println("j="+j);}*/}
publicclassEx{ publicstaticvoidmain(Stringargs[]) { Bb=newB(5,6); b.show(); }}◆final類
在類定義前加final關(guān)鍵字修飾,則該類是final類,即該類不能被繼承,也就是該類不能存在子類,其定義格式如下:finalclassA{ 類體; }【
4.8本章小結(jié)
】繼承是面向?qū)ο缶幊痰囊粋€重要特性。繼承是基于已經(jīng)存在的類創(chuàng)建新類,已經(jīng)存在的類成為父類或基類,新創(chuàng)建的類稱為子類或派生類。子類繼承父類的成員變量和成員方法,Java允許多層繼承。
super關(guān)鍵字常見的用法有兩種,一種是調(diào)用超類的構(gòu)造方法,另一種是當子類定義了和超類同名的成員變量或成員方法,需要super關(guān)鍵字調(diào)用超類的成員變量和成員方法。
方法的重載和重寫均體現(xiàn)了Java的多態(tài)性。如果在定義類的時候前面加上abstract關(guān)鍵字,則這個類被稱為抽象類。抽象類不能實例化,即不能使用new關(guān)鍵字創(chuàng)建對象;抽象類中可以不包含也可以包含一個或多個抽象方法。
如果類定義中的某個成員方法前被abstract關(guān)鍵字修飾,則這個成員方法是抽象方法。抽象方法只有聲明而沒有具體的方法實現(xiàn),其具體方法實現(xiàn)在子類中完成。
final關(guān)鍵字修飾的量是常量,常量在程序的運行過程中不允許修改;final關(guān)鍵字修飾的方法是final方法,final方法其不可以在子類中被重寫;final修飾的類稱為final類。final類不能被繼承。5.1包5.2接口
5.3本章小結(jié)第5章
包和接口
【
5.1包
】現(xiàn)實生活中叫“王平”的人很多,我們是如何區(qū)分的呢?答案是——“樹型結(jié)構(gòu)”。為了確切的指明某個“王平”,我們常常采用的方法是這樣的:中國.北京.**公司.財務(wù)科.王平包也是用樹型結(jié)構(gòu)管理和存儲的。Java自身提供了一些預(yù)先定義的包,下面列出一些常用包,其余可查看Java的API信息:
java.lang 提供基本數(shù)據(jù)類型及操作
java.util 提供高級數(shù)據(jù)類型及操作
java.io 提供輸入/輸出流控制
java.awt 提供圖形窗口界面控制
提供支持Internet協(xié)議的功能
java.applet提供實現(xiàn)瀏覽器環(huán)境中Applet的有關(guān)類和方法
java.sql提供與數(shù)據(jù)庫連接的接口
java.rmi提供遠程連接與載入的支持
java.security提供安全性方面的有關(guān)支持◆定義包
創(chuàng)建包要使用package關(guān)鍵字,格式如下:package包名;【例5.1】創(chuàng)建第一個包。//TA.javapackageeva;publicclassTA{ publicvoidshow() { System.out.println("showinTA"); }}【例5.2】為eva包添加新類TB。//TB.javapackageeva;publicclassTB{ publicvoidshow() { System.out.println("showinTB"); }}【例5.1】和【例5.2】中分別是TA.java和TB.Java兩個源文件,每個源文件中的類均放入“eva包”,因此,Java要求上述兩個源文件必須放在“eva”目錄(文件夾)下,而“eva”目錄放在其他任何目錄下均可,格式如下:...\eva\TA.java例如筆者的源文件放在“F:\liu\eva”目錄下,即:F:\liu\eva\TA.java和F:\liu\eva\TB.java
◆理解classpath
為了能方便的使用在上節(jié)中自定義的包,需要重新編輯環(huán)境變量“ClassPath”。若源文件放在“F:\liu\eva”目錄下,即:F:\liu\eva\TA.java和F:\liu\eva\TB.java,則要求編輯環(huán)境變量“ClassPath”,增加“F:\liu;”。
若包名為eva.example,則TA.java和TB.Java兩個文件分別保存在F:\liu\eva\example\TA.java和F:\liu\eva\example\TB.java。環(huán)境變量“ClassPath”的值應(yīng)增加“F:\liu\eva;”,要特別注意的是不能刪除原來的環(huán)境變量“ClassPath”的值,只是添加,值之間用英文分號隔開。
◆導(dǎo)入包import
建立包的目的是有效的管理類,在其他文件中可以方便的使用包中的類,這就需要導(dǎo)入包,格式如下:import包名.*;或import包名.類名;第一種方式導(dǎo)入包中的所有類,第二中方法導(dǎo)入包中的一個特定類。例如:importeva.*;importeva.example.TA;第一條語句導(dǎo)入eva包的全部類,第二條語句導(dǎo)入eva.example包中的TA類?!鬴inal方法
【例5.3】定義包后,通過import導(dǎo)入包。//TA.java文件單獨保存在eva目錄下packageeva;publicclassTA{publicvoidshow(){System.out.println("showinTA");}}//TB.java文件單獨保存在eva目錄下packageeva;publicclassTB{publicvoidshow(){System.out.println("showinTB");}}//Ex.java文件,設(shè)置環(huán)境變量ClassPath后保存在任何目錄均可importeva.*; //導(dǎo)入eva包中的所有類publicclassEx{ publicstaticvoidmain(String[]args) { TAa=newTA(); a.show(); TBb=newTB(); b.show(); }}本程序的運行結(jié)果是:showinTAshowinTB◆包中的訪問權(quán)限
private默認protectedpublic同一個類中成員可訪問可訪問可訪問可訪問同包的子類成員不可訪問可訪問可訪問可訪問同包的非子類成員不可訪問可訪問可訪問可訪問不同包的子類成員不可訪問不可訪問可訪問可訪問不同包的非子類成員不可訪問不可訪問不可訪問可訪問◆static導(dǎo)入
在通過import關(guān)鍵字導(dǎo)入包的時候可以加上static修飾符,那么可導(dǎo)入包中的靜態(tài)變量和靜態(tài)方法,并且調(diào)用靜態(tài)變量和靜態(tài)方法的時候不需要類的點運算符操作,格式如下:importstatic包名.類名.*;importstatic包名.類名.成員變量;importstatic包名.類名.成員方法;例如:importstaticjava.lang.System.*;那么可以直接使用System類的靜態(tài)方法和靜態(tài)變量,例如:out.println("hello");這行代碼相當于System.out.println("hello");【例5.4】靜態(tài)導(dǎo)入自定義包。//TA.java文件packageeva;publicclassTA{publicstaticintcount=100;//定義靜態(tài)變量count publicstaticvoidshow()//定義靜態(tài)方法 { System.out.println(count+"showinTA"); }}
//Ex.java文件importstaticeva.TA.*;publicclassEx{ publicstaticvoidmain(String[]args) { show(); }}本程序的運行結(jié)果是:100showinTA【
5.2接口
】接口是一系列方法的聲明,是一些方法特征的集合,一個接口只有方法的參數(shù)和返回值類型而沒有方法的具體實現(xiàn),也就是說接口不負責(zé)任何具體實現(xiàn),因此這些方法可以在不同的地方被不同的類實現(xiàn),而這些實現(xiàn)可以具有不同的功能。
Java語言不支持多繼承,即不允許一個類有多個直接的超類,但可以實現(xiàn)多個接口,間接的實現(xiàn)了多繼承?!舳x接口
interface接口名{ 常量定義; 方法聲明;}
接口定義中只包含常量定義和方法聲明兩個局部。在接口中,所有的方法都是publicabstract方法。在接口中,所有的量都是publicstaticfinal常量。在接口中,不存在構(gòu)造方法,更不能用new關(guān)鍵字實例化一個接口,接口從本質(zhì)上說是一種特殊的抽象類,抽象類當然不能實例化。在接口中,不可以出現(xiàn)main()主方法。接口與接口間可以通過extends關(guān)鍵字實現(xiàn)繼承或多繼承。interfaceA{intCOUNT=1;voidshow();}◆實現(xiàn)接口
實現(xiàn)接口的格式:類名extends超類名implements接口名列表{ 類體;}通過關(guān)鍵字“implements〞實現(xiàn)這個接口,不僅要在類定義中定義自己特有的成員變量和成員方法,還要實現(xiàn)接口中聲明的方法。一個類可以實現(xiàn)多個接口(接口之間用逗號分隔)。類如果沒有實現(xiàn)接口中的全部方法,那么這個類是抽象類,必須顯示用關(guān)鍵字abstract修飾,因為包含抽象方法的類一定是抽象類。類在實現(xiàn)接口的方法時必須加上關(guān)鍵字public修飾方法?!纠?.5】第一個接口Check。interfaceCheck{voidshow();}classTeacherimplementsCheck{ publicvoidshow() //必須用public修飾show方法 { System.out.println("carethegradeofchild"); } }classParentsimplementsCheck{ publicvoidshow() //必須用public修飾show方法 { System.out.println("carethehealthofchild"); }}classEx{ publicstaticvoidmain(Stringargs[]) { Teachert=newTeacher(); t.show(); Parentsp=newParents(); p.show(); }}本程序的運行結(jié)果是:carethegradeofchildcarethehealthofchild【例5.6】沒有完全實現(xiàn)接口中方法的類,依舊是抽象類。interfaceCheck{voidshow();voidupgrade();}abstractclassTeacherimplementsCheck{ intgrade; publicvoidshow() { System.out.println("carethegradeofchild"); } }Teacher類是抽象類,需要關(guān)鍵字abstract修飾,Teacher類定義了自己的成員變量grade?!纠?.7】接口中常量的使用。interfaceCheck{ intLAB=20; //接口中的常量 intMIDTERMTEST=30; intFINAL=50;voidshow();}classStudentimplementsCheck{ intlab; intmid; intfin; floatgrade; Student(inta,intb,intv) { lab=a; mid=b; fin=v; grade=(LAB*lab+MIDTERMTEST*mid+FINAL*fin)/100; } publicvoidshow() { System.out.println("Grade="+grade); } }classEx{ publicstaticvoidmain(Stringargs[]) { Students=newStudent(80,75,70); s.show(); }}本程序的運行結(jié)果是:Grade=73.0◆接口回調(diào)
接口可以理解成一種數(shù)據(jù)類型,當聲明一個變量是接口類型時,我們知道接口不可以實例化,那如果為之賦值呢?正確的方法是把完全實現(xiàn)接口的類的實例化對象賦值給這個變量。當采取上述方法賦值、調(diào)用方法時,方法會在運行時動態(tài)的調(diào)用具體的被重寫的方法。【例5.9】接口回調(diào)的使用。interfaceCheck{voidshow();}//Teacher類實現(xiàn)Check接口classTeacherimplementsCheck{ publicvoidshow() { System.out.println("carethegradeofchild"); } }//Parents類實現(xiàn)Check接口classParentsimplementsCheck{ publicvoidshow() { System.out.println("carethehealthofchild"); }}
classEx{ publicstaticvoidmain(Stringargs[]) { Checkc=newTeacher();//接口回調(diào) c.show(); c=newParents();//接口回調(diào) c.show(); }}本程序的運行結(jié)果是:carethegradeofchildcarethehealthofchild◆接口做參數(shù)
接口不可以實例化,但是接口可以通過接口回調(diào)的方法賦值,也就是可以用實現(xiàn)接口的類對象賦值。參數(shù)可以是任何一種數(shù)據(jù)類型。接口既然可以理解為一種新的數(shù)據(jù)類型,就可以作為參數(shù)傳遞?!纠?.10】接口作為參數(shù)使用。interfaceCheck{voidshow();}classGetCheck{ voidshowCheck(Checkc)//接口c作為showCheck方法的參數(shù) { c.show(); }}//Teacher類實現(xiàn)Check接口classTeacherimplementsCheck{ publicvoidshow()//實現(xiàn)Check接口的show()方法 { System.out.println("carethegradeofchild"); } }//Parents類實現(xiàn)Check接口classParentsimplementsCheck{ publicvoidshow()實現(xiàn)Check接口的show()方法 { System.out.println("carethehealthofchild"); }}
classEx{ publicstaticvoidmain(Stringargs[]) { GetCheckg=newGetCheck(); Checkc=new Teacher();//接口回調(diào) g.showCheck(c);//接口作參數(shù) c=newParents();//接口回調(diào) g.showCheck(c);//接口作參數(shù) }}本程序的運行結(jié)果是:carethegradeofchildcarethehealthofchild◆繼承接口
【例5.11】SubCheck接口繼承了接口Check。//父接口CheckinterfaceCheck{intFLAG=1;voidshow();}//子接口SubCheck繼承于Check接口interfaceSubCheckextendsCheck{ voidgo();}classSubCheckClassimplementsSubCheck{publicvoidshow()//實現(xiàn)父接口Check的方法{ System.out.println("show()inSubCheckClass");}publicvoidgo()//實現(xiàn)子接口SubCheck的方法{ System.out.println("go()inSubCheckClass");}}publicclassEx{publicstaticvoidmain(String[]args){Checks=newSubCheckClass();s.show();}}本程序的運行結(jié)果是:show()inSubCheckClass【例5.12】使用接口實現(xiàn)多繼承。//父接口Check1interfaceCheck1{ intFLAG=1; voidshow();}//父接口Check2interfaceCheck2{ intFLAG=2; voidshow();}//子接口SubCheck繼承于Check1接口和Check2接口interfaceSubCheckextendsCheck1,Check2{ //空接口}//SubCheckClass類實現(xiàn)子接口SubCheckclassSubCheckClassimplementsSubCheck{publicvoidshow(){ System.out.println("FLAGinCheck1:"+Check1.FLAG); System.out.println("FLAGinCheck2:"+Check2.FLAG); System.out.println("show()inSubCheckClass");}}publicclassEx{publicstaticvoidmain(String[]args){SubCheckClasss=newSubCheckClass();s.show();}}本程序的運行結(jié)果是:FLAGinCheck1:1FLAGinCheck2:2show()inSubCheckClass◆接口與抽象類的比較
接口和抽象類的共同特點是都可以有抽象方法,二者的不同點是:接口中只有靜態(tài)的常量,抽象類中還可以有成員變量。接口中只能有抽象方法,抽象類中還可以有非抽象方法。接口支持多繼承,抽象類不支持多繼承?!?/p>
5.3本章小結(jié)
】包是Java中有效管理類的方法。使用package關(guān)鍵字定義包,使用import關(guān)鍵字導(dǎo)入包。importstatic可導(dǎo)入包中的靜態(tài)變量和靜態(tài)方法,方便使用。
接口是Java中有效標準類的方法,它可以防止類在設(shè)計上的不一致。接口是一系列方法的聲明,是一些方法特征的集合,只有方法的參數(shù)和返回值類型而沒有方法的具體實現(xiàn)。Java語言不支持多繼承,但可以實現(xiàn)多個接口,間接的實現(xiàn)了多繼承。
接口回調(diào)是指把實現(xiàn)接口的子類的實例化對象賦值給聲明的接口變量。
接口和抽象類的共同特點是都可以有抽象方法,二者有三個不同點。6.1異常格式6.2異常類
6.3多個catch塊6.4throw關(guān)鍵字6.5throws關(guān)鍵字6.6finally關(guān)鍵字6.7自定義異常類6.8本章小結(jié)第6章
異常處理
異常(Exception)是指在硬件和操作系統(tǒng)正常時,程序在運行時遇到的非正常情況。例如:除零操作、數(shù)組越界操作、打開一個不存在的文件、網(wǎng)絡(luò)中斷等。
【
6.1異常格式
】異常處理語句有五個關(guān)鍵字try、catch、finally、throw和throws。try{語句塊;
}catch(異常類型1異常對象1){異常處理語句塊1;
}catch(異常類型2異常對象2){異常處理語句塊2;
}...finally{異常處理結(jié)束前的語句塊;
}說明:try塊中包含的是可能出現(xiàn)異常的代碼,這樣做的目的是處理某種指定的異常代碼,只需編寫一次。try塊中的語句塊只要發(fā)生異常就立刻拋出異常對象,然后被相應(yīng)的catch塊接住,也就是說try塊中發(fā)生異常后,異常后面的代碼不會執(zhí)行。在try塊內(nèi)定義的變量是局部變量,在catch或者finally塊內(nèi)都是無法訪問到的,并且在整個異常處理語句之外也是不可見的。catch塊的條件局部是異常對象,catch塊中是出現(xiàn)異常后的處理語句。無論是否發(fā)生異常,finally塊中的語句都執(zhí)行,它提供了統(tǒng)一的出口。通常在finally塊中可以進行資源的去除工作,如關(guān)閉翻開的文件等?!纠?.1】未包含異常處理的程序。publicclassEx{ publicstaticvoidmain(String[]args) { inta=Integer.parseInt(args[0]); intb=Integer.parseInt(args[1]); System.out.println(a/b); System.out.println("繼續(xù)運行其他代碼"); }}本程序的運行結(jié)果是:Exceptioninthread"main"java.lang.ArithmeticException:/byzeroatEx.main(Ex.java:35)
【例6.2】包含異常處理的程序。publicclassEx{ publicstaticvoidmain(String[]args) { inta=Integer.parseInt(args[0]); intb=Integer.parseInt(args[1]); try { System.out.println(a/b); } catch(ArithmeticExceptione) { System.out.println("捕獲算術(shù)異常"); } finally { System.out.println("繼續(xù)運行其他代碼"); } } }如果使用命令行編譯運行程序,則輸入如下命令:F:\Liu>javac
Ex.javaF:\Liu>javaEx63則輸出的結(jié)果是:2繼續(xù)運行其他代碼F:\Liu>javaEx60則輸出的結(jié)果是:捕獲算術(shù)異常繼續(xù)運行其他代碼
如果運行時輸入的數(shù)據(jù)是:63程序運行結(jié)果是:2繼續(xù)運行其他代碼如果運行時輸入的數(shù)據(jù)是:60程序運行結(jié)果是:捕獲算術(shù)異常繼續(xù)運行其他代碼【
6.2異常類
】異常類是Java系統(tǒng)提供類,“ArithmeticException〞類的層次結(jié)構(gòu):
【
6.3多個catch塊
】【例6.3】包含多個catch塊的異常處理。publicclassEx{ publicstaticvoidmain(String[]args) { try { inta=Integer.parseInt(args[0]); intb=Integer.parseInt(args[1]); System.out.println(a/b); } catch(NumberFormatExceptione) { System.out.println("數(shù)據(jù)轉(zhuǎn)換異常"); } catch(ArithmeticExceptione) { System.out.println("捕獲算術(shù)異常"); } finally { System.out.println("繼續(xù)運行其他代碼"); } } }如果運行時輸入的數(shù)據(jù)是:eva2程序運行結(jié)果是:數(shù)據(jù)轉(zhuǎn)換異常繼續(xù)運行其他代碼如果運行時輸入的數(shù)據(jù)是:63程序運行結(jié)果是:2繼續(xù)運行其他代碼如果運行時輸入的數(shù)據(jù)是:60程序運行結(jié)果是:捕獲算術(shù)異常繼續(xù)運行其他代碼【
6.4throw關(guān)鍵字
】throw關(guān)鍵字通常用在方法體中,功能是拋出一個異常對象。程序在執(zhí)行到throw語句時流程就轉(zhuǎn)到相匹配的異常處理語句,它后面的語句都不執(zhí)行,所以throw語句后面不能有其他語句存在,否那么編譯出錯。【例6.4】throw關(guān)鍵字的使用。publicclassEx{ publicstaticvoidTest() { try { inta[]=newint[10]; a[10]=0;//下標越界 } catch(ArrayIndexOutOfBoundsExceptione) { System.out.println("下標越界在Test()中"); throwe; //System.out.println("產(chǎn)生異常后!"); //此行若不注釋將產(chǎn)生編譯錯誤 } }
publicstaticvoidmain(Stringargs[]) { try { Test(); } catch(ArrayIndexOutOfBoundsExceptione) { System.out.println("下標越界在main()中"); }finally{ System.out.println("在finally中");} }}本程序的運行結(jié)果是:下標越界在Test()中下標越界在main()中在finally中【
6.5throws關(guān)鍵字
】throws關(guān)鍵字常常出現(xiàn)在方法的參數(shù)列表后,方法的具體定義前〔即花括號前〕,其格式如下:返回值類型方法名(參數(shù)列表)throws異常類{}【例6.5】throws的使用。publicclassEx{ publicstaticvoidTest(Stringx,Stringy)throwsNumberFormatException,ArithmeticException
{ inta=Integer.parseInt(x); intb=Integer.parseInt(y); System.out.println(a/b); } publicstaticvoidmain(String[]args) { try { Test(args[0],args[1]); } catch(NumberFormatExceptione) { System.out.println("數(shù)據(jù)轉(zhuǎn)換異常"); } catch(ArithmeticExceptione) { System.out.println("捕獲算術(shù)異常"); } finally { System.out.println("繼續(xù)運行其他代碼"); } } }【
6.6finally關(guān)鍵字
】無論是否拋出異常,finally塊封裝的語句總能夠在try塊之后的某點執(zhí)行?!纠?.6】finally的使用。publicclassEx{publicstaticvoidmain(String[]args){System.out.println(test());}publicstaticbooleantest(){booleanb=false;try{returnb=5>3;}finally{System.out.println(b);}}
}本程序的運行結(jié)果是:TrueTrue【6.7自定義異常類
】創(chuàng)立Exception類或者RuntimeException類的子類即可得到一個自定義的異常類。例如:publicclassMyExceptionextendsException{ publicMyException(Stringsmg) { super(smg); }}無論是否拋出異常,finally塊封裝的語句總能夠在try塊之后的某點執(zhí)行。Exception類的構(gòu)造方法,它有如下四種:1.Exception()構(gòu)造詳細消息為null的新異常。2.Exception(String
message)構(gòu)造帶指定詳細消息message的新異常。3.Exception(String
message,Throwable
cause)構(gòu)造帶指定詳細消息message和原因cause的新異常。4.Exception(Throwable
cause)根據(jù)指定的原因和(cause==null?null:cause.toString())的詳細消息構(gòu)造新異?!菜ǔ0琧ause的類和詳細消息〕。【例6.7】使用try-catch-finally的異常處理機制。publicclassEx{ publicstaticvoidmain(String[]args) { inta=Integer.parseInt(args[0]); intb=Integer.parseInt(args[1]); try { System.out.println(a/b); } catch(Exceptione) { System.out.println("異常消息字符串:"+e.getMessage()); System.out.println("異常所屬類:"+e.getClass()); } finally { System.out.println("繼續(xù)運行其他代碼"); } } }如果運行時輸入的數(shù)據(jù)是:60本程序的運行結(jié)果是:異常消息字符串:/byzero異常所屬類:classjava.lang.ArithmeticException繼續(xù)運行其他代碼【例6.8】使用自定義異常類完成【例6.7】。//自定義異常類MyExceptionclassMyExceptionextendsException{ MyException(intm) { System.out.print("成績"+m+"不在0~100之間\n"); } }classStudent{ intmark; Student(intm)throwsMyException { mark=m; if(mark<0||mark>100) { mark=0; thrownewMyException(m);//拋出異常 } else mark=m; }}publicclassEx{ publicstaticvoidmain(String[]args) { try { Studentwang=newStudent(82); } catch(MyExceptione){} try { Studentli=newStudent(120); } catch(MyExceptione){} try { Studentzhang=newStudent(-83); } catch(MyExceptione){} } }如果運行時輸入的數(shù)據(jù)是:成績120不在0~100之間成績-83不在0~100之間【
6.8本章小結(jié)
】異常(Exception)是指在硬件和操作系統(tǒng)正常時,程序在運行時遇到的非正常情況。異常與錯誤是不同的。異常處理作為程序開發(fā)的一個重要內(nèi)容,它的優(yōu)劣關(guān)系到程序的健壯性和穩(wěn)定性。
異常處理語句包含五個關(guān)鍵字try、catch、finally、throw和thorws。
創(chuàng)建Exception類或者RuntimeException類的子類即可得到一個自定義的異常類。7.1Object類7.2根本數(shù)據(jù)類型的類包裝7.3Math類7.4String類7.5本章小結(jié)第7章
Java.lang包
Java.lang包提供了利用Java編程語言進行程序設(shè)計的基礎(chǔ)類。這些基礎(chǔ)類有幾十個,本章主要介紹的是基本數(shù)據(jù)類型的類包裝、Object類、Math類和String類?!?/p>
7.1Object類
】Object類是一種特殊類,Java中所有的類包括用戶自定義的類都默認繼承該類,或者說Object類是Java所有類的超類,Object類定義在Object.java文件中,屬于java.lang包。Object類定義了很多成員方法,其中主要的兩個成員方法是equals()和toString()。因為Object類是Java中所有類的超類,所以Java中所有類,包括用戶自定義的類都繼承了上述兩個方法,這兩個方法的格式如下:booleanequals(Objectobject);StringtoString();equals()方法判斷兩個對象是否完全相同,注意equals()方法判斷相同的情況是兩個對象指向同一塊內(nèi)存。toString()方法返回該對象的字符串表示。通常,toString()方法會返回一個“以文本方式〞表示此對象的字符串,該字符串由類名、標記符“@〞和此對象哈希碼的無符號十六進制表示組成。【例7.1】自定義類使用equals()方法和toString()方法。classA{}publicclassEx{ publicstaticvoidmain(Stringargs[]) { Aa1=newA(); Aa2=newA(); System.out.println(a1.equals(a2)); System.out.println(a1.toString()); }}本程序的運行結(jié)果是:falseA@de6ced【7.2根本數(shù)據(jù)類型的類包裝】Java根本數(shù)據(jù)類型有四種,分別是整型、浮點型、布爾型和字符型,細分共8種:byte、short、int、long、float、double、boolean、char。Java.lang包提供了相應(yīng)的8種類,分別是Byte、Short、Integer、Long、Float、Double、Boolean、Character與上述8種根本數(shù)據(jù)類型相對應(yīng),對應(yīng)的類將根本類型的值包裝在一個對象中?!袈暶鲃?chuàng)建類包裝的對象
例如:Byteb1=newByte((byte)12);Byteb2=newByte("12");Integeri1=newInteger(123);Integeri2=newInteger("45");Doubled=newDouble(1000.00);◆常見方法
1.compareTo()方法格式:publicintcompareTo(XXXa)例如,對Integer類而言其compareTo()方法的格式是:publicintcompareTo(Integera)功能:在數(shù)字上比較兩個Integer對象,如果該Integer在數(shù)值上等于Integer參數(shù),那么返回0值;如果該Integer在數(shù)值上小于Integer參數(shù),那么返回“-1〞;如果Integer在數(shù)值上大于Integer參數(shù),那么返回“1〞。2.equals()方法格式:publicbooleanequals(Objectobj)功能:將此對象與指定對象進行比較。當且僅當參數(shù)不是null而是XXX對象,且表示的YYY值與此對象表示的YYY值相同時,結(jié)果為“true〞?!纠?.2】Double類使用equals()方法和compareTo()方法。publicclassEx{ publicstaticvoidmain(Stringargs[]) { Doublea=newDouble(5); Doubleb=newDouble(5); Doublec=newDouble(-15); System.out.println(a.equals(b)); System.out.println(a==b); System.out.println(apareTo(c)); }}本程序的運行結(jié)果是:truefalse13.toString()方法格式:publicStringtoString()功能:返回調(diào)用此方法的類對象的String對象。格式:publicstaticStringtoString(YYYs)功能:返回表示指定YYY數(shù)據(jù)類型的一個新String對象,其中YYY表示8種基本數(shù)據(jù)類型?!纠?.3】Integer類使用toString()方法。publicclassEx{ publicstaticvoidmain(Stringargs[]) { Integeri=newInteger(5); System.out.println(i.toString()); System.out.println(Integer.toString(123)); }}本程序的運行結(jié)果是:51234.valueOf()方法格式:publicstaticXXXvalueOf(YYYb)publicstaticXXXvalueOf(Strings)publicstaticXXXvalueOf(Strings,intradix)功能:雖然方法的參數(shù)類型和個數(shù)不同,但通過valueOf()方法可以返回一個類的實例,即返回一個類對象。
【例7.4】Long類使用valueOf()方法。publicclassEx{ publicstaticvoidmain(Stringargs[]) { Longa=newLong(5); System.out.println(a); a=Long.valueOf(15); System.out.println(a); a=Long.valueOf("123",8); System.out.println(a); a=Long.valueOf("123"); System.out.println(a); }}本程序的運行結(jié)果是:515831235.parseXXX()方法例如:publicstaticintparseInt(Strings)將字符串參數(shù)作為有符號的十進制整數(shù)進行解析。publicstaticintparseInt(Strings,intradix)將字符串參數(shù)解析為有符號的radix進制整數(shù)。publicstaticintparseLong(Strings)將字符串參數(shù)作為有符號的十進制長整數(shù)進行解析。publicstaticintparseBoolean(Strings)將字符串參數(shù)解析為布爾值。【例7.5】String類使用parseInt()方法publicclassEx{ publicstaticvoidmain(Stringargs[]) { Stringa="123"; intb=Integer.parseInt(a); System.out.println(b); }}本程序的運行結(jié)果是:123◆
Char類特有的常見方法
1.publicstaticbooleanisDigit(charch)確定指定字符是否為數(shù)字。2.publicstaticbooleanisDigit(intcodePoint)確定指定字符〔Unicode代碼點〕是否為數(shù)字。3.publicstaticbooleanisLetter(charch)確定指定字符是否為字母。4.staticbooleanisLetter(intcodePoint)確定指定字符〔Unicode代碼點〕是否為字母。5.staticBooleanisLetterOrDigit(charch)確定指定字符是否為字母或數(shù)字。6.publicstaticbooleanisLetterOrDigit(intcodePoint)確定指定字符〔Unicode代碼點〕是否為字母或數(shù)字。7.publicstaticBooleanisLowerCase(charch)確定指定字符是否為小寫字母。8.publicstaticBooleanisLowerCase(intcodePoint)確定指定字符〔Unicode代碼點〕是否為小寫字母?!鬋har類特有的常見方法
9.publicstaticBooleanisSpaceChar(charch)確定指定字符是否為Unicode空白字符。10.publicstaticBooleanisUpperCase(charch)確定指定字符是否為大寫字母。11.publicstaticBooleanisUpperCase(intcodePoint)確定指定字符〔Unicode代碼點〕是否為大寫字母。12.publicstaticchartoLowerCase(charch)將字符參數(shù)轉(zhuǎn)換為小寫。13.publicstaticinttoLowerCase(intcodePoint)將字符〔Unicode代碼點〕參數(shù)轉(zhuǎn)換為小寫。14.publicstaticchartoUpperCase(charch)將字符參數(shù)轉(zhuǎn)換為大寫。15.publicstaticinttoUpperCase(intcodePoint)將字符〔Unicode代碼點〕參數(shù)轉(zhuǎn)換為大寫?!纠?.6】Char類常用方法的使用。publicclassEx{publicstaticvoidmain(Stringargs[]){ System.out.println("確定指定字符是否為數(shù)字:"); System.out.println(Character.isDigit('1')); System.out.println(Character.isDigit('b')); System.out.println(Character.isDigit(97)); System.out.println(Character.isDigit(48)); System.out.println("確定指定字符是否為字母:"); System.out.println(Character.isLetter('1')); System.out.println(Character.isLetter('b')); System.out.println(Character.isLetter(97)); System.out.println(Character.isLetter(48)); System.out.println("確定指定字符是否為字母或數(shù)字:"); System.out.println(Character.isLetterOrDigit('1')); System.out.println(Character.isLetterOrDigit(97)); System.out.println(Character.isLetterOrDigit('*')); System.out.println("確定指定字符是否為小寫字母:"); System.out.println(Character.isLowerCase(97)); System.out.println(Character.isLowerCase(65)); System.out.println(Character.isLowerCase('a')); System.out.println("確定指定字符是否為Unicode空白字符:"); System.out.println(Character.isSpaceChar('A')); System.out.println(Character.isSpaceChar('')); System.out.println("確定指定字符是否為大寫字母:"); System.out.println(Character.isLowerCase(97)); System.out.println(Character.isLowerCase(65)); System.out.println(Character.isL
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 企業(yè)贊助合同范本
- 會展活動合同范本及使用指南
- FOB貿(mào)易合同履行地點合同
- 二手車買賣廣告合同書
- 臨時工勞動合同醫(yī)療護理
- 樂器行業(yè)勞動合同模板
- 人力資源公司租賃協(xié)議草稿
- 3D打印個人機械租賃協(xié)議書
- 人力資源專員簡化版勞動合同
- 付款協(xié)議書推動社會事業(yè)發(fā)展
- 績效考核及薪酬機制和執(zhí)行情況審計報告模板
- 組分模型與pvti模塊擬合
- 黑色素瘤診斷與治療演示課件(PPT 38頁)
- 高中數(shù)學(xué)奧賽輔導(dǎo):第四講不定方程
- 02 明渠均勻流斷面尺寸設(shè)計
- 第八講 matlab simulink基礎(chǔ).
- 創(chuàng)傷急救周圍血管損傷
- 通力電梯KCE電氣系統(tǒng)學(xué)習(xí)指南
- 電子商務(wù)師_4級_理論知識題庫-判斷題-全部判斷題
- 苗木材料報審及進場清單
- 腎移植術(shù)的解剖(1)
評論
0/150
提交評論