第15次 第4章 抽象類、接口、包+第5章 異常處理_第1頁(yè)
第15次 第4章 抽象類、接口、包+第5章 異常處理_第2頁(yè)
第15次 第4章 抽象類、接口、包+第5章 異常處理_第3頁(yè)
第15次 第4章 抽象類、接口、包+第5章 異常處理_第4頁(yè)
第15次 第4章 抽象類、接口、包+第5章 異常處理_第5頁(yè)
已閱讀5頁(yè),還剩57頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

接口是特殊的抽象類,它側(cè)重于描述概念的所具備的功能和具體屬性(成員變量為常量),但不實(shí)現(xiàn)。接口的使用分為3個(gè)步驟:定義接口實(shí)現(xiàn)接口使用接口14.6接口定義接口的基本格式為:[public]interface

interfacename{

常量聲明;

抽象方法聲明;}接口的訪問(wèn)屬性或者為”public”或者”缺省”;定義接口的關(guān)鍵字是interface而不是class;常量必須為publicstaticfinal,在接口中可以省略;成員方法必須是抽象方法,在接口中也可以省略publicabstract。接口具有繼承性,可通過(guò)extends關(guān)鍵字聲明父接口,但不能被實(shí)例化。24.6接口的定義3接口舉例2:

Comparable接口publicinterfaceComparable

{//比較兩個(gè)對(duì)象大小

intcompareTo(ObjectotherObject); }compareTo的含義:將調(diào)用這個(gè)方法的對(duì)象與參數(shù)帶入的對(duì)象otherObject進(jìn)行比較,如果前者小,返回-1;如果相等返回0;否則,返回1。4實(shí)現(xiàn)接口是指,構(gòu)造一個(gè)類,并在該類中覆蓋接口中的所有方法,。4.6.2接口的實(shí)現(xiàn)Comparable接口的實(shí)現(xiàn)5以職工類(Employee)實(shí)現(xiàn)Comparable接口為例EmployeeprivateStringname;privatedoublesalary;privateStringdepartment;//成員變量的更改器//成員變量的獲取器publicStringtoString()publicintcompareTo(ObjectotherObject)Employee實(shí)現(xiàn)Comparable接口publicclassEmployeeimplements

Comparable{ privateStringname; //姓名

privatedoublesalary; //工資

privateStringdepartment; //部門(mén)

……

//構(gòu)造方法

…… //其他成員方法

publicintcompareTo(ObjectotherObject)

{……}}6compareTo方法的實(shí)現(xiàn)publicintcompareTo(ObjectotherObject)

{ //定義3個(gè)可能的返回值的所滿足的條件

Employeeother=(Employee)otherObject;if(salary<other.salary)return-1;//比較工資多少

if(salary==other.salary)return0;elsereturn1;}}78Comparable接口的使用Employeee1=newEmployee("Wang",4000.0,"Software");Employeee2=newEmployee("Sun",3000.0,"Math");switch(pareTo(e2)){case-1:System.out.println("<");break;case0:System.out.println("==");break;case1:System.out.println(">");break;}運(yùn)行的結(jié)果是?練習(xí)下面的程序輸出的結(jié)果是()interfaceB{intk=10;}publicclassAimplementsB{

publicstaticvoidmain(Stringargs[]){

inti;

Ac1=newA();

i=c1.k;

System.out.println("i="+i);}}A)i=0

B)i=10C)程序有編譯錯(cuò)誤D)i=true補(bǔ)充:

接口的繼承關(guān)系

1.接口的單繼承2.接口的多重繼承1.接口的單繼承。interfaceA{voidF1();}interfaceBextendsA{voidF2();}說(shuō)明:接口B將繼承接口A中的所有變量和方法,這種接口之間的繼承稱為單繼承。接口之間的繼承與類的繼承一樣使用關(guān)鍵字extends。2.接口的多重繼承在Java語(yǔ)言中,不支持類的多重繼承。但是支持接口的多重繼承,其語(yǔ)法格式如下:

