版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第7章面向?qū)ο蟪绦蛟O(shè)計(jì)(下)1教學(xué)目標(biāo)(1) 理解父類和子類的關(guān)系,使用關(guān)鍵字extends擴(kuò)展一個(gè)類(2) 理解protected訪問(wèn)權(quán)限,應(yīng)用訪問(wèn)修飾符實(shí)現(xiàn)更好的信息隱藏(3) 理解子類構(gòu)造方法的執(zhí)行,掌握super的用法。(4) 理解在子類中重寫父類方法,能應(yīng)用方法重寫(5) 使用final關(guān)鍵字防止類的繼承和方法重寫(6) 理解密封類的定義和用途(7) 理解Object類,能應(yīng)用和重寫其常用方法toString()、equals()(8) 掌握多態(tài)和動(dòng)態(tài)綁定(9) 掌握對(duì)象的類型轉(zhuǎn)換(10) 掌握抽象類的概念和應(yīng)用,理解抽象類示例(11) 掌握接口的概念,掌握接口的聲明和使用(12) 掌握父接口、子接口、默認(rèn)方法及其沖突的解決(13) 理解密封接口和注解接口(14) 理解接口的示例(15) 理解抽象類與接口的區(qū)別(16) 理解面向?qū)ο蟪绦蛟O(shè)計(jì)的5個(gè)原則2引言(1/3)3假設(shè)要定義一個(gè)類,對(duì)圓、矩形、三角形建模。這些類有很多共同的特性(畫線顏色、填充與否、創(chuàng)建時(shí)間等等)。引言(2/3)4設(shè)計(jì)這些類,如何避免冗余,還能使系統(tǒng)易于理解和易于維護(hù)?答案是:繼承,可提煉公共屬性和行為創(chuàng)建一個(gè)通用的幾何對(duì)象類Shape軟件重用:在擴(kuò)展創(chuàng)建新的幾何形狀時(shí),可以進(jìn)一步重用Shape例如:正六邊形、正五邊形、梯形等引言(3/3)Stoptryingtoreinventthewheel,可能是每個(gè)程序員入行被告知的一條準(zhǔn)則軟件重用繼承:一種基于源代碼的重用機(jī)制多態(tài):解決類的功能和行為在繼承體系中的再抽象5內(nèi)容7.1繼承7.2super7.3方法重寫7.4final7.5密封類67.6Object類7.7多態(tài)性7.14抽象類與接口7.8動(dòng)態(tài)綁定7.9對(duì)象轉(zhuǎn)換7.10抽象類7.11抽象類示例7.12接口7.13接口示例內(nèi)容7.1繼承7.2super7.3方法重寫7.4final7.5密封類77.6Object類7.7多態(tài)性7.14抽象類與接口7.8動(dòng)態(tài)綁定7.9對(duì)象轉(zhuǎn)換7.10抽象類7.11抽象類示例7.12接口7.13接口示例7.1繼承87.1.1父類與子類7.1.2protected數(shù)據(jù)和方法7.1.1父類與子類Java語(yǔ)言是一種單繼承的語(yǔ)言,在父類的基礎(chǔ)上定義其子類的一般語(yǔ)法形式為:publicclass子類名extends父類名{子類的新成員}需要說(shuō)明的是:(1)子類名是一個(gè)合法的標(biāo)識(shí)符,由用戶自己定義。(2)關(guān)鍵字extends用在子類名之后,指定父類名,父類只允許有一個(gè)。(3)父類名必須是程序中已有的一個(gè)類的類名。(4)父類名之后是子類的類體,由一對(duì)花括號(hào){}括起來(lái),這對(duì)花括號(hào)中的內(nèi)容是子類新定義的成員。97.1.1父類與子類銀行賬戶類Account借記卡賬戶DebitCardAccount(不允許透支,具有余額)信用卡賬戶CreditCardAccount(允許透支,但有限額)這兩種賬戶都共享銀行賬戶Account的共同特征,并有新增功能。107.1.1父類與子類銀行賬戶類Account、借記卡賬戶類DebitCardAccount、信用卡賬戶類CreditCardAccount的源代碼分別在程序清單7-1、程序清單7-2、程序清單7-3中給出程序清單7-4TestCreditDebitAccount.java,對(duì)上述類進(jìn)行測(cè)試117.1.1父類與子類基于上述示例,Java語(yǔ)言的繼承機(jī)制需要注意的是:(1)Java語(yǔ)言是一種單繼承語(yǔ)言,即子類繼承父類使用關(guān)鍵字extends時(shí),extends之后只能有一個(gè)父類名。(2)子類繼承父類的內(nèi)容,還可以新增內(nèi)容和重寫繼承的內(nèi)容。因此,子類不是父類的子集。(3)據(jù)Java語(yǔ)言官方文檔,子類繼承了父類中所有可被訪問(wèn)的成員(數(shù)據(jù)域和方法),但是構(gòu)造方法不屬于這類成員,父類構(gòu)造方法不被能子類繼承。然而,父類構(gòu)造方法可以被子類調(diào)用,用于完成子類的初始化工作。例如,程序清單7-2第20行就是父類構(gòu)造方法調(diào)用。(4)據(jù)Java語(yǔ)言官方文檔,子類既不能繼承父類的私有成員,也不能直接訪問(wèn)這些私有成員。如果父類定義了訪問(wèn)私有成員的公有或保護(hù)方法,那么子類可以通過(guò)這些父類的公有或保護(hù)方法間接訪問(wèn)這些私有成員。(5)不是所有“是一種(is-a)”關(guān)系都應(yīng)該用繼承來(lái)建模。例如,正方形是一種矩形,但是不應(yīng)該定義一個(gè)正方形類繼承自矩形類。127.1.1父類與子類注意:關(guān)于父類私有成員的繼承問(wèn)題辨析。從內(nèi)存分配上講,子類確實(shí)繼承父類的私有成員。因?yàn)樵趯?shí)例化一個(gè)子類對(duì)象時(shí),系統(tǒng)先為父類中定義的數(shù)據(jù)域(包括私有成員)分配內(nèi)存,再為子類中定義的數(shù)據(jù)域分配內(nèi)存,所有這些數(shù)據(jù)域都是屬于這個(gè)新創(chuàng)建的對(duì)象,只不過(guò)子類對(duì)象不能直接訪問(wèn)其父類的私有成員。為了較為形象地說(shuō)明這種情況,可以說(shuō)子類“隱蔽”繼承了父類的私有成員。因此,從繼承的物理實(shí)現(xiàn)上講,子類繼承了其父類的所有成員,包括私有成員。這個(gè)說(shuō)法,有助于我們理解為什么子類構(gòu)造方法會(huì)先調(diào)用父類構(gòu)造方法,父類構(gòu)造方法是用于初始化父類自身的私有數(shù)據(jù)域。雖然父類私有數(shù)據(jù)域不能被子類直接訪問(wèn),但是也被子類繼承了。因此,在創(chuàng)建子類對(duì)象時(shí),必須先調(diào)用父類構(gòu)造方法初始化父類的私有數(shù)據(jù)域。然而,Java語(yǔ)言官方文檔說(shuō)明子類不能繼承父類的私有成員,這個(gè)說(shuō)法可從可訪問(wèn)性上來(lái)理解。由于父類私有成員不能像子類自身的私有成員一樣被訪問(wèn),所以父類私有成員可以被看做未被繼承。這兩個(gè)說(shuō)法都可以接受。為了避免混淆,本書(shū)采納了Java語(yǔ)言官方文檔的說(shuō)明。然而,程序員也應(yīng)理解,從繼承的物理實(shí)現(xiàn)(內(nèi)存分配)上來(lái)講,子類確實(shí)繼承了父類的私有成員。13147-1一個(gè)子類是父類的子集,這句話是否正確()正確錯(cuò)誤AB提交單選題1分157-2定義一個(gè)子類,使用關(guān)鍵字
[填空1]
作答正常使用填空題需3.0以上版本雨課堂填空題1分7.1繼承167.1.1父類與子類7.1.2protected數(shù)據(jù)和方法7.1.2protected數(shù)據(jù)和方法protected修飾符能修飾一個(gè)類的數(shù)據(jù)域和方法。一個(gè)public類的被保護(hù)數(shù)據(jù)域和方法可以被同一包中的任何類訪問(wèn)或任何子類訪問(wèn)(即使子類不在同一包中)可見(jiàn)性修飾符public、protected、private,指定了類和類的成員的可見(jiàn)性(或可訪問(wèn)性)。這些修飾符的可見(jiàn)性按下面順序遞增,如下圖所示。177.1.2protected數(shù)據(jù)和方法在不同修飾符修飾一個(gè)public類(公有類)的成員時(shí)類中成員的可訪問(wèn)性187.1.2protected數(shù)據(jù)和方法197.1.2protected數(shù)據(jù)和方法關(guān)鍵字protected和private只能用于修飾類的成員,而關(guān)鍵字public既能用于修飾類的成員,也能用于修飾類。在繼承機(jī)制下,為了實(shí)現(xiàn)更好的信息隱藏,最好是在父類中使用可見(jiàn)性修飾符protected。在父類中使用protected聲明的成員,被繼承后在子類中就像公有成員一樣,可由子類方法直接訪問(wèn)。然而,在子類之外,父類的保護(hù)成員在其他包的類看來(lái)則像私有成員一樣,不能被直接訪問(wèn),從而實(shí)現(xiàn)了更好的信息隱藏。20217-3判斷正誤:protected的可見(jiàn)性低于包私有的可見(jiàn)性,()正確錯(cuò)誤AB提交單選題1分227-4以下哪項(xiàng)陳述是錯(cuò)誤的?()公有類可以被來(lái)自不同包的類訪問(wèn)。不同包中的類無(wú)法訪問(wèn)一個(gè)類的私有方法。受保護(hù)的方法可被不同包中的子類訪問(wèn)。沒(méi)有可見(jiàn)性修飾符的方法可以被不同包中的類訪問(wèn)。ABCD提交單選題1分內(nèi)容7.1繼承7.2super7.3方法重寫7.4final7.5密封類237.6Object類7.7多態(tài)性7.14抽象類與接口7.8動(dòng)態(tài)綁定7.9對(duì)象轉(zhuǎn)換7.10抽象類7.11抽象類示例7.12接口7.13接口示例7.2super關(guān)鍵字super主要用在繼承機(jī)制中,它指向super所在類的直接父類,主要有兩種使用方式:一是在子類構(gòu)造方法中調(diào)用父類的構(gòu)造方法;二是調(diào)用父類的普通方法。247.2.1調(diào)用父類構(gòu)造方法7.2.2調(diào)用父類普通方法25父類構(gòu)造方法不能被子類繼承。父類構(gòu)造方法必須被子類顯式或隱式調(diào)用。顯式調(diào)用需使用super關(guān)鍵字。隱式調(diào)用無(wú)須編寫調(diào)用語(yǔ)句。
顯式調(diào)用父類構(gòu)造方法的語(yǔ)法是:
super();或者
super(實(shí)際參數(shù)列表);而且,super()或super(實(shí)際參數(shù)列表)必須出現(xiàn)在子類構(gòu)造方法的第一行。這是顯式調(diào)用父類構(gòu)造方法的唯一形式。7.2.1調(diào)用父類構(gòu)造方法26如果子類構(gòu)造方法沒(méi)有顯式調(diào)用父類構(gòu)造方法,那么編譯器會(huì)將super()做為子類構(gòu)造方法的第一條語(yǔ)句。例如,
7.2.1調(diào)用父類構(gòu)造方法7.2.1調(diào)用父類構(gòu)造方法子類構(gòu)造方法在構(gòu)建一個(gè)子類實(shí)例時(shí)被調(diào)用執(zhí)行。子類構(gòu)造方法在執(zhí)行時(shí),會(huì)沿著繼承鏈從根類Object出發(fā)向下依次調(diào)用所有父類的構(gòu)造方法,最后執(zhí)行子類自身的初始化語(yǔ)句程序清單7-5ClsD.java27287-5下面的說(shuō)法是否正確?()當(dāng)從子類調(diào)用構(gòu)造方法時(shí),它父類的無(wú)參構(gòu)造方法總是會(huì)被調(diào)用。正確錯(cuò)誤AB提交單選題1分297-6一個(gè)子類對(duì)象被創(chuàng)建時(shí),子類自身的構(gòu)造方法先執(zhí)行,再依次執(zhí)行其父類的構(gòu)造方法,最終完成對(duì)象的創(chuàng)建。這句話是否正確()正確錯(cuò)誤AB提交單選題1分30publicclassAppleextendsFruit{}
classFruit{publicFruit(Stringname){System.out.println("Fruit'sconstructorisinvoked");}}尋找下面這段代碼的錯(cuò)誤討論題:討論父類沒(méi)有無(wú)參構(gòu)造方法的影響設(shè)計(jì)指南:一般情況下,最好能為每個(gè)類提供一個(gè)無(wú)參構(gòu)造方法,以便于對(duì)該類進(jìn)行擴(kuò)展,同時(shí)避免錯(cuò)誤。7.2super關(guān)鍵字super主要用在繼承機(jī)制中,它指向super所在類的直接父類,主要有兩種使用方式:一是在子類構(gòu)造方法中調(diào)用父類的構(gòu)造方法;二是調(diào)用父類的普通方法。317.2.1調(diào)用父類構(gòu)造方法7.2.2調(diào)用父類普通方法7.2.2調(diào)用父類普通方法32關(guān)鍵字super可調(diào)用父類的方法,所用語(yǔ)法如下:super.方法名();或super.方法名(參數(shù));內(nèi)容7.1繼承7.2super7.3方法重寫7.4final7.5密封類337.6Object類7.7多態(tài)性7.14抽象類與接口7.8動(dòng)態(tài)綁定7.9對(duì)象轉(zhuǎn)換7.10抽象類7.11抽象類示例7.12接口7.13接口示例子類繼承父類,子類可以增加新的屬性、增加新的方法方法重寫(MethodOverriding):重新定義從父類繼承而來(lái)的方法347.3方法重寫7.3方法重寫:重寫標(biāo)注@Override重寫標(biāo)注(overrideannotation):@Override表示被標(biāo)注的方法必須重寫父類的一個(gè)方法。如果具有該標(biāo)注的地方?jīng)]有重寫父類的方法,編譯器將報(bào)告一個(gè)錯(cuò)誤。357.3方法重寫子類中重寫的方法必須和父類中被重寫的方法具有相同的方法簽名,具有一樣或兼容的返回類型。兼容的含義是指子類中重寫方法的返回類型可以是父類中被重寫方法的返回類型的子類型。舉例說(shuō)明36PersonStudentABPersonf(inti)Personf(inti)ORStudentf(inti)注意事項(xiàng)(1)7.3方法重寫僅當(dāng)實(shí)例方法是可訪問(wèn)時(shí),它才能被重寫。父類的私有方法不能被子類重寫如果子類定義的方法在父類存在同名私有方法,這兩個(gè)方法完全沒(méi)有關(guān)系37注意事項(xiàng)(2)387-7下面說(shuō)法是否正確?()
可以重寫父類中定義的私有方法。正確錯(cuò)誤AB提交單選題1分7.3方法重寫重寫方法時(shí),不能降低方法的可訪問(wèn)性。具體來(lái)說(shuō),父類中被重寫方法的可見(jiàn)性修飾符是public,那么子類中重寫方法的可見(jiàn)性修飾符必須是public。父類中被重寫方法的可見(jiàn)性修飾符是protected,那么子類中重寫方法的可見(jiàn)性修飾符可以是protected或public。。39注意事項(xiàng)(3)7.3方法重寫靜態(tài)方法能夠被繼承,但不能被重寫。如果子類重新定義父類中的靜態(tài)方法,那么父類的靜態(tài)方法會(huì)被隱藏。如果需要調(diào)用父類被隱藏的靜態(tài)方法,可以使用語(yǔ)法“父類名.靜態(tài)方法名(實(shí)際參數(shù)列表)”調(diào)用。40注意事項(xiàng)(4)417-8下面說(shuō)法是否正確?()
可以重寫父類中定義的靜態(tài)方法。正確錯(cuò)誤AB提交單選題1分7.3方法重寫方法重寫與方法重載的區(qū)別:方法重寫發(fā)生在具有繼承關(guān)系的不同類中;方法重載既可以發(fā)生在同一個(gè)類中,也可以發(fā)生在不同類中。方法重寫要求方法簽名相同;而方法重載要求方法名相同而方法簽名不同。42注意事項(xiàng)(5)7.3方法重寫:重寫vs.重載重載:同樣的方法名,方法簽名不同重寫:方法簽名相同,在子類中提供一個(gè)對(duì)方法的新的實(shí)現(xiàn)。舉例說(shuō)明:4344重載重寫457-9如果子類中的方法具有和它父類中的方法相同的簽名,且返回值類型也相同,那么這是方法重載還是方法重寫?()方法重載方法重寫AB提交單選題1分467-10如果子類中的方法具有和它父類中的方法相同的名字,但參數(shù)類型不同,那么這是方法重載還是方法重寫?()方法重載方法重寫AB提交單選題1分內(nèi)容7.1繼承7.2super7.3方法重寫7.4final7.5密封類477.6Object類7.7多態(tài)性7.14抽象類與接口7.8動(dòng)態(tài)綁定7.9對(duì)象轉(zhuǎn)換7.10抽象類7.11抽象類示例7.12接口7.13接口示例7.4final有時(shí)候,可能希望防止類擴(kuò)展。在這種情況,使用final修飾符表明一個(gè)類是最終的,不能作為父類。String、StringBuilder、StringBuffer就是最終類。例:publicfinalclassClsA{}當(dāng)希望一個(gè)方法不被子類重寫時(shí),也可以定義一個(gè)方法是最終的。例:48publicclassClsB{ publicfinalvoidm1(){}}最終類不能被擴(kuò)展:
finalclassMath{...}最終變量是一個(gè)常量:
finalstaticdoublePI=3.14159;最終方法不能被子類重寫497.4final507-11下面哪個(gè)類不能被擴(kuò)展?()classA{}classA{privateA(){}}finalclassA{}classA{protectedA(){}}ABCD提交單選題1分內(nèi)容7.1繼承7.2super7.3方法重寫7.4final7.5密封類517.6Object類7.7多態(tài)性7.14抽象類與接口7.8動(dòng)態(tài)綁定7.9對(duì)象轉(zhuǎn)換7.10抽象類7.11抽象類示例7.12接口7.13接口示例7.5密封類Java17的新特性之一是正式引入了密封類(Sealedclass)。為什么引入密封類呢?這是為了對(duì)繼承能力進(jìn)行限制。在面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言中,繼承可以用來(lái)實(shí)現(xiàn)代碼復(fù)用。然而,有時(shí)候我們不希望繼承被濫用,不希望一個(gè)類被繼承后去做一些不可預(yù)知的擴(kuò)展,或者不希望一個(gè)類任意被擴(kuò)展(一個(gè)類的子類可能需要限于其開(kāi)發(fā)者所知的那些子類)。如果一個(gè)類被聲明為密封類,那么該類的所有直接子類都是已知的,并且不能再有其他直接子類。這種方式對(duì)一個(gè)類的所有直接子類進(jìn)行顯式和詳盡的控制。直接子類也可以被聲明為密封的,以進(jìn)一步控制類的層次結(jié)構(gòu)。因此,密封類有助于在繼承中創(chuàng)建有限且可確定的類層次結(jié)構(gòu)。527.5密封類Java語(yǔ)言使用sealed關(guān)鍵字聲明密封類,使用permit關(guān)鍵字聲明哪個(gè)類可以是直接子類。而繼承密封類的子類必須被聲明為sealed或non-sealed或final。下面以一個(gè)示例來(lái)說(shuō)明密封類的聲明。該示例有一個(gè)抽象形狀類Shape,是密封類。允許Shape類三個(gè)子類(圓類Circle、矩形類Rect、三角形Triangle),不允許有其他子類。53packageedu.example.Chapter7;publicabstractsealedclassShape
permitsCircle,Rect,Triangle{…}547-12Java語(yǔ)言使用
[填空1]
關(guān)鍵字聲明密封類,使用
[填空2]
關(guān)鍵聲明哪個(gè)類可以是直接子類。作答填空題2分7.5密封類如果Shape類的子類位于同一命名模塊的不同包中,那么在permits之后要指明子類的完整路徑。例如:55packageedu.example.Chapter7;publicabstractsealedclassShapepermitsedu.example.geometry.Circle,edu.example.shape1.Rect,edu.exmaple.shape2.Triangle{…}7.5密封類當(dāng)一個(gè)密封類與其數(shù)量不多的子類聲明在相同的源文件時(shí),可以省略permits語(yǔ)句,Java編譯器會(huì)從源文件的聲明中推斷出permits的子類。例如,56publicabstractsealedclassClsRoot{… finalclassClsAextendsClsRoot{…} finalclassClsBextendsClsRoot{…} finalclassClsCextendsClsRoot{…}}7.5密封類密封類對(duì)其允許的子類有三個(gè)約束:(1)密封類及其允許的子類必須屬于同一個(gè)模塊。另外,如果密封類及其允許的子類在未命名的模塊中聲明,那么它們必須屬于同一個(gè)包。(2)每個(gè)允許的子類都必須直接繼承密封類。(3)每個(gè)允許的子類都必須使用三個(gè)修飾符(final、sealed、non-sealed)之一來(lái)描述它如何傳播由其父類發(fā)起的密封:①允許的子類可以被聲明為final,以防止其在類層次結(jié)構(gòu)中的一部分被進(jìn)一步擴(kuò)展(允許的子類無(wú)法再擴(kuò)展)。②允許的子類可以再次被聲明為密封類(sealed),這樣允許的子類能以一種受限制的方式進(jìn)一步擴(kuò)展。③允許的子類可以聲明為非密封的(non-sealed),這樣允許的子類可以被任意的擴(kuò)展(未知的子類也可以被擴(kuò)展)。密封類不能阻止其允許的子類聲明為non-sealed。577.5密封類下面對(duì)前面的示例進(jìn)行擴(kuò)充和改寫展示子類修飾符的使用,如下所示:[1]行: packageedu.example.Chapter7;[2]行: publicabstractsealedclassShapepermitsCircle,Rect,Triangle,OddShape{…}[3]行: publicfinalclassCircleextendsShape{…}[4]行: publicsealedclassRectextendsShapepermitsFilledRect,TransparentRect{…}[5]行: publicfinalclassFilledRectextendsRect{…}[6]行: publicfinalclassTransparentRectextendsRect{…}[7]行: publicnon-sealedclassOddShapeextendsShape{…}58597-13密封類及其允許的子類必須屬于同一個(gè)
[填空1]
作答填空題1分607-14一個(gè)允許的子類只能使用三個(gè)修飾符(
[填空1])中的一個(gè)來(lái)進(jìn)行修飾,不能同時(shí)使用多個(gè)進(jìn)行修飾。(多個(gè)修飾符之間用頓號(hào)、分隔)作答填空題1.5分內(nèi)容7.1繼承7.2super7.3方法重寫7.4final7.5密封類617.6Object類7.7多態(tài)性7.14抽象類與接口7.8動(dòng)態(tài)綁定7.9對(duì)象轉(zhuǎn)換7.10抽象類7.11抽象類示例7.12接口7.13接口示例7.6ObjectJava中的所有類都繼承自java.lang.Object類。如果在定義一個(gè)類時(shí)沒(méi)有指定繼承性,那么這個(gè)類的父類被默認(rèn)為是Object.類Object提供了一個(gè)無(wú)參構(gòu)造方法:publicObject()。類Object的子類的構(gòu)造方法會(huì)默認(rèn)調(diào)用類Object的無(wú)參構(gòu)造方法。
627.6Object類Object常見(jiàn)方法clone:對(duì)象之間的拷貝方法,默認(rèn)實(shí)現(xiàn)是淺拷貝。equals:默認(rèn)實(shí)現(xiàn)比較兩個(gè)對(duì)象的引用值而不是內(nèi)容。finalize:由垃圾回收機(jī)制調(diào)用的protected方法。getClass:在運(yùn)行時(shí)刻返回對(duì)象的類類型。toString:返回一個(gè)對(duì)象的字符串表示其他方法:hashCode,wait,notify,notifyAll637.6.1方法toString()調(diào)用一個(gè)對(duì)象的toString()會(huì)返回一個(gè)描述該對(duì)象的字符串。默認(rèn)情況下,它返回一個(gè)字符串:該對(duì)象所屬類名、@、該對(duì)象16進(jìn)制形式的內(nèi)存地址組成的字符串。64Loanloan=newLoan();System.out.println(loan.toString());輸出結(jié)果:Loan@15037e5演示1:程序清單7-6SimpleCircle.java演示2:程序清單7-7SimpleCircle1.java7.6.2方法equals()在Object類中,equals方法的缺省實(shí)現(xiàn)如下:65publicbooleanequals(Objectobj){returnthis==obj;}equals方法的默認(rèn)實(shí)現(xiàn)與==功能一樣,判斷兩個(gè)對(duì)象是否具有相同的引用。方法equals()在JavaAPI的許多類中被重寫,其功能不再是比較兩個(gè)引用變量是否指向同一個(gè)對(duì)象,而是比較兩個(gè)對(duì)象的內(nèi)容是否相同。例如,java.lang.String對(duì)方法equals()進(jìn)行了重寫,用于比較兩個(gè)字符串對(duì)象的內(nèi)容是否相等。Strings1=newString("Hello");Strings2="Hello";Strings3="Hello";7.6.2方法equals()比較運(yùn)算符==用來(lái)比較兩個(gè)基本數(shù)據(jù)類型的值是否相等,或判斷兩個(gè)對(duì)象是否具有相同的引用。如果比較兩個(gè)對(duì)象的內(nèi)容,需重寫equals方法。重寫equals方法,應(yīng)使用equals(Objectobj)。而不應(yīng)該使用equals(SomeClassNameobj)。程序演示:程序清單7-8Circle1.java66677-15Object類的equals()方法默認(rèn)實(shí)現(xiàn)的功能與==操作符功能是一樣,用于兩個(gè)對(duì)象的引用是否相等。這句話是否正確()正確錯(cuò)誤AB提交單選題1分內(nèi)容7.1繼承7.2super7.3方法重寫7.4final7.5密封類687.6Object類7.7多態(tài)性7.14抽象類與接口7.8動(dòng)態(tài)綁定7.9對(duì)象轉(zhuǎn)換7.10抽象類7.11抽象類示例7.12接口7.13接口示例7.7多態(tài)性一個(gè)父類引用變量既可以引用一個(gè)父類類型的對(duì)象,又可以引用其任何一個(gè)子類類型的對(duì)象多態(tài)性存在的三個(gè)必要條件:第一要有繼承第二要有方法重寫第三父類引用變量指向其子類對(duì)象示例:程序清單7-9、程序清單7-10、程序清單7-11、程序清單7-12分別展示Shape、Circle、Rect、TestShapes的代碼,其繼承層次圖如上69707-16多態(tài)性存在的3個(gè)必要條件()有繼承有方法重寫有方法重載父類變量指向子類變量ABCD提交子類變量指向父類變量E多選題1分內(nèi)容7.1繼承7.2super7.3方法重寫7.4final7.5密封類717.6Object類7.7多態(tài)性7.14抽象類與接口7.8動(dòng)態(tài)綁定7.9對(duì)象轉(zhuǎn)換7.10抽象類7.11抽象類示例7.12接口7.13接口示例7.8動(dòng)態(tài)綁定動(dòng)態(tài)綁定(dynamicbinding)是實(shí)現(xiàn)多態(tài)性的關(guān)鍵技術(shù),是指在運(yùn)行期間判斷所引用對(duì)象的實(shí)際類型,根據(jù)其實(shí)際類型調(diào)用相應(yīng)的方法。例如,在7.6節(jié)的示例中,程序清單7-12中的方法display根據(jù)父類引用變量s所引用的實(shí)際類型,調(diào)用相應(yīng)的方法。publicstaticvoiddisplay(Shapes){ System.out.println(s.toString()+".面積:"+s.getArea());}當(dāng)父類引用變量s指向圓對(duì)象c時(shí),被調(diào)用的方法是類Circle的方法toString和方法getArea。當(dāng)父類引用變量s指向矩形對(duì)象r時(shí),被調(diào)用的方法是類Rect的方法toString和方法getArea。727.8動(dòng)態(tài)綁定為了更好地理解動(dòng)態(tài)綁定的概念,引入兩個(gè)概念:聲明類型和實(shí)際類型。聲明類型(declaredtype):一個(gè)變量被聲明為某種類型實(shí)際類型(actualtype):被變量引用的對(duì)象的實(shí)際類型。如:s的聲明類型是Shape,實(shí)際類型可能是Circle或Rect調(diào)用哪個(gè)對(duì)象的toString方法和getArea方法,由對(duì)象s的實(shí)際類型決定。737.8動(dòng)態(tài)綁定首先,假設(shè)C1類是Object類的直接子類,C2類是C1類的直接子類,C3類是C2類的直接子類,依次類推,Cn是Cn-1的直接子類。其次,假設(shè)對(duì)象obj的聲明類型是Object類,那么對(duì)象obj的實(shí)際類型可以是類C1、C2、…、Cn中的任何一個(gè)。這時(shí),如果對(duì)象obj調(diào)用了一個(gè)方法func(),那么在編譯階段,編譯器根據(jù)對(duì)象obj的聲明類型匹配方法的簽名,完成編譯,這個(gè)過(guò)程也被稱為方法匹配。在運(yùn)行階段,JVM會(huì)根據(jù)對(duì)象obj的實(shí)際類型綁定具體的方法實(shí)現(xiàn)。747.8動(dòng)態(tài)綁定下面分兩種情況進(jìn)行說(shuō)明。情況1,方法func()在Object的所有子類中進(jìn)行了重寫,那么在運(yùn)行階段,JVM會(huì)根據(jù)對(duì)象obj的實(shí)際類型Ci綁定Ci類的方法實(shí)現(xiàn)。情況2,方法func()只是在部分子類中進(jìn)行了重寫,那么JVM在進(jìn)行方法綁定時(shí),會(huì)從對(duì)象obj的實(shí)際類型Ci開(kāi)始,沿著繼承鏈向Object方向?qū)ふ乙粋€(gè)最近的方法實(shí)現(xiàn)。例如,假設(shè)對(duì)象obj的實(shí)際類型是Cn,而Cn、Cn-1、Cn-2沒(méi)有對(duì)方法p進(jìn)行重寫,而Cn-3、…、C2、C1對(duì)方法func()進(jìn)行了重寫,那么在進(jìn)行方法綁定時(shí),會(huì)綁定Cn-3類的方法實(shí)現(xiàn)。程序演示:程序清單7-13Cuboid.java75767-17以下哪項(xiàng)陳述是錯(cuò)誤的?()始終可以將子類的實(shí)例傳遞給其超類類型的參數(shù)。這個(gè)特性被稱為多態(tài)性。A編譯器根據(jù)參數(shù)類型、參數(shù)數(shù)量和編譯時(shí)參數(shù)的順序來(lái)查找匹配方法。B一個(gè)方法可以在幾個(gè)子類中實(shí)現(xiàn),Java虛擬機(jī)在運(yùn)行時(shí)動(dòng)態(tài)綁定方法的實(shí)現(xiàn)。C動(dòng)態(tài)綁定可以應(yīng)用于靜態(tài)方法。D動(dòng)態(tài)綁定可以應(yīng)用于實(shí)例方法。E提交單選題1分內(nèi)容7.1繼承7.2super7.3方法重寫7.4final7.5密封類777.6Object類7.7多態(tài)性7.14抽象類與接口7.8動(dòng)態(tài)綁定7.9對(duì)象轉(zhuǎn)換7.10抽象類7.11抽象類示例7.12接口7.13接口示例對(duì)象轉(zhuǎn)換:一類對(duì)象的引用可以類型轉(zhuǎn)換為對(duì)另一類對(duì)象的引用。例:Shapes=c;//c是Circle類的一個(gè)實(shí)例,隱式轉(zhuǎn)換Circlec2=s;//子類對(duì)象的引用指向父類的一個(gè)對(duì)象,編譯器會(huì)報(bào)錯(cuò)顯式轉(zhuǎn)換:Circlec2=(Shape)s;//向下轉(zhuǎn)換向上轉(zhuǎn)換(upcasting):總是可以將一個(gè)子類的實(shí)例轉(zhuǎn)換為一個(gè)父類的變量。向下轉(zhuǎn)換(downcasting):當(dāng)把一個(gè)父類的實(shí)例轉(zhuǎn)換為它的子類變量時(shí),必須使用轉(zhuǎn)換記號(hào)“(子類名)”進(jìn)行顯式轉(zhuǎn)換。為了使向下轉(zhuǎn)換成功,必須確保父類變量引用的對(duì)象是子類的一個(gè)實(shí)例。當(dāng)父類變量引用的對(duì)象不是子類的實(shí)例時(shí),向下轉(zhuǎn)換會(huì)導(dǎo)致一個(gè)運(yùn)行異常ClassCastException。787.9對(duì)象轉(zhuǎn)換Shapes=newCircle();//合法正確,s指向一個(gè)Circle的實(shí)例Rectr2=(Rect)s;//產(chǎn)生運(yùn)行時(shí)錯(cuò)誤797-18給定下面的類和對(duì)象: classC1{}; classC2extendsC1{}; classC3extendsC1{}; C2c2=newC2(); C3c3=newC3();分析如下語(yǔ)句:c2=(C2)((C1)c3);c3成功轉(zhuǎn)換為c2你將遇到一個(gè)運(yùn)行時(shí)錯(cuò)誤,因?yàn)槟悴荒軐?duì)象轉(zhuǎn)換為兄弟對(duì)象你將遇到一個(gè)運(yùn)行時(shí)錯(cuò)誤,因?yàn)镴ava運(yùn)行時(shí)系統(tǒng)不能以嵌套形式執(zhí)行多個(gè)類型轉(zhuǎn)換語(yǔ)句是正確的ABCD提交單選題2分807.9對(duì)象轉(zhuǎn)換在進(jìn)行向下轉(zhuǎn)換時(shí),為了避免編譯時(shí)正確而運(yùn)行時(shí)出現(xiàn)錯(cuò)誤,一個(gè)好的、慣用的做法是在進(jìn)行向下轉(zhuǎn)換之前,利用instanceof運(yùn)算符判斷父類引用變量的實(shí)際類型。例如,下面的一段代碼改寫方法display的實(shí)現(xiàn):voiddisplay(Shapes){if(sinstanceofCircle)//判斷s是否指向類Circle的一個(gè)實(shí)例
System.out.println(“這是一個(gè)圓,半徑為:”+((Circle)s).getRadius());…}在這個(gè)例子中,類Shape沒(méi)有方法getRadius,只有類Circle有g(shù)etRadius(),因此,如果沒(méi)有將s向下轉(zhuǎn)換指向一個(gè)圓對(duì)象,那么使用s.getRadius()會(huì)引起編譯錯(cuò)誤。通過(guò)向下轉(zhuǎn)換,s被轉(zhuǎn)換成Circle的一個(gè)實(shí)例,再調(diào)用方法getRadius就沒(méi)有問(wèn)題了。817-19給定下面的代碼:classC1{}classC2extendsC1{}classC3extendsC2{}classC4extendsC1{}c1instanceofC1c2instanceofC1c3instanceofC1c4instanceofC2ABCD提交C1c1=newC1();C2c2=newC2();C3c3=newC3();C4c4=newC4();下列哪個(gè)表達(dá)式的值是false?()單選題1分內(nèi)容7.1繼承7.2super7.3方法重寫7.4final7.5密封類827.6Object類7.7多態(tài)性7.14抽象類與接口7.8動(dòng)態(tài)綁定7.9對(duì)象轉(zhuǎn)換7.10抽象類7.11抽象類示例7.12接口7.13接口示例7.10抽象類83現(xiàn)實(shí)世界存在一些抽象的概念。水果車動(dòng)物植物抽象概念書(shū)比賽這些抽象概念沒(méi)有具體實(shí)例抽象概念可由抽象類表示,抽象類是沒(méi)有具體實(shí)例的類7.10抽象類84在Java語(yǔ)言中,使用關(guān)鍵字abstract修飾抽象類的定義。例如,定義一個(gè)公有抽象類的一般形式如下:publicabstractclass類名{….}//一個(gè)公有抽象類的定義抽象方法是沒(méi)有具體實(shí)現(xiàn)的方法,即無(wú)需定義方法體。定義抽象方法時(shí),需要在方法頭的返回值類型之前使用關(guān)鍵字abstract進(jìn)行修飾定義一個(gè)公有抽象方法的一般形式如下:
publicabstract返回值類型方法名(形式參數(shù)列表);//一個(gè)公有抽象方法定義示例:ShapeObj類、CircleObj類、RectObj類、TestShapeObjs類。這些類的代碼分別如程序清單7-14、程序清單7-15、程序清單7-16、程序清單7-17所示。857-20抽象類定義時(shí),必須使用[填空1]關(guān)鍵字修飾類的定義。作答填空題1分7.10抽象類86關(guān)于抽象類,下面幾點(diǎn)需要注意:(1)抽象類定義時(shí),使用abstract關(guān)鍵字修飾類的定義。(2)抽象類不能使用new關(guān)鍵字創(chuàng)建自己的實(shí)例,例如,抽象類ShapeObj類不能創(chuàng)建自己的實(shí)例。具體來(lái)說(shuō),下面語(yǔ)句:ShapeObjobj=newShapeObj();//在編譯時(shí),會(huì)產(chǎn)生編譯錯(cuò)誤但可聲明一個(gè)ShapeObj類型的引用變量,讓其指向一個(gè)子類實(shí)例,如下所示:ShapeObjsObj=newCircleObj(3);//抽象父類變量sObj指向一個(gè)子類實(shí)例還可以使用new關(guān)鍵字定義抽象類的數(shù)組,如下所示:ShapeObj[]shapes=newShapeObj[10];shapes[0]=newRect(2,3);877-21抽象類不能使用new關(guān)鍵字創(chuàng)建自己的實(shí)例和對(duì)象數(shù)組,這句話是否正確?()正確錯(cuò)誤AB提交單選題1分887-22假定A是一個(gè)抽象類,B是繼承A類的一個(gè)具體子類,A和B均有無(wú)參構(gòu)造方法,下列語(yǔ)句正確的是()Aa=newA();Aa=newB();Bb=newA();Bb=newB();ABCD提交多選題1分7.10抽象類89關(guān)于抽象類,下面幾點(diǎn)需要注意:(3)通常,抽象類的構(gòu)造方法應(yīng)被設(shè)計(jì)成protected權(quán)限,僅被其子類調(diào)用。(4)抽象方法沒(méi)有方法體的定義,在方法頭中使用abstract關(guān)鍵字。(5)一個(gè)具體子類繼承了抽象類,該具體子類必須實(shí)現(xiàn)抽象父類中定義的所有抽象方法。(6)如果一個(gè)類繼承了抽象類,但沒(méi)有實(shí)現(xiàn)抽象父類中定義的所有抽象方法,那么該類也會(huì)成為一個(gè)抽象類。907-23一個(gè)抽象類必須含有至少一個(gè)抽象方法,這句話是否正確?()正確錯(cuò)誤AB提交單選題1分7.10抽象類91關(guān)于抽象類,下面幾點(diǎn)需要注意:(7)含有抽象方法的類必須被定義為抽象類,然而,一個(gè)抽象類可以沒(méi)有抽象方法。(8)抽象方法是非靜態(tài)的。靜態(tài)方法不能被定義為抽象的。這是因?yàn)槌橄蠓椒ㄊ菦](méi)有實(shí)現(xiàn)的,而靜態(tài)方法在一個(gè)類加載到JVM時(shí),就可以被調(diào)用和使用,靜態(tài)方法是必須要有方法實(shí)現(xiàn)的。(9)子類可以重寫父類的方法并將它們定義為抽象的,在這種情況下,子類由于存在抽象方法,所以必須被定義為抽象類。這種做法雖然很少見(jiàn),但是在希望父類的某個(gè)方法實(shí)現(xiàn)在子類中變得無(wú)效時(shí),這種做法還是有用的。927-24下列關(guān)于抽象方法的描述,哪些是正確的()抽象類可以使用抽象類的構(gòu)造方法創(chuàng)建實(shí)例。抽象類可以被擴(kuò)展。非抽象超類的子類可以是抽象的。子類可以重寫超類中的具體方法來(lái)聲明它是抽象的。ABCD提交抽象方法可以是靜態(tài)方法E多選題1分內(nèi)容7.1繼承7.2super7.3方法重寫7.4final7.5密封類937.6Object類7.7多態(tài)性7.14抽象類與接口7.8動(dòng)態(tài)綁定7.9對(duì)象轉(zhuǎn)換7.10抽象類7.11抽象類示例7.12接口7.13接口示例7.11抽象類示例947.11.1抽象類Calendar和子類GregorianCalendar7.11.2抽象類Number及其子類7.11.1抽象類Calendar和子類GregorianCalendarjava.util.Calendar是一個(gè)抽象類,可用于表示詳細(xì)的日歷信息,例如,年、月、日、時(shí)、分、秒等。Calendar類的具體子類可以實(shí)現(xiàn)特定的日歷系統(tǒng)。Java語(yǔ)言內(nèi)建支持公歷日歷系統(tǒng)的實(shí)現(xiàn)。95抽象類Calendar的常量數(shù)據(jù)域7.11.1抽象類Calendar和子類GregorianCalendar96抽象類Calendar的常量數(shù)據(jù)域7.11.1抽象類Calendar和子類GregorianCalendar97抽象類Calendar的構(gòu)造方法與部分常用方法7.11.1抽象類Calendar和子類GregorianCalendar98抽象類Calendar的構(gòu)造方法與部分常用方法7.11.1抽象類Calendar和子類GregorianCalendar99抽象類Calendar的構(gòu)造方法與部分常用方法1007-25Java語(yǔ)言的日歷系統(tǒng)中,每周的第一天,美國(guó)是Monday,法國(guó)是Sunday,這句話是否正確?()正確錯(cuò)誤AB提交單選題1分此題未設(shè)置答案,請(qǐng)點(diǎn)擊右側(cè)設(shè)置按鈕7.11.1抽象類Calendar和子類GregorianCalendar101java.util.GreGorianCalendar(公歷類)繼承了抽象類Calendar,其數(shù)據(jù)域具有默認(rèn)值。7.11.1抽象類Calendar和子類GregorianCalendar102GreGorianCalendar構(gòu)造方法7.11.1抽象類Calendar和子類GregorianCalendar程序演示:程序清單7-18TestCalendar.java方法getMaximum(Calendar.DAY_OF_MONTH)可獲得當(dāng)月的實(shí)際天數(shù)1037.11抽象類示例1047.11.1抽象類Calendar和子類GregorianCalendar7.11.2抽象類Number及其子類7.11.2抽象類Number及其子類1054個(gè)方法各子類實(shí)現(xiàn)調(diào)用intValue()實(shí)現(xiàn)程序演示:程序清單7-19TestNumberClasses.java內(nèi)容7.1繼承7.2super7.3方法重寫7.4final7.5密封類1067.6Object類7.7多態(tài)性7.14抽象類與接口7.8動(dòng)態(tài)綁定7.9對(duì)象轉(zhuǎn)換7.10抽象類7.11抽象類示例7.12接口7.13接口示例7.12接口1077.12.1普通接口聲明7.12.2接口實(shí)現(xiàn)7.12.3父接口與子接口7.12.4默認(rèn)方法、靜態(tài)和私有方法7.12.5默認(rèn)方法沖突7.12.6密封接口7.12.7注解與注解接口7.12.1普通接口聲明普通接口聲明的簡(jiǎn)單形式:[接口修飾符]interface接口名{ /**常量聲明*/ /**抽象方法聲明*/}接口名通常是形容詞示例:接口體中定義的常量,都是公有的static常量,允許省略public、final、static修飾符。108publicinterfaceComputable{finalintMAX=1000;finalintMIN=1;voidadd(Computableobj);voidsubstract(Computableobj);}publicinterfaceComputable{intMAX=1000;voidadd(Computableobj);voidsubstract(Computableobj);}publicinterfaceComputable{publicstaticfinalintMAX=1000;publicabstractvoidadd(Computableobj);publicabstractvoidsubstract(Computableobj);}等價(jià)1097-26下列哪個(gè)是一個(gè)正確的接口?()interfaceA{voidprint(){};}abstractinterfaceA{print();}abstractinterfaceA{abstractvoidprint(){};}interfaceA{voidprint();}ABCD提交單選題1分7.12接口1107.12.1普通接口聲明7.12.2接口實(shí)現(xiàn)7.12.3父接口與子接口7.12.4默認(rèn)方法、靜態(tài)和私有方法7.12.5默認(rèn)方法沖突7.12.6密封接口7.12.7注解與注解接口7.12.2接口實(shí)現(xiàn)接口與實(shí)現(xiàn)該接口的類之間的關(guān)系稱為接口實(shí)現(xiàn)或接口繼承接口實(shí)現(xiàn)使用關(guān)鍵字implements,其一般形式如下:[修飾符]class類名[extends父類名]implements接口1[,接口2][,接口3][,…]{ …}該類需要實(shí)現(xiàn)這些接口中的所有抽象方法雖然接口不是類,但是Java語(yǔ)言把接口看做一種特殊的類。與類一樣,每個(gè)接口被編譯為獨(dú)立的字節(jié)碼文件。1117.12.2接口實(shí)現(xiàn)接口可將一組不相關(guān)的類組織在一起。示例:這些類的代碼分別如程序清單7-20~7-26當(dāng)傳遞給接口類型變量的對(duì)象的實(shí)際類型不同時(shí),就會(huì)回調(diào)不同類實(shí)現(xiàn)的接口方法,這也被稱為接口回調(diào)。1121137-27接口與實(shí)現(xiàn)該接口的類之間的關(guān)系稱為
[填空1]
或
[填空2]。
作答填空題2分7.12接口1147.12.1普通接口聲明7.12.2接口實(shí)現(xiàn)7.12.3父接口與子接口7.12.4默認(rèn)方法、靜態(tài)和私有方法7.12.5默認(rèn)方法沖突7.12.6密封接口7.12.7注解與注解接口7.12.3父接口與子接口一個(gè)接口可以通過(guò)關(guān)鍵字extends擴(kuò)展多個(gè)接口,一般形式如下:publicinterface接口名extends接口名1[,接口名2][,…][,接口名n]{…}被聲明的接口是子接口,被擴(kuò)展的接口是父接口(或超級(jí)接口)子接口會(huì)繼承所有父接口的成員。一個(gè)實(shí)現(xiàn)了某個(gè)接口的類必須實(shí)現(xiàn)該接口及其所有父接口中定義的抽象方法。115publicinterfaceI1extendsI2,I3{…}I1obj1;/*obj1既是子接口I1的引用變量,也是父接口I2、I3的引用變量*/7.12接口1167.12.1普通接口聲明7.12.2接口實(shí)現(xiàn)7.12.3父接口與子接口7.12.4默認(rèn)方法、靜態(tài)和私有方法7.12.5默認(rèn)方法沖突7.12.6密封接口7.12.7注解與注解接口7.12.4默認(rèn)方法、靜態(tài)和私有方法自Java8開(kāi)始,接口中的方法是允許有默認(rèn)實(shí)現(xiàn)的,稱為默認(rèn)方法。使用關(guān)鍵字default定義默認(rèn)方法。例如,interfaceTop{defaultStringname(){return"unnamed";}}默認(rèn)方法在實(shí)現(xiàn)該接口的類中可以被重寫,也可以無(wú)須進(jìn)行重寫。1171187-28接口中定義默認(rèn)方法必須使用的關(guān)鍵字是
[填空1]
作答填空題1分7.12.4默認(rèn)方法、靜態(tài)和私有方法從Java8開(kāi)始,允許在接口中定義公有靜態(tài)方法。公有靜態(tài)方法可以通過(guò)接口名直接調(diào)用,與類中公有靜態(tài)方法的使用是一樣的。從Java9開(kāi)始,允許在接口中定義私有方法。這些私有方法的用法有限,只能作為接口中其他方法的輔助方法。119publicinterfaceDemoInterface1{//公有靜態(tài)方法publicstaticintgetObjCount(){return0;}…}interfaceDemoInterface2{//私有靜態(tài)方法privatestaticvoiddislay(){System.out.println
("defaultprivateimplementation!");}//私有實(shí)例方法privateintgetAttribute(){return1;}…}7.12接口1207.12.1普通接口聲明7.12.2接口實(shí)現(xiàn)7.12.3父接口與子接口7.12.4默認(rèn)方法、靜態(tài)和私有方法7.12.5默認(rèn)方法沖突7.12.6密封接口7.12.7注解與注解接口7.12.5默認(rèn)方法沖突問(wèn)題:一個(gè)類可以繼承一個(gè)類,實(shí)現(xiàn)多個(gè)接口。如果一個(gè)被實(shí)現(xiàn)的接口中定義了一個(gè)默認(rèn)方法,而在父類或另一個(gè)實(shí)現(xiàn)的接口中存在同樣的方法,這種沖突,該如何解決?Java語(yǔ)言的處理規(guī)則如下:(1)接口與父類沖突。如果父類提供了一個(gè)具體方法,那么接口中具有相同方法簽名的默認(rèn)方法會(huì)被忽略,即采取父類優(yōu)先的原則。(2)接口沖突。如果一個(gè)接口提供了一個(gè)默認(rèn)方法,另一個(gè)接口提供了一個(gè)方法簽名相同的方法,那么必須重寫這個(gè)方法來(lái)解決沖突。示例:程序清單7-27Student.java-規(guī)則1程序清單7-28Teacher.java-規(guī)則21211227-29當(dāng)被實(shí)現(xiàn)的接口與被繼承的父類存在方法沖突時(shí),如果父類提供了一個(gè)具體方法,那么接口中具有相同方法簽名的默認(rèn)方法會(huì)被忽略,即采取
[填空1]
的原則。作答填空題1分1237-30當(dāng)被實(shí)現(xiàn)的兩個(gè)接口存在方法沖突時(shí),如果一個(gè)接口提供了一個(gè)默認(rèn)方法,另一個(gè)接口提供了一個(gè)方法簽名相同的方法,那么必須
[填空1]
這個(gè)方法來(lái)解決沖突。作答填空題1分7.12接口1247.12.1普通接口聲明7.12.2接口實(shí)現(xiàn)7.12.3父接口與子接口7.12.4默認(rèn)方法、靜態(tài)和私有方法7.12.5默認(rèn)方法沖突7.12.6密封接口7.12.7注解與注解接口7.12.6密封接口如果一個(gè)接口的所有直接子類或子接口是已知的,那么該接口可以被聲明為密封的(sealed),即密封接口。與密封類相似,Java語(yǔ)言可以使用關(guān)鍵字sealed對(duì)接口進(jìn)行密封,使用關(guān)鍵字permits指定允許的實(shí)現(xiàn)類和子接口125sealedinterfaceEatablepermitsFruit,Vegetable,egg,Cooked{…}abstractsealedclassFruitimplementsEatablepermitsApple,Orange{…}finalclassAppleextendsFruit{…}finalclassOrangeextendsFruit{…}abstractnon-sealedclassVegetableimplementsEatable{…}finalclasseggimplementsEatable{…}non-sealedinterfaceCookedextendsEatable{…}接口Eatable是密封接口,它有三個(gè)直接子類Fruit、Vegetable、egg和一個(gè)子接口Cooked。子類Fruit是一個(gè)密封的抽象類,限定了兩個(gè)子類Apple、Orange。子類Vegetable是一個(gè)非密封的抽象類,可以任意擴(kuò)展。子類egg是一個(gè)最終類,不允許被擴(kuò)展。一個(gè)非密封的子接口Cooked擴(kuò)展了密封接口Eatable7.12.6密封接口關(guān)于密封接口的幾點(diǎn)說(shuō)明。(1)當(dāng)一個(gè)接口的所有直接超級(jí)接口都不是密封接口,自身也不是密封的,該接口是可以被任意擴(kuò)展的。(2)一個(gè)具有直接密封超級(jí)接口的子接口當(dāng)且僅當(dāng)它被聲明為非密封(non-sealed)時(shí),它才是可以被任意擴(kuò)展的。(3)如果一個(gè)接口沒(méi)有密封的超級(jí)接口,那么該接口不能被聲明為non-sealed,否則,會(huì)產(chǎn)生編譯錯(cuò)誤。(4)如果一個(gè)接口繼承了一個(gè)密封的超級(jí)接口,那么該子接口必須被聲明為sealed或non-sealed,否則,會(huì)產(chǎn)生編譯錯(cuò)誤。(5)如果一個(gè)密封接口在一個(gè)命名模塊中,那么在permits語(yǔ)句中指定的類或接口,也必須在同一個(gè)模塊中。(6)如果一個(gè)密封接口在一個(gè)未命名模塊中,那么在permits語(yǔ)句中指定的類或接口,也必須在同一個(gè)包中。1261277-31如果一個(gè)接口沒(méi)有密封的超級(jí)接口,那么該接口不能被聲明為non-sealed,否則,會(huì)產(chǎn)生
[填空1]
。
作答填空題1分1287-32如果一個(gè)接口繼承了一個(gè)密封的超級(jí)接口,那么該子接口必須被聲明為
[填空1]
或
[填空2]
,否則,會(huì)產(chǎn)生編譯錯(cuò)誤。作答填空題2
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 機(jī)器人課件培訓(xùn)內(nèi)容
- 活動(dòng)培訓(xùn)標(biāo)題名稱大全
- 洪水災(zāi)后疫情防控知識(shí)
- 2026年經(jīng)濟(jì)學(xué)專業(yè)考試宏觀經(jīng)濟(jì)與微觀經(jīng)濟(jì)分析試題集
- 2026年旅游管理專業(yè)模擬試題旅游目的地開(kāi)發(fā)與規(guī)劃
- 2026年體育教練員技能考核試題及答案
- 2026年會(huì)計(jì)職稱中級(jí)會(huì)計(jì)報(bào)表重點(diǎn)題
- 2026年汽車維修技師發(fā)動(dòng)機(jī)維修方向技能測(cè)試題
- 2026年市場(chǎng)營(yíng)銷策略應(yīng)用實(shí)操題集與評(píng)分標(biāo)準(zhǔn)
- 2026年環(huán)境工程師中級(jí)職稱考試環(huán)境監(jiān)測(cè)與治理方案設(shè)計(jì)案例題
- 武漢市江岸區(qū)2022-2023學(xué)年七年級(jí)上學(xué)期期末地理試題【帶答案】
- 自動(dòng)駕駛系統(tǒng)關(guān)鍵技術(shù)
- 完整工資表模板(帶公式)
- 奇瑞汽車QC小組成果匯報(bào)材料
- 英語(yǔ)四級(jí)詞匯表
- 藥用高分子材料-高分子材料概述
- 社區(qū)春節(jié)活動(dòng)方案
- CTT2000LM用戶手冊(cè)(維護(hù)分冊(cè))
- 川2020J146-TJ 建筑用輕質(zhì)隔墻條板構(gòu)造圖集
- 新員工入職申請(qǐng)表模板
- 貝多芬鋼琴奏鳴曲2告別-降E大調(diào)-Op81a-E-flat-major鋼琴譜樂(lè)譜
評(píng)論
0/150
提交評(píng)論