版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第4章面向?qū)ο螅ㄏ拢禞ava基礎(chǔ)案例教程》(第3版)學(xué)習(xí)目標(biāo)/Target掌握繼承的概念,能夠簡(jiǎn)述繼承的概念與特點(diǎn)掌握抽象類和接口的比較,能夠簡(jiǎn)述抽象類和接口的相同點(diǎn)與不同點(diǎn)熟悉多態(tài),能夠簡(jiǎn)述多態(tài)的概念和實(shí)現(xiàn)基礎(chǔ)熟悉內(nèi)部類,能夠簡(jiǎn)述成員內(nèi)部類、局部?jī)?nèi)部類、匿名內(nèi)部類、靜態(tài)內(nèi)部類的特點(diǎn)學(xué)習(xí)目標(biāo)/Target掌握super關(guān)鍵字的使用方法,能夠在類中使用super關(guān)鍵字訪問(wèn)父類成員和構(gòu)造方法掌握f(shuō)inal關(guān)鍵字的使用方法,能夠靈活使用final關(guān)鍵字修飾類、方法和變量掌握方法的重寫,能夠在子類中重寫父類方法掌握抽象類的使用方法,能夠定義和使用抽象類學(xué)習(xí)目標(biāo)/Target掌握對(duì)象類型轉(zhuǎn)換,能夠靈活對(duì)對(duì)象進(jìn)行向上轉(zhuǎn)型和向下轉(zhuǎn)型掌握J(rèn)ava中異常的處理,能夠使用try…catch和finally語(yǔ)句、throw、throws處理異常,并且能夠自定義異常類熟悉instanceof關(guān)鍵字的應(yīng)用,能夠使用instanceof關(guān)鍵字判斷一個(gè)對(duì)象是否為某個(gè)類或其子類的實(shí)例掌握接口的使用方法,能夠定義和使用接口章節(jié)概述/
Summary在上一章中,介紹了面向?qū)ο蟮幕A(chǔ)知識(shí),并對(duì)面向?qū)ο蟮娜筇匦灾械姆庋b進(jìn)行了詳細(xì)講解。本章將進(jìn)一步講解面向?qū)ο蟮母呒?jí)特性,如繼承、多態(tài)等。目錄/Contents0102繼承抽象類和接口0304多態(tài)內(nèi)部類05異常繼承4.14.1.1繼承的概念掌握繼承的概念,能夠簡(jiǎn)述繼承的概念與特點(diǎn)
先定一個(gè)小目標(biāo)!4.1.1繼承的概念現(xiàn)實(shí)生活中,說(shuō)到繼承,通常會(huì)想到子女繼承父輩的財(cái)產(chǎn)、事業(yè)等。Java中的繼承,描述的是事物間的所屬關(guān)系,通過(guò)繼承,可以使多種事物之間形成一種關(guān)系體系。下面看一個(gè)例子,假如現(xiàn)在需要定義如下兩個(gè)類。學(xué)生類(屬性:姓名、年齡
方法:吃飯、睡覺、學(xué)習(xí))老師類(屬性:姓名、年齡、薪水
方法:吃飯、睡覺、教書)如果不使用繼承,兩個(gè)類的大量重復(fù)信息會(huì)導(dǎo)致代碼大量重復(fù),臃腫而冗雜,可復(fù)用性也較低。4.1.1繼承的概念解決方法:利用繼承關(guān)系將多個(gè)類的相同內(nèi)容抽取到單獨(dú)的一個(gè)類中,抽取出的類被稱為父類,而基于父類構(gòu)建出來(lái)的新類被稱為子類。通過(guò)繼承,子類會(huì)自動(dòng)擁有父類的所有非私有屬性和方法。繼承使用關(guān)鍵字extends來(lái)實(shí)現(xiàn),語(yǔ)法格式如下:class父類{……}class子類extends父類{……}4.1.1繼承的概念通過(guò)案例演示Java如何實(shí)現(xiàn)類的繼承。案例演示Example01.java源代碼4.1.1繼承的概念案例的運(yùn)行結(jié)果如下圖所示。案例演示4.1.1繼承的概念類的繼承的注意事項(xiàng)。在Java中,類只支持單繼承,不支持多繼承。也就是說(shuō),一個(gè)類只能有一個(gè)直接父類。子類可以繼承父類的公共成員和受保護(hù)的成員,但不能繼承私有成員。Java支持多層繼承,即類的父類可以繼承其他類。例如,C類繼承B類,而B類可以繼承A類。在Java中,子類和父類是一種相對(duì)的概念,一個(gè)類既可以是某個(gè)類的父類,也可以是另一個(gè)類的子類。classA{}classBextendsA{}//B類繼承A類,B類是A類的子類classCextendsB{}//C類繼承B類,C類是B類的子類掌握方法的重寫,能夠在子類中重寫父類方法4.1.2方法的重寫
先定一個(gè)小目標(biāo)!4.1.2方法的重寫方法重寫又稱方法覆蓋,重寫方法需要定義在子類中定義一個(gè)與父類方法名稱、參數(shù)列表、返回類型完全相同的方法。下面通過(guò)一個(gè)案例演示方法的重寫。Example02.java源代碼4.1.2方法的重寫案例的運(yùn)行結(jié)果如下圖所示。4.1.2方法的重寫子類重寫父類方法的注意事項(xiàng)。靜態(tài)方法不能被重寫。靜態(tài)方法屬于類而不屬于類的實(shí)例,因此不能被子類重寫。重寫方法的訪問(wèn)權(quán)限應(yīng)比父類中被重寫方法的訪問(wèn)權(quán)限大或者一致。例如,父類方法的訪問(wèn)權(quán)限為protected,子類重寫該方法時(shí),只能將其訪問(wèn)權(quán)限保持為protected或者放寬為public,而不能設(shè)置為private。由于父類的私有方法不能被子類繼承、因此也無(wú)法被子類重寫。掌握super關(guān)鍵字的使用,能夠在類中使用super關(guān)鍵字訪問(wèn)父類成員和構(gòu)造方法4.1.3super關(guān)鍵字
先定一個(gè)小目標(biāo)!4.1.3super關(guān)鍵字繼承是一種類與類之間的關(guān)系,它涉及多個(gè)類,每個(gè)類都有各自的屬性和方法,很有可能出現(xiàn)父類和子類中具有相同成員的情況。因此,當(dāng)在子類中訪問(wèn)子類或父類的相同成員時(shí),可能會(huì)引起混淆。為了解決這個(gè)問(wèn)題,可以在子類中使用super關(guān)鍵字調(diào)用父類的成員,還可以用于在子類的構(gòu)造方法中調(diào)用父類構(gòu)造方法。4.1.3super關(guān)鍵字1.使用super關(guān)鍵字訪問(wèn)父類成員使用super關(guān)鍵字訪問(wèn)父類成員的具體語(yǔ)法格式如下。super.父類成員變量super.父類成員方法(參數(shù)列表)4.1.3super關(guān)鍵字案例演示下面通過(guò)一個(gè)案例演示super關(guān)鍵字訪問(wèn)父類成員的使用。Example03.java源代碼4.1.3super關(guān)鍵字案例演示案例的運(yùn)行效果如下圖所示。4.1.3super關(guān)鍵字案例演示子類無(wú)法繼承父類的構(gòu)造方法,但是可以在構(gòu)造方法中使用super關(guān)鍵字調(diào)用父類的構(gòu)造方法。其語(yǔ)法格式與使用this關(guān)鍵字調(diào)用同類構(gòu)造方法的語(yǔ)法格式類似,具體如下:2.使用super關(guān)鍵字調(diào)用父類的構(gòu)造方法super(參數(shù)列表)4.1.3super關(guān)鍵字案例演示下面修改文件Example03.java,演示如何使用super關(guān)鍵字調(diào)用父類的構(gòu)造方法。Example04.java源代碼4.1.3super關(guān)鍵字案例演示案例的運(yùn)行結(jié)果如下圖所示。4.1.3super關(guān)鍵字2.super關(guān)鍵字調(diào)用父類構(gòu)造方法在Java中,每個(gè)類的構(gòu)造方法中都必須調(diào)用其直接父類的一個(gè)構(gòu)造方法,以確保父類的初始化工作得到執(zhí)行。如果沒有進(jìn)行顯式調(diào)用,程序會(huì)隱式調(diào)用父類的無(wú)參構(gòu)造方法。如果父類沒有無(wú)參構(gòu)造方法,則子類必須顯式調(diào)用父類的其他構(gòu)造方法,否則編譯器會(huì)報(bào)錯(cuò)。而且,子類在構(gòu)造方法中調(diào)用父類構(gòu)造方法應(yīng)該放在子類構(gòu)造方法的第一行。。4.1.3super關(guān)鍵字下面修改文件Example04.java,演示程序隱式調(diào)用父類的無(wú)參構(gòu)造方法。Example05.java源代碼4.1.3super關(guān)鍵字案例演示案例的運(yùn)行結(jié)果如下圖所示。4.1.3super關(guān)鍵字this關(guān)鍵字與super關(guān)鍵字在用法和功能上有很多相似之處,都可以調(diào)用構(gòu)造方法、普通方法和屬性,但是兩者之間還是有區(qū)別的。分類區(qū)別點(diǎn)thissuper區(qū)別屬性訪問(wèn)訪問(wèn)本類中的屬性,如果本類中沒有該屬性,則從父類中查找直接訪問(wèn)父類中的屬性方法調(diào)用本類中的方法,如果本類中沒有該方法,則從父類中查找直接調(diào)用父類中的方法構(gòu)造方法調(diào)用本類的構(gòu)造方法調(diào)用父類的構(gòu)造方法相同之處在調(diào)用構(gòu)造方法時(shí),都必須位于構(gòu)造方法的第一行,并且只能出現(xiàn)一次4.1.4final關(guān)鍵字
先定一個(gè)小目標(biāo)!掌握f(shuō)inal關(guān)鍵字的使用,能夠使用final關(guān)鍵字修飾類和類的成員。4.1.4final關(guān)鍵字final關(guān)鍵字在Java中的含義是不可改變的或最終的,final關(guān)鍵字可以修飾變量、方法和類,當(dāng)程序中某個(gè)實(shí)體不需要被修改、繼承或重寫時(shí),可以使用final關(guān)鍵字來(lái)加以限制。4.1.4final關(guān)鍵字1.使用final關(guān)鍵字修飾類使用final關(guān)鍵字修飾的類不能被繼承,這樣的類稱為最終類,即沒有子類。具體語(yǔ)法格式如下。finalclass類名{}4.1.4final關(guān)鍵字下面通過(guò)一個(gè)案例演示final修飾類時(shí)的特點(diǎn)。Example06.java源代碼1.使用final關(guān)鍵字修飾類4.1.4final關(guān)鍵字案例的運(yùn)行結(jié)果如下圖所示。1.使用final關(guān)鍵字修飾類4.1.4final關(guān)鍵字2.使用final關(guān)鍵字修飾方法使用final關(guān)鍵字修飾的方法不能被重寫。在父類中使用final關(guān)鍵字修飾的方法,在子類中不能被重寫或覆蓋,其語(yǔ)法格式如下。訪問(wèn)修飾符final返回類型方法名(){}4.1.4final關(guān)鍵字2.使用final關(guān)鍵字修飾方法下面通過(guò)一個(gè)案例演示final修飾方法時(shí)的特點(diǎn)。Example07.java源代碼4.1.4final關(guān)鍵字2.使用final關(guān)鍵字修飾方法案例的運(yùn)行結(jié)果如下圖所示。4.1.4final關(guān)鍵字3.使用final關(guān)鍵字修飾變量使用final關(guān)鍵字修飾的變量稱為常量,一旦初始化后,其值就不能再改變。下面通過(guò)一個(gè)案例進(jìn)行驗(yàn)證。Example08.java源代碼4.1.4final關(guān)鍵字3.使用final關(guān)鍵字修飾變量案例的運(yùn)行結(jié)果如下圖所示。【案例4-1】交通工具運(yùn)行模擬案例描述本案例要求設(shè)計(jì)一個(gè)交通工具運(yùn)行的模擬程序,包括三種交通工具,分別為自行車、電動(dòng)車和小汽車。交通工具的屬性和行為如下表所示。交通工具共同特征共同行為特有方法Bicycle(自行車)1.交通工具的名稱2.輪子數(shù)量3.工具顏色4.行駛速度1.行駛2.加速3.減速無(wú)ElectricBicycle(電動(dòng)車)充電Car(小汽車)加油【案例4-1】交通工具運(yùn)行模擬案例描述本案例要求在程序中模擬各個(gè)交通工具的行駛、充電或加油、加速、減速等行為。具體要求如下。要求各個(gè)交通工具行駛的方法中展示出交通工具的名稱、輪子個(gè)數(shù)、顏色以及行駛速度。加速和減速時(shí),可以傳入?yún)?shù),具象化速度的增加量和減少量。充電和加油的方法只輸出提示即可?!景咐?-1】交通工具運(yùn)行模擬案例效果抽象類和接口4.24.2抽象類和接口
在Java編程中,經(jīng)常需要描述一些抽象的概念,比如形狀、車輛等,它們有共同的特征和行為,但又有不同的具體實(shí)現(xiàn)方式。為了更好地描述和拓展這些抽象概念,在Java中提供了兩種機(jī)制:抽象類和接口。抽象類和接口都允許定義抽象方法,具體實(shí)現(xiàn)則由不同的子類或?qū)崿F(xiàn)類來(lái)提供,使得程序可以定義通用的行為規(guī)范,實(shí)現(xiàn)代碼的靈活性和重用性。4.2.1抽象類掌握抽象類的使用,能夠定義和使用抽象類
先定一個(gè)小目標(biāo)!4.2.1抽象類關(guān)鍵字abstract用于表示抽象,可以修飾方法和類,分別表示抽象方法和抽象類。抽象方法:只包含一個(gè)方法名,沒有方法體的方法。使用關(guān)鍵字abstract定義抽象方法的語(yǔ)法格式。訪問(wèn)修飾符abstract返回值類型方法名(參數(shù)列表);4.2.1抽象類抽象類:包含了抽象方法的類就是抽象類。必須使用關(guān)鍵字abstract修飾。抽象類的語(yǔ)法格式如下。abstractclass抽象類名稱{
屬性;
訪問(wèn)修飾符返回值類型方法名稱(參數(shù)){//普通方法return[返回值];}
訪問(wèn)修飾符abstract返回值類型抽象方法名稱(參數(shù));//抽象方法,無(wú)方法體}4.2.1抽象類與非抽象類相比,抽象類的特別之處。抽象類中不一定包含抽象方法,但包含抽象方法的類一定是抽象類。抽象類中可以包含零個(gè)至多個(gè)普通方法。抽象類不能直接創(chuàng)建對(duì)象,如果創(chuàng)建,則編譯器會(huì)報(bào)錯(cuò)。繼承抽象類的子類必須重寫父類中所有的抽象方法,否則該子類也必須聲明為抽象類。抽象類不能以final關(guān)鍵字和private關(guān)鍵字修飾,因?yàn)槌橄箢惔嬖诘囊饬x就是為了被子類繼承。抽象類中可以包含構(gòu)造方法,但它不能被顯示地手動(dòng)調(diào)用。當(dāng)抽象類的子類實(shí)例化時(shí),會(huì)自動(dòng)調(diào)用父類的構(gòu)造方法。4.2.1抽象類下面通過(guò)一個(gè)案例演示抽象類的使用。案例演示Example09.java源代碼4.2.1抽象類案例的運(yùn)行結(jié)果如下圖所示。案例演示4.2.2接口掌握接口的使用,能夠定義和使用接口
先定一個(gè)小目標(biāo)!4.2.2接口接口可以被看作一種特殊的抽象類。在JDK的發(fā)展過(guò)程中,接口的特性也不斷更新和優(yōu)化。下面對(duì)接口的更新情況和接口特性進(jìn)行說(shuō)明。4.2.2接口在接口中,不支持私有變量,變量會(huì)被隱式的指定為publicstaticfinal,也就是常量。4.2.2接口JDK8開始JDK8之前接口可以被看作一個(gè)徹底的抽象類,接口中的方法全部為抽象方法。接口中定義的方法可以有方法體,但是需要被關(guān)鍵字static或default修飾。JDK9之前接口中的方法默認(rèn)為隱式抽象,即修飾符被隱式地指定為publicabstract,使用其他訪問(wèn)修飾符會(huì)報(bào)錯(cuò)。JDK9開始接口中引入了私有方法,允許使用private修飾符來(lái)聲明,通常用于在接口的默認(rèn)方法或靜態(tài)方法中復(fù)用代碼。4.2.2接口接口:使用關(guān)鍵字interface修飾。定義接口的語(yǔ)法格式。[public]interface接口名[extends接口1,接口2……]{ [public][static][final]數(shù)據(jù)類型常量名=常量; [public][abstract]返回值的數(shù)據(jù)類型方法名([參數(shù)列表]); [public|private]static返回值的數(shù)據(jù)類型方法名([參數(shù)列表]){方法體} [public]default返回值的數(shù)據(jù)類型方法名([參數(shù)列表]){方法體} private[static]返回值的數(shù)據(jù)類型方法名([參數(shù)列表]){方法體}}接口的存在是為了被實(shí)現(xiàn),而不是被繼承,因此接口與類的關(guān)系為實(shí)現(xiàn)關(guān)系。4.2.2接口修飾符
class類名implements接口1,接口2,...{
……}接口本身不能進(jìn)行實(shí)例化,接口中的抽象方法、默認(rèn)方法和私有方法只能通過(guò)其實(shí)現(xiàn)類的對(duì)象進(jìn)行調(diào)用。Java提供了關(guān)鍵字implements用于實(shí)現(xiàn)接口。類實(shí)現(xiàn)接口的語(yǔ)法格式如下:一個(gè)類可以同時(shí)實(shí)現(xiàn)多個(gè)接口,使用英文逗號(hào)分隔。實(shí)現(xiàn)類必須實(shí)現(xiàn)接口所有的抽象方法。4.2.2接口下面通過(guò)一個(gè)描述月度工作流程的案例演示接口的使用。案例演示Example10.java源代碼4.2.2接口案例的運(yùn)行結(jié)果如下圖所示。案例演示4.2.2接口前面已經(jīng)提到,一個(gè)類可以實(shí)現(xiàn)多個(gè)接口。下面通過(guò)一個(gè)音樂播放器的案例演示這種情況。案例演示Example11.java源代碼4.2.2接口案例的運(yùn)行結(jié)果如下圖所示。案例演示4.2.2接口當(dāng)一個(gè)類既需要實(shí)現(xiàn)接口,又需要繼承另一個(gè)類時(shí),語(yǔ)法格式如下。class類名extends父類名implents接口{}4.2.2接口下面修改文件Example11.java,演示一個(gè)類既實(shí)現(xiàn)接口又繼承父類的情況。案例演示Example12.java源代碼4.2.2接口案例的運(yùn)行結(jié)果如下圖所示。案例演示4.2.2接口使用接口的注意事項(xiàng)。一個(gè)接口可以通過(guò)extends關(guān)鍵字繼承另一個(gè)接口,這樣的接口稱為子接口,它會(huì)繼承父接口的方法聲明。當(dāng)一個(gè)類實(shí)現(xiàn)兩個(gè)接口,且兩個(gè)接口中存在相同的抽象方法時(shí),類中只需要重寫一次這個(gè)方法即可,既表示重寫接口1的,也表示重寫接口2的。4.2.3抽象類和接口的比較掌握抽象類和接口的比較,能夠簡(jiǎn)述抽象類和接口的相同點(diǎn)與不同點(diǎn)
先定一個(gè)小目標(biāo)!4.2.3抽象類和接口的比較比較內(nèi)容抽象類接口不同之處關(guān)鍵字abstractinterface屬性無(wú)限制變量必須為publicstaticfinal抽象方法可以定義抽象方法,也可以定義普通方法可以定義抽象方法,也可以定義普通方法,但普通方法有限制,例如需要使用關(guān)鍵字static或default修飾構(gòu)造方法可以有構(gòu)造方法不能有構(gòu)造方法類的關(guān)系類只能繼承一個(gè)抽象類類可以實(shí)現(xiàn)多個(gè)接口繼承/實(shí)現(xiàn)只能被類或抽象類繼承既可以被接口繼承,也能被類或抽象類實(shí)現(xiàn)多重繼承不支持可以繼承多個(gè)父接口相同之處(1)JDK9以后,都可以包含具體的方法實(shí)現(xiàn)(2)都不能實(shí)例化對(duì)象,需要子類或?qū)崿F(xiàn)類實(shí)例化對(duì)象【案例4-2】打印不同圖形本案例要求編寫一個(gè)程序,根據(jù)用戶的輸入在控制臺(tái)打印出不同的圖形。要求用戶輸入要打印的圖形,以及圖形的尺寸,控制臺(tái)使用“*”打印相應(yīng)圖案。要求提供三種圖形,正方形、圓形和等邊三角形。正方形需要提供邊長(zhǎng)、圓形需要提供半徑、等邊三角形需要提供高。案例描述【案例4-2】打印不同圖形案例效果多態(tài)4.34.3多態(tài)多態(tài)是繼封裝、繼承之后,面向?qū)ο蟮牡谌筇匦?。通過(guò)之前的學(xué)習(xí),我們已經(jīng)掌握了封裝和繼承的核心思想,本節(jié)將講解面向?qū)ο笾械亩鄳B(tài)。4.3.1多態(tài)概述熟悉多態(tài)概述,能夠簡(jiǎn)述多態(tài)的概念和實(shí)現(xiàn)基礎(chǔ)
先定一個(gè)小目標(biāo)!4.3.1多態(tài)概述多態(tài)本來(lái)是生物學(xué)里的概念,表示地球上的生物在形態(tài)和狀態(tài)方面的多樣性。在Java的面向?qū)ο笾?,多態(tài)通常指的是運(yùn)行時(shí)多態(tài),當(dāng)一個(gè)子類繼承一個(gè)父類并重寫父類中的方法時(shí),或者一個(gè)子類實(shí)現(xiàn)一個(gè)接口并實(shí)現(xiàn)接口中的方法時(shí),同一個(gè)行為可以有多個(gè)不同表現(xiàn)形式。4.3多態(tài)概述對(duì)象多態(tài)指同一個(gè)引用變量可以引用不同類型的對(duì)象,一般表現(xiàn)為一個(gè)父類的引用可以指向不同的子類對(duì)象。例如父類Animal有兩個(gè)子類Cat和Dog,一個(gè)Animal對(duì)象可以指向一個(gè)Dog對(duì)象或者一個(gè)Cat對(duì)象。行為多態(tài)也稱為方法多態(tài),當(dāng)用父類引用變量調(diào)用被子類重寫的方法時(shí),程序會(huì)根據(jù)對(duì)象的實(shí)際類型來(lái)確定調(diào)用哪個(gè)方法,實(shí)現(xiàn)不同對(duì)象調(diào)用相同方法時(shí)的不同響應(yīng)。也就是說(shuō)不同對(duì)象調(diào)用相同方法,可能會(huì)表現(xiàn)出不同的行為。4.3多態(tài)概述下面通過(guò)一個(gè)子類重寫動(dòng)物類的案例演示Java的運(yùn)行時(shí)多態(tài)。案例演示Example13.java源代碼4.3多態(tài)概述案例的運(yùn)行結(jié)果如下圖所示。案例演示4.3.2對(duì)象類型轉(zhuǎn)換掌握對(duì)象類型轉(zhuǎn)換,能夠靈活對(duì)對(duì)象進(jìn)行向上轉(zhuǎn)型和向下轉(zhuǎn)型
先定一個(gè)小目標(biāo)!4.3.2對(duì)象類型轉(zhuǎn)換多態(tài)形式下,使用父類應(yīng)用變量引用不同子類對(duì)象可以提高代碼靈活性。但是編譯器只認(rèn)識(shí)引用變量的類型,而不知道它所引用的具體對(duì)象的類型,因此無(wú)法直接調(diào)用子類特有的方法和屬性。為了解決這個(gè)問(wèn)題,可以進(jìn)行類型轉(zhuǎn)換。Java中的對(duì)象類型轉(zhuǎn)換有向上轉(zhuǎn)型和向下轉(zhuǎn)型兩種。4.3.2對(duì)象類型轉(zhuǎn)換向下轉(zhuǎn)型:指將父類的引用變量轉(zhuǎn)換為子類的引用變量,從而獲得對(duì)子類特有方法和屬性的訪問(wèn)權(quán)限。向上轉(zhuǎn)型:將子類對(duì)象賦值給父類引用變量。向上轉(zhuǎn)型和向下轉(zhuǎn)型的語(yǔ)法格式。父類類型變量名=new子類對(duì)象;
//向上轉(zhuǎn)型子類類型變量名=(子類類型)父類變量名;
//向下轉(zhuǎn)型向上轉(zhuǎn)型的過(guò)程程序會(huì)自動(dòng)完成,而向下轉(zhuǎn)型需要顯示地編寫類型轉(zhuǎn)換代碼,并且需要指明轉(zhuǎn)型后的子類類型。4.3.2對(duì)象類型轉(zhuǎn)換下面修改文件Example13.java,演示對(duì)象類型的轉(zhuǎn)換,在子類中添加特有方法,并在主方法中調(diào)用它。案例演示Example14.java源代碼4.3.2對(duì)象類型轉(zhuǎn)換案例的運(yùn)行結(jié)果如下圖所示。案例演示4.3.2對(duì)象類型轉(zhuǎn)換需要注意的是,在向下轉(zhuǎn)型之前,需要先進(jìn)行一個(gè)對(duì)應(yīng)的向上轉(zhuǎn)型,這樣可以確保引用變量所引用的對(duì)象屬于子類,不能將父類實(shí)例強(qiáng)制轉(zhuǎn)換為子類實(shí)例。例如,將文件Example14.java中第29行代碼修改為下面所示代碼。案例演示Dogdog=(Dog)newAnimal();再次運(yùn)行文件Example14.java,結(jié)果如下圖所示。4.3.3instanceof關(guān)鍵字熟悉instanceof關(guān)鍵字的應(yīng)用,能夠使用instanceof關(guān)鍵字判斷一個(gè)對(duì)象是否為某個(gè)類或其子類的實(shí)例
先定一個(gè)小目標(biāo)!4.3.3instanceof關(guān)鍵字instanceof關(guān)鍵字的作用:用于檢查對(duì)象是否是特定類型的實(shí)例。使用格式如下:objectinstanceoftypeobject:要檢查的對(duì)象type:要檢查的類型返回值:boolean類型,如果object是type的實(shí)例或type子類的實(shí)例,則返回true;否則返回false。4.3.3instanceof關(guān)鍵字下面再次修改文件Example14.java,使用instanceof關(guān)鍵字判斷變量的數(shù)據(jù)類型后再進(jìn)行類型轉(zhuǎn)換。案例演示Example15.java源代碼4.3.3instanceof關(guān)鍵字修改后的案例運(yùn)行結(jié)果如下圖所示。案例演示【案例4-3】餐廳外賣配送隨著科技的發(fā)展和人們生活節(jié)奏的加快,許多餐廳開始提供外賣服務(wù)。某餐廳在顧客在外賣軟件上下單后,餐廳員工通過(guò)該軟件管理用戶的訂單,如果發(fā)現(xiàn)存在待配送,則尋找外賣員對(duì)訂單進(jìn)行配送。為了節(jié)省資金,餐廳也會(huì)安排空閑的服務(wù)員對(duì)待配送的訂單進(jìn)行配送。現(xiàn)在需要給這個(gè)餐廳做一個(gè)外賣訂單配送的管理系統(tǒng)。案例描述【案例4-3】餐廳外賣配送案例效果內(nèi)部類4.44.4內(nèi)部類在Java中有一種特殊的類,它被定義在其他類的內(nèi)部,這樣的類稱為內(nèi)部類,內(nèi)部類所在的類稱為外部類。根據(jù)定義位置、訪問(wèn)權(quán)限和定義方式的不同,Java中的內(nèi)部類主要分為成員內(nèi)部類、局部?jī)?nèi)部類、匿名內(nèi)部類和靜態(tài)內(nèi)部類。4.4.1成員內(nèi)部類
先定一個(gè)小目標(biāo)!熟悉成員內(nèi)部類,能夠說(shuō)出成員內(nèi)部類的特點(diǎn)4.4.1成員內(nèi)部類成員內(nèi)部類概念:定義在一個(gè)類的成員位置的類。訪問(wèn)權(quán)限:成員內(nèi)部類可以訪問(wèn)外部類的所有成員變量和方法,并可以有自己的成員變量和方法。創(chuàng)建內(nèi)部類對(duì)象:先創(chuàng)建外部類的對(duì)象,然后再通過(guò)外部類的對(duì)象創(chuàng)建內(nèi)部類對(duì)象。外部類名.成員內(nèi)部類名變量名=外部類對(duì)象.new成員內(nèi)部類名();4.4.1成員內(nèi)部類下面通過(guò)一個(gè)控制設(shè)備開關(guān)機(jī)的案例演示成員內(nèi)部類的定義和使用。案例演示Example16.java源代碼4.4.1成員內(nèi)部類案例的運(yùn)行結(jié)果如下圖所示。案例演示4.4.2局部?jī)?nèi)部類
先定一個(gè)小目標(biāo)!熟悉局部?jī)?nèi)部類,能夠說(shuō)出局部?jī)?nèi)部類的特點(diǎn)4.4.2局部?jī)?nèi)部類局部?jī)?nèi)部類概念:是定義在方法中的類,它和局部變量一樣,只在方法中有效。訪問(wèn)權(quán)限:局部?jī)?nèi)部類可以訪問(wèn)外部類的所有成員變量和方法,而局部?jī)?nèi)部類中變量和方法只能在局部?jī)?nèi)部類所在的方法中被訪問(wèn)。創(chuàng)建局部?jī)?nèi)部類對(duì)象:局部?jī)?nèi)部類只能在方法內(nèi)部或作用域內(nèi)部被實(shí)例化,創(chuàng)建局部?jī)?nèi)部類的語(yǔ)法格式與普通類相同。4.4.2局部?jī)?nèi)部類下面通過(guò)一個(gè)計(jì)算器案例演示局部?jī)?nèi)部類的使用。案例演示Example17.java源代碼4.4.2局部?jī)?nèi)部類案例的運(yùn)行結(jié)果如下圖所示。案例演示4.4.3匿名內(nèi)部類
先定一個(gè)小目標(biāo)!熟悉匿名內(nèi)部類,能夠說(shuō)出匿名內(nèi)部類的特點(diǎn)4.4.3匿名內(nèi)部類匿名內(nèi)部類概念:沒有名字的內(nèi)部類,它通常用于一次性地定義一個(gè)類并創(chuàng)建其對(duì)象。匿名內(nèi)部類不需要顯式地定義一個(gè)類,而是在創(chuàng)建對(duì)象的同時(shí)定義這個(gè)類。匿名內(nèi)部類通常作為方法的參數(shù)、返回值或變量的值使用。創(chuàng)建匿名內(nèi)部類的語(yǔ)法格式:new繼承的父類名或?qū)崿F(xiàn)的接口名(){//匿名內(nèi)部類的成員變量、方法等};上述語(yǔ)法格式創(chuàng)建了一個(gè)匿名內(nèi)部類,并同時(shí)創(chuàng)建了該類的對(duì)象。這個(gè)匿名內(nèi)部類繼承了指定父類或?qū)崿F(xiàn)了指定接口。4.4.3匿名內(nèi)部類下面以匿名內(nèi)部類的方式創(chuàng)建接口的實(shí)現(xiàn)類為例,演示匿名內(nèi)部類的使用。案例演示Example18.java源代碼4.4.3匿名內(nèi)部類案例的運(yùn)行結(jié)果如下圖所示。案例演示4.4.3匿名內(nèi)部類通常當(dāng)方法的形參為接口或者抽象類時(shí),也可以將匿名內(nèi)部類作為參數(shù)傳遞。修改文件Example18.java來(lái)演示這種情況。案例演示Example19.java源代碼4.4.4靜態(tài)內(nèi)部類
先定一個(gè)小目標(biāo)!熟悉靜態(tài)內(nèi)部類,能夠說(shuō)出靜態(tài)內(nèi)部類的特點(diǎn)4.4.4靜態(tài)內(nèi)部類靜態(tài)內(nèi)部類概念:特殊的成員內(nèi)部類,它使用static關(guān)鍵字修飾,與類的靜態(tài)成員類似,都屬于外部類本身,而不屬于外部類的實(shí)例。訪問(wèn)權(quán)限:靜態(tài)內(nèi)部類只能訪問(wèn)外部類的靜態(tài)成員,通過(guò)外部類訪問(wèn)靜態(tài)內(nèi)部類的成員時(shí),可以跳過(guò)外部類直接訪問(wèn)。創(chuàng)建靜態(tài)內(nèi)部類對(duì)象的格式:外部類名.靜態(tài)內(nèi)部類名變量名=new外部類名.靜態(tài)內(nèi)部類名();4.4.4靜態(tài)內(nèi)部類下面通過(guò)一個(gè)輸出系統(tǒng)日志的案例演示靜態(tài)內(nèi)部類的使用。案例演示Example20.java源代碼4.4.4靜態(tài)內(nèi)部類案例的運(yùn)行結(jié)果如下圖所示。案例演示【案例4-4】多媒體播放器某款多媒體播放器提供音樂頻道和評(píng)書頻道供用戶選擇。用戶可以選擇想要進(jìn)入的頻道,并進(jìn)行多媒體播放器支持的操作,支持的操作有添加播放內(nèi)容、播放指定序號(hào)的內(nèi)容,以及停止播放。本案例要求編寫一個(gè)程序,模擬該多媒體播放器的操作流程,要求使用內(nèi)部類實(shí)現(xiàn)。案例描述【案例4-4】多媒體播放器案例效果【案例4-4】多媒體播放器案例效果異常4.54.5.1什么是異常
先定一個(gè)小目標(biāo)!熟悉什么是異常,能夠說(shuō)出Error類和Exception類區(qū)別4.5.1什么是異常生活中,難免會(huì)遇到意外情況和突發(fā)狀況。例如,燒水時(shí)由于疏忽導(dǎo)致水燒開后溢出熱水,可能會(huì)進(jìn)一步導(dǎo)致短路,甚至引發(fā)觸電等事故。這時(shí)應(yīng)立即采取措施,處理突發(fā)情況。4.5.1什么是異常同樣,在Java編程中也可能會(huì)遇到各種異常情況。例如,程序運(yùn)行時(shí)磁盤空間不足、網(wǎng)絡(luò)連接中斷、訪問(wèn)的文件不存在等。這些情況會(huì)導(dǎo)致程序出現(xiàn)錯(cuò)誤,并影響其他正常代碼的執(zhí)行。為此,Java提供了異常處理機(jī)制來(lái)幫助程序員檢查和處理可能出現(xiàn)的錯(cuò)誤,以保證程序的可讀性和可維護(hù)性。4.5.1什么是異常下面通過(guò)一個(gè)案例來(lái)認(rèn)識(shí)一下異常。案例演示Example21.java源代碼4.5.1什么是異常案例的運(yùn)行結(jié)果如下圖所示。案例演示4.5.1什么是異常Java中的異常類都繼承自java.lang.Throwable類。Throwable類的繼承體系如下。4.5.1什么是異常Error錯(cuò)誤類,表示Java運(yùn)行時(shí)產(chǎn)生的系統(tǒng)內(nèi)部錯(cuò)誤或資源耗盡的錯(cuò)誤,這類錯(cuò)誤比較嚴(yán)重,僅靠修改程序代碼本身無(wú)法恢復(fù)正常執(zhí)行。Exception異常類,可以被程序處理和捕獲的異常,通常情況下,在開發(fā)Java程序中進(jìn)行的異常處理,都是針對(duì)Exception類及其子類。4.5.1什么是異常異常分為編譯時(shí)異常和運(yùn)行時(shí)異常。編譯時(shí)異常是指在編譯過(guò)程中檢測(cè)到的異常,而運(yùn)行時(shí)異常是指程序運(yùn)行時(shí)發(fā)生的異常,編譯時(shí)檢測(cè)不到這種異常。Exception類中,所有的RunTimeException類及其子類的實(shí)例為運(yùn)行時(shí)異常,其他類及其子類為編譯時(shí)異常。編譯時(shí)異常運(yùn)行時(shí)異常4.5.1什么是異常Throwable類提供了一系列方法用于處理程序運(yùn)行時(shí)的各種異常情況,Throwable類的子類可以通過(guò)重寫這些方法,實(shí)現(xiàn)本類異常的處理。方法名稱功能描述getMessage()返回異常的詳細(xì)描述信息。通常用于獲取異常產(chǎn)生的原因或錯(cuò)誤的描述getStackTrace()以數(shù)組形式返回異常的跟蹤棧信息printStackTrace()將異常的跟蹤棧信息輸出到控制臺(tái),并顯示異常的類型、消息以及在代碼中的位置4.5.2try...catch和finally語(yǔ)句
先定一個(gè)小目標(biāo)!掌握try...catch語(yǔ)句和finally語(yǔ)句,能夠使用try...catch語(yǔ)句和finally語(yǔ)句處理異常4.5.2try...catch和finally語(yǔ)句程序運(yùn)行時(shí),JVM會(huì)創(chuàng)建一個(gè)異常對(duì)象來(lái)表示異常,并將相應(yīng)的異常信息封裝在異常對(duì)象中。捕獲到異常后,JVM會(huì)將異常對(duì)象傳遞給異常處理器,如果異常處理器沒有進(jìn)行處理,則會(huì)將該異常相關(guān)信息輸出,并終止程序的運(yùn)行。對(duì)此,可以對(duì)程序可能出現(xiàn)異常的代碼進(jìn)行監(jiān)控,出現(xiàn)異常時(shí),對(duì)其進(jìn)行捕獲并處理。4.5.2try...catch和finally語(yǔ)句Java提供了try…catch語(yǔ)句用于捕獲并處理異常,try…catch語(yǔ)句捕獲并處理異常的語(yǔ)法格式如下。try{//可能會(huì)出現(xiàn)異常的代碼}catch(異常類型異常對(duì)象){//處理異常的代碼}catch語(yǔ)句后的異常對(duì)象參數(shù)用于指明它能夠處理的異常類型,其類型必須是Exception類或其子類。catch代碼塊可以有多個(gè),用來(lái)匹配多個(gè)異常,但捕獲父類異常的catch代碼塊必須放在捕獲子類異常的catch代碼塊之后。4.5.2try...catch和finally語(yǔ)句try...catch語(yǔ)句的異常處理流程。4.5.2try...catch和finally語(yǔ)句下面修改文件Example21.java,使用try…catch語(yǔ)句對(duì)該程序中出現(xiàn)的異常進(jìn)行捕獲案例演示Example22.java源代碼4.5.2try...catch和finally語(yǔ)句案例的運(yùn)行結(jié)果如下圖所示。案例演示4.5.2try...catch和finally語(yǔ)句try代碼塊中,發(fā)生異常的語(yǔ)句后面的代碼是不會(huì)被執(zhí)行的,然而在程序中有一些特定的語(yǔ)句無(wú)論異常是否發(fā)生都需要執(zhí)行。為了解決這個(gè)問(wèn)題,可以在try...catch語(yǔ)句后加一個(gè)finally代碼塊,finally代碼塊中存放的代碼一定會(huì)被執(zhí)行。4.5.2try...catch和finally語(yǔ)句try…catch…finally語(yǔ)句的異常處理流程。4.5.2try...catch和finally語(yǔ)句下面修改文件Example22.java,演示try…catch…finally語(yǔ)句的使用。案例演示Example23.java源代碼4.5.2try...catch和finally語(yǔ)句案例的運(yùn)行結(jié)果如下圖所示。案例演示4.5.3異常的拋出和聲明
先定一個(gè)小目標(biāo)!掌握異常的拋出和聲明,能夠在程序中使用throw語(yǔ)句和throws語(yǔ)句分拋出異常和聲明異常4.5.3異常的拋出和聲明當(dāng)程序中存在潛在的異常時(shí),如果沒有得到妥善的處理,可能導(dǎo)致程序崩潰。為此,Java提供了throw語(yǔ)句和throws語(yǔ)句分別用于拋出異常和聲明異常,將方法可能出現(xiàn)的問(wèn)題上報(bào)給方法的調(diào)用者,以便對(duì)異常進(jìn)行相應(yīng)處理,避免不必要的錯(cuò)誤和異常情況。4.5.3異常的拋出和聲明1.throw語(yǔ)句throw語(yǔ)句的作用:在方法或代碼塊中拋出該方法或代碼塊有可能發(fā)生的異常。使用thow關(guān)鍵字拋出異常的語(yǔ)法格式如下:throw異常對(duì)象;4.5.3異常的拋出和聲明下面通過(guò)一個(gè)案例演示throw關(guān)鍵字的使用。案例演示Example24.java源代碼4.5.3異常的拋出和聲明案例的運(yùn)行結(jié)果如下圖所示。案例演示4.5.3異常的拋出和聲明2.throws語(yǔ)句throws關(guān)鍵字的作用:用于在方法聲明中指定方法可能拋出的
溫馨提示
- 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ù)覽,若沒有圖紙預(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024-2030年中國(guó)汽車保修機(jī)具行業(yè)市場(chǎng)運(yùn)營(yíng)模式及未來(lái)發(fā)展動(dòng)向預(yù)測(cè)報(bào)告
- 2024-2030年中國(guó)污水處理成套設(shè)備境外融資報(bào)告
- 2024-2030年中國(guó)水處理化學(xué)品行業(yè)發(fā)展現(xiàn)狀及前景趨勢(shì)分析報(bào)告
- 2024-2030年中國(guó)氯磺化聚乙烯防腐漆稀釋劑項(xiàng)目申請(qǐng)報(bào)告
- 2024-2030年中國(guó)母嬰保健行業(yè)銷售形勢(shì)及營(yíng)銷策略建議報(bào)告
- 2024-2030年中國(guó)橡膠軟化劑行業(yè)需求預(yù)測(cè)及投資風(fēng)險(xiǎn)研究報(bào)告
- 七年級(jí)上冊(cè)語(yǔ)文教學(xué)工作計(jì)劃
- 2024-2030年中國(guó)柴油機(jī)連桿襯套行業(yè)市場(chǎng)運(yùn)營(yíng)模式及未來(lái)發(fā)展動(dòng)向預(yù)測(cè)報(bào)告
- 2024-2030年中國(guó)條碼識(shí)讀設(shè)備行業(yè)運(yùn)行形勢(shì)與發(fā)展策略建議報(bào)告
- 2024-2030年中國(guó)木材粉碎機(jī)行業(yè)發(fā)展現(xiàn)狀與盈利前景預(yù)測(cè)報(bào)告
- 【基于抖音短視頻的營(yíng)銷策略分析文獻(xiàn)綜述2800字(論文)】
- 2021-2022學(xué)年度西城區(qū)五年級(jí)上冊(cè)英語(yǔ)期末考試試題
- 《組織行為學(xué)》(本)形考任務(wù)1-4
- 廣東省廣州市白云區(qū)2022-2023學(xué)年九年級(jí)上學(xué)期期末語(yǔ)文試題
- 劇本-進(jìn)入黑夜的漫長(zhǎng)旅程
- DB43-T 958.3-2023 實(shí)驗(yàn)用小型豬 第3部分:配合飼料
- 化肥購(gòu)銷合同范本正規(guī)范本(通用版)
- 健康管理專業(yè)職業(yè)生涯規(guī)劃書
- 外墻巖棉板施工方案
- 吊裝葫蘆施工方案
- 自動(dòng)化設(shè)備調(diào)試規(guī)范
評(píng)論
0/150
提交評(píng)論