interface接口名extends接口名1,接口名2,…抽象類與接口的比較13抽象類接口共同點(diǎn)二者都可具有抽象方法,都不能實(shí)例化,但都可以有自己的聲明,并能引用子類或?qū)崿F(xiàn)類對(duì)象。不同點(diǎn)屬性變量可以有變量不能有,只能是靜態(tài)常量。成員方法可以有具體方法(而且具體方法可以調(diào)用抽象方法)。如果有方法,則全部是抽象方法。實(shí)現(xiàn)策略必須有子類繼承必須有實(shí)現(xiàn)類實(shí)現(xiàn)擴(kuò)展性弱強(qiáng)課堂練習(xí)1.關(guān)于接口的聲明和實(shí)現(xiàn),以下描述正確的是

。A.接口聲明的方法只有聲明沒(méi)有實(shí)現(xiàn)

B.接口聲明中的變量都必須寫(xiě)明final和staticC.如果一個(gè)接口由多個(gè)類來(lái)實(shí)現(xiàn),則這些類在實(shí)現(xiàn)該接口中的方法時(shí)采用統(tǒng)一的代碼D.如果一個(gè)類實(shí)現(xiàn)接口,則必須實(shí)現(xiàn)該接口中的所有方法,但方法未必申明為public14課堂練習(xí)2.下列有關(guān)抽象類與接口的敘述中正確的是哪一個(gè)

。A.抽象類中不可以有非抽象方法,接口中也必須有抽象方法B.抽象類中可以有非抽象方法,接口中也可以有非抽象方法C.接口中的方法必須是抽象方法D.抽象類中的變量定義時(shí)必須初始化,而接口中不是15課堂練習(xí)3.下面程序運(yùn)行的結(jié)果是

。interfaceInterfaceA{ Strings="good"; voidf(); }classClassAimplementsInterfaceA{ publicvoidf(){ System.out.print(s); }}

classClassB{ voidg(InterfaceAa){ a.f(); } }publicclassE{ publicstaticvoidmain(String[]args){ ClassBb=newClassB(); b.g(newClassA()); }}A.good B.編譯正確,但無(wú)運(yùn)行結(jié)果C.編譯錯(cuò)誤:b.g(newClassA()) D.以上都不對(duì)1617接口是一種特殊形式的抽象類,它主要用來(lái)組織公用的常量,并統(tǒng)一操作行為的格式,通常它被應(yīng)用在三個(gè)主要方面:用接口包裝常量??梢詫⒏魇礁鳂拥某A糠旁诮涌谥?,讓每個(gè)使用這些常量的類對(duì)象實(shí)現(xiàn)這個(gè)接口,從而達(dá)到享有這些常量的目的為操作同類事物提供統(tǒng)一接口。接口是為了解決Java語(yǔ)言中不支持類的多重繼承的問(wèn)題。接口的主要應(yīng)用184.7包包是類和接口的集合。從資源管理的角度,可以將“包”理解為文件夾(目錄)。將所有的類和接口按功能分別放置在不同的包中主要有兩點(diǎn)好處:一是便于將若干個(gè)已存在的類或接口整體地添加到程序代碼中;二是避免出現(xiàn)類名沖突的現(xiàn)象。19創(chuàng)建一個(gè)包就是用包的名稱在文件系統(tǒng)下創(chuàng)建一個(gè)目錄。在創(chuàng)建的目錄下,既可以存放類文件或接口文件,也可以包含子目錄,這些子目錄是該包中的子包。創(chuàng)建一個(gè)包且將類文件放入其中的語(yǔ)法格式為:

packagepackageName;//

packageName是包名在NetBeans中,如果將類文件放入默認(rèn)包,則沒(méi)有包語(yǔ)句;如果將類文件放入指定的包中,類文件中會(huì)自動(dòng)生成包語(yǔ)句。4.7.1創(chuàng)建包20對(duì)于在包中具有public訪問(wèn)屬性的類或接口,可以通過(guò)導(dǎo)入語(yǔ)句(import)將其添加到程序代碼中。導(dǎo)入語(yǔ)句的基本格式為import后跟包名序列及類名。

importuserPackage.*;userPackage是包名,.*代表將包中的所有類和接口都加載進(jìn)來(lái)。

importuserPackage1.userPackage2.userPackage3.*;這條語(yǔ)句表示將userPackage1包中的子包userPackage2的子包userPackage3中的所有類和接口加載進(jìn)來(lái)。4.7.2加載包引用不同包中的類21課堂測(cè)試編寫(xiě)一個(gè)學(xué)生類,其中包含:姓名、年齡和學(xué)位,構(gòu)造方法及其輸出學(xué)生信息抽象的方法;編寫(xiě)一個(gè)本科生類,在學(xué)生類的基礎(chǔ)上增加“專業(yè)”,另編寫(xiě)構(gòu)造方法、輸出本科生信息的方法;編寫(xiě)一個(gè)研究生類,在學(xué)生類的基礎(chǔ)上增加“研究方向”,另編寫(xiě)構(gòu)造方法、輸出研究生信息的方法。編寫(xiě)測(cè)試類,分別創(chuàng)建一個(gè)本科生和研究生對(duì)象,然后調(diào)用相關(guān)方法輸出所有信息。224.8應(yīng)用舉例設(shè)計(jì)二人游戲二人游戲:由兩名選手參與的游戲。比如:象棋、跳棋和五子棋等分析:兩人游戲中有哪些共同的數(shù)據(jù)和操作。數(shù)據(jù):應(yīng)包含標(biāo)識(shí)兩名選手的常量;記錄下一步應(yīng)該是哪位選手操作的成員變量。23游戲中的操作1.指定從哪位選手開(kāi)始2.返回當(dāng)前操作的選手3.改變當(dāng)前操作的選手4.返回游戲規(guī)則;5.判斷游戲是否結(jié)束;6.返回獲勝選手;7.返回游戲的提示信息8.返回游戲當(dāng)前狀態(tài);9.游戲操作;10.接受用戶輸入;11.報(bào)告游戲當(dāng)前狀態(tài);12.游戲信息提示;24TwoPlayerGame(抽象類)25publicstaticfinalintPLAYER_ONE=1;publicstaticfinalintPLAYER_TWO=2;protectedbooleanonePlaysNext=true;publicvoidsetPlayer(intstarter)//指定從哪位選手開(kāi)始publicintgetPlayer()//返回當(dāng)前操作的選手publicvoidchangePlayer()//改變當(dāng)前操作的選手publicabstractStringgetRules();//返回游戲規(guī)則publicabstractbooleangameOver();//返回游戲是否結(jié)束publicabstractStringgetWinner();

//返回獲勝者

TwoPlayerGamesetPlayerpublicvoidsetPlayer(intstarter)//指定從哪位選手開(kāi)始

{if(starter==PLAYER_TWO){onePlaysNext=false;}else{onePlaysNext=true;}}26getPlayerpublicintgetPlayer()//返回當(dāng)前操作的選手

{if(onePlaysNext==true){returnPLAYER_ONE;}else{returnPLAYER_TWO;}}27changePlayer()publicvoidchangePlayer()//改變當(dāng)前操作的選手

{onePlaysNext=!onePlaysNext;}28Game接口publicinterfaceGame{publicStringgetGamePrompt(); //返回游戲提示

publicStringreportGameState(); //返回游戲當(dāng)前狀態(tài)}29UIPlay接口publicinterfaceUIPlayextendsGame{voidplay(UserInterfaceui);

//控制游戲循環(huán)過(guò)程}30UserInterface接口publicinterfaceUserInterface{StringgetUserInput(); //接收用戶輸入

voidreport(Strings);//報(bào)告游戲當(dāng)前狀態(tài)

voidprompt(Strings); //游戲信息提示}31為什么要設(shè)置接口?Game接口返回游戲提示返回游戲當(dāng)前狀態(tài)UIPlay接口控制游戲循環(huán)過(guò)程UserInterface接口接收用戶輸入報(bào)告游戲當(dāng)前狀態(tài)游戲信息提示32接口中的抽象方法的實(shí)現(xiàn)都與用戶界面相關(guān)(用戶的不同輸入將導(dǎo)致不同的操作結(jié)果)為了將核心操作與用戶界面的實(shí)現(xiàn)分開(kāi),設(shè)置這些接口。一個(gè)具體的二人游戲:拿小棍游戲規(guī)則:游戲中有MAX_STICKS根小棍排成一排。游戲中的兩名選手輪流拿棍,每人一次最多拿MAX_PICKUP根。拿走最后一根者為輸。33OneRowNim類publicclassOneRowNimextendsTwoPlayerGameimplementsUIPlay{publicstaticfinalintMAX_PICKUP=3;//最多拿小棍的根數(shù)

publicstaticfinalintMAX_STICKS=21;//小棍數(shù)

privateintnSticks=MAX_STICKS;//當(dāng)前剩余的棍數(shù)

……34ConsoleInterface類publicclassConsoleInterfaceimplementsUserInterface{publicStringgetUserInput(){…….}publicvoidreport(Strings){……}publicvoidprompt(Strings){……}publicstaticvoidmain(String[]args){ConsoleInterfaceUser=newConsoleInterface();OneRowNimgame=newOneRowNim(21);game.play(User);}}35類、接口之間的關(guān)系36TwoPlayerGame<Interface>Game<Interface>UIPlayOneRowNim<Interface>UserInterfaceConsoleInterface37第5章異常處理38異常:程序運(yùn)行中出現(xiàn)的不正常的現(xiàn)象,使得程序無(wú)法繼續(xù)執(zhí)行,如果不加以處理可能會(huì)造成不必要的損失。影響程序正常運(yùn)行的主要原因來(lái)自三個(gè)方面:(1)用戶輸入錯(cuò)誤。例如:輸入數(shù)據(jù)類型錯(cuò)誤。(2)運(yùn)行程序的系統(tǒng)出現(xiàn)了異常。例如,發(fā)出打印命令,但打印機(jī)處于關(guān)閉狀態(tài);磁盤(pán)已滿等;(3)程序本身存在的問(wèn)題。例如,整數(shù)被0整除;數(shù)組下標(biāo)越界等。5.1.1異常的概念5.2異常處理機(jī)制Java語(yǔ)言將處理異常的代碼從程序中抽取出來(lái),封裝成類,完成以下任務(wù):保存當(dāng)前已完成的結(jié)果。允許用戶安全地退出應(yīng)用程序。通知用戶異常出現(xiàn)的原因,指出發(fā)生哪類異常。追蹤異常出現(xiàn)的位置。3940在Java語(yǔ)言中,對(duì)各種可能出現(xiàn)的異常進(jìn)行了標(biāo)準(zhǔn)化,將它們封裝成了類,我們將統(tǒng)稱為異常類。一旦在程序運(yùn)行過(guò)程中發(fā)生異常,Java虛擬機(jī)就會(huì)自動(dòng)地創(chuàng)建一個(gè)相應(yīng)的異常類對(duì)象,并將該對(duì)象作為參數(shù)拋給處理異常的方法。在這些異常類中,主要包含了有關(guān)異常的屬性信息,跟蹤信息等。5.1.2Java語(yǔ)言中的異常類41Java異常類結(jié)構(gòu)Throwable類是所有異常類的父類。Error類用來(lái)描述Java運(yùn)行系統(tǒng)的內(nèi)部錯(cuò)誤和資源耗盡等致命性錯(cuò)誤。程序代碼錯(cuò)誤導(dǎo)致的異常。有關(guān)輸入輸出的異常。42java.lang的RuntimeException類的異常子類(P159)類名描述ArithmeticExecption如果進(jìn)行非法的算術(shù)運(yùn)算就會(huì)產(chǎn)生這類異常。IndexutOfBoundsException在訪問(wèn)String或Vector對(duì)象的內(nèi)容時(shí),如果出現(xiàn)了下標(biāo)越界將會(huì)產(chǎn)生這類異常。NegativeArraySizeException如果在創(chuàng)建數(shù)組時(shí),將數(shù)組的維數(shù)指定為負(fù)值就會(huì)產(chǎn)生這類異常。NullPointerException試圖訪問(wèn)null對(duì)象或成員方法時(shí)將產(chǎn)生這類異常。ArrayStroeException如果試圖在數(shù)組中存入一個(gè)數(shù)組元素類型不允許的對(duì)象就會(huì)產(chǎn)生這類異常。435.2異常處理機(jī)制Java程序中,處理異常要經(jīng)歷三個(gè)主要階段:拋出異常;捕獲異常;處理異常。44所謂拋出異常是指在程序的運(yùn)行過(guò)程中,一旦發(fā)生了異常,就立即創(chuàng)建一個(gè)與該異常相對(duì)應(yīng)的異常類對(duì)象,將其作為參數(shù)拋給處理該異常的代碼塊。拋出異常分為兩種:隱式聲明拋出(異常)顯式聲明拋出(異常)5.2.1拋出異常參考:袁紹欣等編著的《Java面向?qū)ο蟪绦蛟O(shè)計(jì)(第2版)》隱式聲明拋出異常沒(méi)有進(jìn)行任何聲明和處理,而直接交給Java虛擬機(jī)去處理的異常。45顯式聲明拋出異常舉例46顯式聲明拋出異常說(shuō)明throw關(guān)鍵字用來(lái)告知編譯器此處要發(fā)生一個(gè)異常(拋出一個(gè)異常對(duì)象)。格式:thrownewExceptionClassName(parameterList)

thrownewException("第"+i+"個(gè)元素不存在");throws關(guān)鍵字用來(lái)聲明一個(gè)方法中可能拋出的異常,但不處理。格式:throwsExceptionClassName在成員方法參數(shù)后。

voidf(inti)throwsException說(shuō)明:1.throws可以拋出多個(gè)異常,兩個(gè)間用逗號(hào)隔開(kāi);2.throws所聲明的異常類型應(yīng)與成員方法中拋出的類型一致。47Throws練習(xí)4849在Java程序中,捕獲異常用try-catch-finally語(yǔ)句實(shí)現(xiàn),該語(yǔ)句可以被用來(lái)捕獲一個(gè)或多個(gè)異常,基本語(yǔ)法格式為:try{Javastatements}catch

(ExceptionType1ExceptionObject){

handlerforthisexceptiontype}catch(ExceptionType2ExceptionObject){

handlerforthisexceptiontype}.......5.2.2捕獲并處理異常try-catch-finally語(yǔ)句說(shuō)明try{}中Javastatements是可能產(chǎn)生異常的程序代碼(被監(jiān)視的代碼段)。catch()中ExceptionObject是可能拋出的異常對(duì)象,而后面{}中是對(duì)異常進(jìn)行的處理代碼。50try{}中被監(jiān)視的代碼的操作,在花括號(hào)以外無(wú)法檢測(cè)。捕獲并處理異常練習(xí)publicclassTestTryCatch{//測(cè)試異常捕獲類publicstaticvoidmain(String[]args){inti=1;intj=0;

try

{//捕獲異常語(yǔ)句System.out.println("Tryblockentered"+"i="+i+"j="+j);System.out.println(i/j);//產(chǎn)生ArithmeticException異常

System.out.println("Endingtryblock");}catch(ArithmeticExceptione){System.out.println("Arithmeticexceptioncaught");}System.out.println("Aftertryblock");}}51

try{Javastatements}catch(ExceptionType1ExceptionObject){handlerforthisexceptiontype}catch(ExceptionType2ExceptionObject){handlerforthisexceptiontype}.......finally{handlerforfinally}52為了更好地控制程序的執(zhí)行過(guò)程,使程序能夠在任何情況下都具有統(tǒng)一的結(jié)束方式,可以在try語(yǔ)句塊的最后一個(gè)catch子句之后增加一個(gè)finally子句。5.2.2捕獲異常53try{System.out.println("\nFirsttryblockindivide()entered"); array[index+2]=array[index]/array[index+1]; System.out.println("Codeatendoffirsttryblockindivide()");}catch(ArithmeticExceptione){ System.out.println("Arithmeticexceptioncaughtindivide()");}catch(ArrayIndexOutOfBoundsExceptione){ System.out.println("Index-out-of-boundsexceptioncaught“}finally{ System.out.println("finallyblockindivide()");}如果在一個(gè)try語(yǔ)句塊中有可能發(fā)生多種不同類型的異常,就需要在try之后放置多個(gè)catch子句。54在Java語(yǔ)言中,處理異常主要有兩種方式:在產(chǎn)生異常的方法中處理異常

try-catch-finally語(yǔ)句將異常拋給調(diào)用該方法的代碼段,

Throws語(yǔ)句但如果由程序處理,最終都是由try-catch-finally語(yǔ)句實(shí)現(xiàn),否則交由系統(tǒng)處理5.2.3處理異常處理異常練習(xí)publicclassThrowsException{

publicstaticvoidmain(String[]args){try{Method(0);Method(1); }catch(NumberFormatExceptione){System.out.println("\t捕獲異常:"+e);}catch(ArrayIndexOutOfBoundsExceptione){System.out.println("\t捕獲異常:"+e);}

finally{System.out.println(“在任何狀態(tài)下,finally語(yǔ)句塊都將被執(zhí)行?!?;}}5556staticvoidMethod(inti)

throwsArithmeticException,NumberFormatException{ System.out.println("調(diào)用方法Method("+i+")"); if(i==0){ thrownewArithmeticException("i=0");}elseif(i==1){thrownewNumberFormatException("i=1");}}57為了更加方便應(yīng)用程序捕獲和處理異常,Java語(yǔ)言將很多異常進(jìn)行了標(biāo)準(zhǔn)化,并組成了類層次結(jié)構(gòu)。不僅如此,它還為用戶提供了自定義異常類的能力,使得用戶可以根據(jù)自己的需求,定義符合自己需求的異常類。5.2.4用戶自定義異常類58Java語(yǔ)言要求,任何異常類都必須是Throwable類的子類,Throwable是所有異常類的公共父類。Throwable類中主要包含了由構(gòu)造方法初始化的異常描述性信息和創(chuàng)建異常對(duì)象時(shí)堆棧的記錄情況,它記載了調(diào)用每個(gè)成員方法的全部過(guò)程。如果希望訪問(wèn)這些內(nèi)容,可以通過(guò)Throwable類中的public成員方法實(shí)現(xiàn)。Throwable類59Throwable類的public成員方法成員方法描述getMessage()返回當(dāng)前異常的描述性信息,其中主要包括異常類的名稱及有關(guān)異常的簡(jiǎn)短描述。printStackTrace()將堆棧的跟蹤信息輸出到標(biāo)準(zhǔn)的輸出流中。在控制臺(tái)方式下,標(biāo)準(zhǔn)輸出流指屏幕。printStackTrack(PrintStreams)將堆棧的跟蹤信息通過(guò)參數(shù)s返回。fillInstackTrack()填寫(xiě)跟蹤信息。60除了異常類必須是Throwable類的子類之外,建議最好將定義的異常類作為Exception的子類,這樣Java編譯器才能跟蹤程序中拋出的異常位置。定義異常類的基本格式:classTestExceptionextendsException{TestException(){super();}TestException(Strings){super

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論