Java程序設計基礎 課件 第7章 OOP-p2_第1頁
Java程序設計基礎 課件 第7章 OOP-p2_第2頁
Java程序設計基礎 課件 第7章 OOP-p2_第3頁
Java程序設計基礎 課件 第7章 OOP-p2_第4頁
Java程序設計基礎 課件 第7章 OOP-p2_第5頁
已閱讀5頁,還剩136頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第7章面向對象程序設計(下)1教學目標(1) 理解父類和子類的關系,使用關鍵字extends擴展一個類(2) 理解protected訪問權限,應用訪問修飾符實現更好的信息隱藏(3) 理解子類構造方法的執行,掌握super的用法。(4) 理解在子類中重寫父類方法,能應用方法重寫(5) 使用final關鍵字防止類的繼承和方法重寫(6) 理解密封類的定義和用途(7) 理解Object類,能應用和重寫其常用方法toString()、equals()(8) 掌握多態和動態綁定(9) 掌握對象的類型轉換(10) 掌握抽象類的概念和應用,理解抽象類示例(11) 掌握接口的概念,掌握接口的聲明和使用(12) 掌握父接口、子接口、默認方法及其沖突的解決(13) 理解密封接口和注解接口(14) 理解接口的示例(15) 理解抽象類與接口的區別(16) 理解面向對象程序設計的5個原則2引言(1/3)3假設要定義一個類,對圓、矩形、三角形建模。這些類有很多共同的特性(畫線顏色、填充與否、創建時間等等)。引言(2/3)4設計這些類,如何避免冗余,還能使系統易于理解和易于維護?答案是:繼承,可提煉公共屬性和行為創建一個通用的幾何對象類Shape軟件重用:在擴展創建新的幾何形狀時,可以進一步重用Shape例如:正六邊形、正五邊形、梯形等引言(3/3)Stoptryingtoreinventthewheel,可能是每個程序員入行被告知的一條準則軟件重用繼承:一種基于源代碼的重用機制多態:解決類的功能和行為在繼承體系中的再抽象5內容7.1繼承7.2super7.3方法重寫7.4final7.5密封類67.6Object類7.7多態性7.14抽象類與接口7.8動態綁定7.9對象轉換7.10抽象類7.11抽象類示例7.12接口7.13接口示例內容7.1繼承7.2super7.3方法重寫7.4final7.5密封類77.6Object類7.7多態性7.14抽象類與接口7.8動態綁定7.9對象轉換7.10抽象類7.11抽象類示例7.12接口7.13接口示例7.1繼承87.1.1父類與子類7.1.2protected數據和方法7.1.1父類與子類Java語言是一種單繼承的語言,在父類的基礎上定義其子類的一般語法形式為:publicclass子類名extends父類名{子類的新成員}需要說明的是:(1)子類名是一個合法的標識符,由用戶自己定義。(2)關鍵字extends用在子類名之后,指定父類名,父類只允許有一個。(3)父類名必須是程序中已有的一個類的類名。(4)父類名之后是子類的類體,由一對花括號{}括起來,這對花括號中的內容是子類新定義的成員。97.1.1父類與子類銀行賬戶類Account借記卡賬戶DebitCardAccount(不允許透支,具有余額)信用卡賬戶CreditCardAccount(允許透支,但有限額)這兩種賬戶都共享銀行賬戶Account的共同特征,并有新增功能。107.1.1父類與子類銀行賬戶類Account、借記卡賬戶類DebitCardAccount、信用卡賬戶類CreditCardAccount的源代碼分別在程序清單7-1、程序清單7-2、程序清單7-3中給出程序清單7-4TestCreditDebitAccount.java,對上述類進行測試117.1.1父類與子類基于上述示例,Java語言的繼承機制需要注意的是:(1)Java語言是一種單繼承語言,即子類繼承父類使用關鍵字extends時,extends之后只能有一個父類名。(2)子類繼承父類的內容,還可以新增內容和重寫繼承的內容。因此,子類不是父類的子集。(3)據Java語言官方文檔,子類繼承了父類中所有可被訪問的成員(數據域和方法),但是構造方法不屬于這類成員,父類構造方法不被能子類繼承。然而,父類構造方法可以被子類調用,用于完成子類的初始化工作。例如,程序清單7-2第20行就是父類構造方法調用。(4)據Java語言官方文檔,子類既不能繼承父類的私有成員,也不能直接訪問這些私有成員。如果父類定義了訪問私有成員的公有或保護方法,那么子類可以通過這些父類的公有或保護方法間接訪問這些私有成員。(5)不是所有“是一種(is-a)”關系都應該用繼承來建模。例如,正方形是一種矩形,但是不應該定義一個正方形類繼承自矩形類。127.1.1父類與子類注意:關于父類私有成員的繼承問題辨析。從內存分配上講,子類確實繼承父類的私有成員。因為在實例化一個子類對象時,系統先為父類中定義的數據域(包括私有成員)分配內存,再為子類中定義的數據域分配內存,所有這些數據域都是屬于這個新創建的對象,只不過子類對象不能直接訪問其父類的私有成員。為了較為形象地說明這種情況,可以說子類“隱蔽”繼承了父類的私有成員。因此,從繼承的物理實現上講,子類繼承了其父類的所有成員,包括私有成員。這個說法,有助于我們理解為什么子類構造方法會先調用父類構造方法,父類構造方法是用于初始化父類自身的私有數據域。雖然父類私有數據域不能被子類直接訪問,但是也被子類繼承了。因此,在創建子類對象時,必須先調用父類構造方法初始化父類的私有數據域。然而,Java語言官方文檔說明子類不能繼承父類的私有成員,這個說法可從可訪問性上來理解。由于父類私有成員不能像子類自身的私有成員一樣被訪問,所以父類私有成員可以被看做未被繼承。這兩個說法都可以接受。為了避免混淆,本書采納了Java語言官方文檔的說明。然而,程序員也應理解,從繼承的物理實現(內存分配)上來講,子類確實繼承了父類的私有成員。13147-1一個子類是父類的子集,這句話是否正確()正確錯誤AB提交單選題1分157-2定義一個子類,使用關鍵字

[填空1]

作答正常使用填空題需3.0以上版本雨課堂填空題1分7.1繼承167.1.1父類與子類7.1.2protected數據和方法7.1.2protected數據和方法protected修飾符能修飾一個類的數據域和方法。一個public類的被保護數據域和方法可以被同一包中的任何類訪問或任何子類訪問(即使子類不在同一包中)可見性修飾符public、protected、private,指定了類和類的成員的可見性(或可訪問性)。這些修飾符的可見性按下面順序遞增,如下圖所示。177.1.2protected數據和方法在不同修飾符修飾一個public類(公有類)的成員時類中成員的可訪問性187.1.2protected數據和方法197.1.2protected數據和方法關鍵字protected和private只能用于修飾類的成員,而關鍵字public既能用于修飾類的成員,也能用于修飾類。在繼承機制下,為了實現更好的信息隱藏,最好是在父類中使用可見性修飾符protected。在父類中使用protected聲明的成員,被繼承后在子類中就像公有成員一樣,可由子類方法直接訪問。然而,在子類之外,父類的保護成員在其他包的類看來則像私有成員一樣,不能被直接訪問,從而實現了更好的信息隱藏。20217-3判斷正誤:protected的可見性低于包私有的可見性,()正確錯誤AB提交單選題1分227-4以下哪項陳述是錯誤的?()公有類可以被來自不同包的類訪問。不同包中的類無法訪問一個類的私有方法。受保護的方法可被不同包中的子類訪問。沒有可見性修飾符的方法可以被不同包中的類訪問。ABCD提交單選題1分內容7.1繼承7.2super7.3方法重寫7.4final7.5密封類237.6Object類7.7多態性7.14抽象類與接口7.8動態綁定7.9對象轉換7.10抽象類7.11抽象類示例7.12接口7.13接口示例7.2super關鍵字super主要用在繼承機制中,它指向super所在類的直接父類,主要有兩種使用方式:一是在子類構造方法中調用父類的構造方法;二是調用父類的普通方法。247.2.1調用父類構造方法7.2.2調用父類普通方法25父類構造方法不能被子類繼承。父類構造方法必須被子類顯式或隱式調用。顯式調用需使用super關鍵字。隱式調用無須編寫調用語句。

顯式調用父類構造方法的語法是:

super();或者

super(實際參數列表);而且,super()或super(實際參數列表)必須出現在子類構造方法的第一行。這是顯式調用父類構造方法的唯一形式。7.2.1調用父類構造方法26如果子類構造方法沒有顯式調用父類構造方法,那么編譯器會將super()做為子類構造方法的第一條語句。例如,

7.2.1調用父類構造方法7.2.1調用父類構造方法子類構造方法在構建一個子類實例時被調用執行。子類構造方法在執行時,會沿著繼承鏈從根類Object出發向下依次調用所有父類的構造方法,最后執行子類自身的初始化語句程序清單7-5ClsD.java27287-5下面的說法是否正確?()當從子類調用構造方法時,它父類的無參構造方法總是會被調用。正確錯誤AB提交單選題1分297-6一個子類對象被創建時,子類自身的構造方法先執行,再依次執行其父類的構造方法,最終完成對象的創建。這句話是否正確()正確錯誤AB提交單選題1分30publicclassAppleextendsFruit{}

classFruit{publicFruit(Stringname){System.out.println("Fruit'sconstructorisinvoked");}}尋找下面這段代碼的錯誤討論題:討論父類沒有無參構造方法的影響設計指南:一般情況下,最好能為每個類提供一個無參構造方法,以便于對該類進行擴展,同時避免錯誤。7.2super關鍵字super主要用在繼承機制中,它指向super所在類的直接父類,主要有兩種使用方式:一是在子類構造方法中調用父類的構造方法;二是調用父類的普通方法。317.2.1調用父類構造方法7.2.2調用父類普通方法7.2.2調用父類普通方法32關鍵字super可調用父類的方法,所用語法如下:super.方法名();或super.方法名(參數);內容7.1繼承7.2super7.3方法重寫7.4final7.5密封類337.6Object類7.7多態性7.14抽象類與接口7.8動態綁定7.9對象轉換7.10抽象類7.11抽象類示例7.12接口7.13接口示例子類繼承父類,子類可以增加新的屬性、增加新的方法方法重寫(MethodOverriding):重新定義從父類繼承而來的方法347.3方法重寫7.3方法重寫:重寫標注@Override重寫標注(overrideannotation):@Override表示被標注的方法必須重寫父類的一個方法。如果具有該標注的地方沒有重寫父類的方法,編譯器將報告一個錯誤。357.3方法重寫子類中重寫的方法必須和父類中被重寫的方法具有相同的方法簽名,具有一樣或兼容的返回類型。兼容的含義是指子類中重寫方法的返回類型可以是父類中被重寫方法的返回類型的子類型。舉例說明36PersonStudentABPersonf(inti)Personf(inti)ORStudentf(inti)注意事項(1)7.3方法重寫僅當實例方法是可訪問時,它才能被重寫。父類的私有方法不能被子類重寫如果子類定義的方法在父類存在同名私有方法,這兩個方法完全沒有關系37注意事項(2)387-7下面說法是否正確?()

可以重寫父類中定義的私有方法。正確錯誤AB提交單選題1分7.3方法重寫重寫方法時,不能降低方法的可訪問性。具體來說,父類中被重寫方法的可見性修飾符是public,那么子類中重寫方法的可見性修飾符必須是public。父類中被重寫方法的可見性修飾符是protected,那么子類中重寫方法的可見性修飾符可以是protected或public。。39注意事項(3)7.3方法重寫靜態方法能夠被繼承,但不能被重寫。如果子類重新定義父類中的靜態方法,那么父類的靜態方法會被隱藏。如果需要調用父類被隱藏的靜態方法,可以使用語法“父類名.靜態方法名(實際參數列表)”調用。40注意事項(4)417-8下面說法是否正確?()

可以重寫父類中定義的靜態方法。正確錯誤AB提交單選題1分7.3方法重寫方法重寫與方法重載的區別:方法重寫發生在具有繼承關系的不同類中;方法重載既可以發生在同一個類中,也可以發生在不同類中。方法重寫要求方法簽名相同;而方法重載要求方法名相同而方法簽名不同。42注意事項(5)7.3方法重寫:重寫vs.重載重載:同樣的方法名,方法簽名不同重寫:方法簽名相同,在子類中提供一個對方法的新的實現。舉例說明:4344重載重寫457-9如果子類中的方法具有和它父類中的方法相同的簽名,且返回值類型也相同,那么這是方法重載還是方法重寫?()方法重載方法重寫AB提交單選題1分467-10如果子類中的方法具有和它父類中的方法相同的名字,但參數類型不同,那么這是方法重載還是方法重寫?()方法重載方法重寫AB提交單選題1分內容7.1繼承7.2super7.3方法重寫7.4final7.5密封類477.6Object類7.7多態性7.14抽象類與接口7.8動態綁定7.9對象轉換7.10抽象類7.11抽象類示例7.12接口7.13接口示例7.4final有時候,可能希望防止類擴展。在這種情況,使用final修飾符表明一個類是最終的,不能作為父類。String、StringBuilder、StringBuffer就是最終類。例:publicfinalclassClsA{}當希望一個方法不被子類重寫時,也可以定義一個方法是最終的。例:48publicclassClsB{ publicfinalvoidm1(){}}最終類不能被擴展:

finalclassMath{...}最終變量是一個常量:

finalstaticdoublePI=3.14159;最終方法不能被子類重寫497.4final507-11下面哪個類不能被擴展?()classA{}classA{privateA(){}}finalclassA{}classA{protectedA(){}}ABCD提交單選題1分內容7.1繼承7.2super7.3方法重寫7.4final7.5密封類517.6Object類7.7多態性7.14抽象類與接口7.8動態綁定7.9對象轉換7.10抽象類7.11抽象類示例7.12接口7.13接口示例7.5密封類Java17的新特性之一是正式引入了密封類(Sealedclass)。為什么引入密封類呢?這是為了對繼承能力進行限制。在面向對象程序設計語言中,繼承可以用來實現代碼復用。然而,有時候我們不希望繼承被濫用,不希望一個類被繼承后去做一些不可預知的擴展,或者不希望一個類任意被擴展(一個類的子類可能需要限于其開發者所知的那些子類)。如果一個類被聲明為密封類,那么該類的所有直接子類都是已知的,并且不能再有其他直接子類。這種方式對一個類的所有直接子類進行顯式和詳盡的控制。直接子類也可以被聲明為密封的,以進一步控制類的層次結構。因此,密封類有助于在繼承中創建有限且可確定的類層次結構。527.5密封類Java語言使用sealed關鍵字聲明密封類,使用permit關鍵字聲明哪個類可以是直接子類。而繼承密封類的子類必須被聲明為sealed或non-sealed或final。下面以一個示例來說明密封類的聲明。該示例有一個抽象形狀類Shape,是密封類。允許Shape類三個子類(圓類Circle、矩形類Rect、三角形Triangle),不允許有其他子類。53packageedu.example.Chapter7;publicabstractsealedclassShape

permitsCircle,Rect,Triangle{…}547-12Java語言使用

[填空1]

關鍵字聲明密封類,使用

[填空2]

關鍵聲明哪個類可以是直接子類。作答填空題2分7.5密封類如果Shape類的子類位于同一命名模塊的不同包中,那么在permits之后要指明子類的完整路徑。例如:55packageedu.example.Chapter7;publicabstractsealedclassShapepermitsedu.example.geometry.Circle,edu.example.shape1.Rect,edu.exmaple.shape2.Triangle{…}7.5密封類當一個密封類與其數量不多的子類聲明在相同的源文件時,可以省略permits語句,Java編譯器會從源文件的聲明中推斷出permits的子類。例如,56publicabstractsealedclassClsRoot{… finalclassClsAextendsClsRoot{…} finalclassClsBextendsClsRoot{…} finalclassClsCextendsClsRoot{…}}7.5密封類密封類對其允許的子類有三個約束:(1)密封類及其允許的子類必須屬于同一個模塊。另外,如果密封類及其允許的子類在未命名的模塊中聲明,那么它們必須屬于同一個包。(2)每個允許的子類都必須直接繼承密封類。(3)每個允許的子類都必須使用三個修飾符(final、sealed、non-sealed)之一來描述它如何傳播由其父類發起的密封:①允許的子類可以被聲明為final,以防止其在類層次結構中的一部分被進一步擴展(允許的子類無法再擴展)。②允許的子類可以再次被聲明為密封類(sealed),這樣允許的子類能以一種受限制的方式進一步擴展。③允許的子類可以聲明為非密封的(non-sealed),這樣允許的子類可以被任意的擴展(未知的子類也可以被擴展)。密封類不能阻止其允許的子類聲明為non-sealed。577.5密封類下面對前面的示例進行擴充和改寫展示子類修飾符的使用,如下所示:[1]行: packageedu.example.Chapter7;[2]行: publicabstractsealedclassShapepermitsCircle,Rect,Triangle,OddShape{…}[3]行: publicfinalclassCircleextendsShape{…}[4]行: publicsealedclassRectextendsShapepermitsFilledRect,TransparentRect{…}[5]行: publicfinalclassFilledRectextendsRect{…}[6]行: publicfinalclassTransparentRectextendsRect{…}[7]行: publicnon-sealedclassOddShapeextendsShape{…}58597-13密封類及其允許的子類必須屬于同一個

[填空1]

作答填空題1分607-14一個允許的子類只能使用三個修飾符(

[填空1])中的一個來進行修飾,不能同時使用多個進行修飾。(多個修飾符之間用頓號、分隔)作答填空題1.5分內容7.1繼承7.2super7.3方法重寫7.4final7.5密封類617.6Object類7.7多態性7.14抽象類與接口7.8動態綁定7.9對象轉換7.10抽象類7.11抽象類示例7.12接口7.13接口示例7.6ObjectJava中的所有類都繼承自java.lang.Object類。如果在定義一個類時沒有指定繼承性,那么這個類的父類被默認為是Object.類Object提供了一個無參構造方法:publicObject()。類Object的子類的構造方法會默認調用類Object的無參構造方法。

627.6Object類Object常見方法clone:對象之間的拷貝方法,默認實現是淺拷貝。equals:默認實現比較兩個對象的引用值而不是內容。finalize:由垃圾回收機制調用的protected方法。getClass:在運行時刻返回對象的類類型。toString:返回一個對象的字符串表示其他方法:hashCode,wait,notify,notifyAll637.6.1方法toString()調用一個對象的toString()會返回一個描述該對象的字符串。默認情況下,它返回一個字符串:該對象所屬類名、@、該對象16進制形式的內存地址組成的字符串。64Loanloan=newLoan();System.out.println(loan.toString());輸出結果:Loan@15037e5演示1:程序清單7-6SimpleCircle.java演示2:程序清單7-7SimpleCircle1.java7.6.2方法equals()在Object類中,equals方法的缺省實現如下:65publicbooleanequals(Objectobj){returnthis==obj;}equals方法的默認實現與==功能一樣,判斷兩個對象是否具有相同的引用。方法equals()在JavaAPI的許多類中被重寫,其功能不再是比較兩個引用變量是否指向同一個對象,而是比較兩個對象的內容是否相同。例如,java.lang.String對方法equals()進行了重寫,用于比較兩個字符串對象的內容是否相等。Strings1=newString("Hello");Strings2="Hello";Strings3="Hello";7.6.2方法equals()比較運算符==用來比較兩個基本數據類型的值是否相等,或判斷兩個對象是否具有相同的引用。如果比較兩個對象的內容,需重寫equals方法。重寫equals方法,應使用equals(Objectobj)。而不應該使用equals(SomeClassNameobj)。程序演示:程序清單7-8Circle1.java66677-15Object類的equals()方法默認實現的功能與==操作符功能是一樣,用于兩個對象的引用是否相等。這句話是否正確()正確錯誤AB提交單選題1分內容7.1繼承7.2super7.3方法重寫7.4final7.5密封類687.6Object類7.7多態性7.14抽象類與接口7.8動態綁定7.9對象轉換7.10抽象類7.11抽象類示例7.12接口7.13接口示例7.7多態性一個父類引用變量既可以引用一個父類類型的對象,又可以引用其任何一個子類類型的對象多態性存在的三個必要條件:第一要有繼承第二要有方法重寫第三父類引用變量指向其子類對象示例:程序清單7-9、程序清單7-10、程序清單7-11、程序清單7-12分別展示Shape、Circle、Rect、TestShapes的代碼,其繼承層次圖如上69707-16多態性存在的3個必要條件()有繼承有方法重寫有方法重載父類變量指向子類變量ABCD提交子類變量指向父類變量E多選題1分內容7.1繼承7.2super7.3方法重寫7.4final7.5密封類717.6Object類7.7多態性7.14抽象類與接口7.8動態綁定7.9對象轉換7.10抽象類7.11抽象類示例7.12接口7.13接口示例7.8動態綁定動態綁定(dynamicbinding)是實現多態性的關鍵技術,是指在運行期間判斷所引用對象的實際類型,根據其實際類型調用相應的方法。例如,在7.6節的示例中,程序清單7-12中的方法display根據父類引用變量s所引用的實際類型,調用相應的方法。publicstaticvoiddisplay(Shapes){ System.out.println(s.toString()+".面積:"+s.getArea());}當父類引用變量s指向圓對象c時,被調用的方法是類Circle的方法toString和方法getArea。當父類引用變量s指向矩形對象r時,被調用的方法是類Rect的方法toString和方法getArea。727.8動態綁定為了更好地理解動態綁定的概念,引入兩個概念:聲明類型和實際類型。聲明類型(declaredtype):一個變量被聲明為某種類型實際類型(actualtype):被變量引用的對象的實際類型。如:s的聲明類型是Shape,實際類型可能是Circle或Rect調用哪個對象的toString方法和getArea方法,由對象s的實際類型決定。737.8動態綁定首先,假設C1類是Object類的直接子類,C2類是C1類的直接子類,C3類是C2類的直接子類,依次類推,Cn是Cn-1的直接子類。其次,假設對象obj的聲明類型是Object類,那么對象obj的實際類型可以是類C1、C2、…、Cn中的任何一個。這時,如果對象obj調用了一個方法func(),那么在編譯階段,編譯器根據對象obj的聲明類型匹配方法的簽名,完成編譯,這個過程也被稱為方法匹配。在運行階段,JVM會根據對象obj的實際類型綁定具體的方法實現。747.8動態綁定下面分兩種情況進行說明。情況1,方法func()在Object的所有子類中進行了重寫,那么在運行階段,JVM會根據對象obj的實際類型Ci綁定Ci類的方法實現。情況2,方法func()只是在部分子類中進行了重寫,那么JVM在進行方法綁定時,會從對象obj的實際類型Ci開始,沿著繼承鏈向Object方向尋找一個最近的方法實現。例如,假設對象obj的實際類型是Cn,而Cn、Cn-1、Cn-2沒有對方法p進行重寫,而Cn-3、…、C2、C1對方法func()進行了重寫,那么在進行方法綁定時,會綁定Cn-3類的方法實現。程序演示:程序清單7-13Cuboid.java75767-17以下哪項陳述是錯誤的?()始終可以將子類的實例傳遞給其超類類型的參數。這個特性被稱為多態性。A編譯器根據參數類型、參數數量和編譯時參數的順序來查找匹配方法。B一個方法可以在幾個子類中實現,Java虛擬機在運行時動態綁定方法的實現。C動態綁定可以應用于靜態方法。D動態綁定可以應用于實例方法。E提交單選題1分內容7.1繼承7.2super7.3方法重寫7.4final7.5密封類777.6Object類7.7多態性7.14抽象類與接口7.8動態綁定7.9對象轉換7.10抽象類7.11抽象類示例7.12接口7.13接口示例對象轉換:一類對象的引用可以類型轉換為對另一類對象的引用。例:Shapes=c;//c是Circle類的一個實例,隱式轉換Circlec2=s;//子類對象的引用指向父類的一個對象,編譯器會報錯顯式轉換:Circlec2=(Shape)s;//向下轉換向上轉換(upcasting):總是可以將一個子類的實例轉換為一個父類的變量。向下轉換(downcasting):當把一個父類的實例轉換為它的子類變量時,必須使用轉換記號“(子類名)”進行顯式轉換。為了使向下轉換成功,必須確保父類變量引用的對象是子類的一個實例。當父類變量引用的對象不是子類的實例時,向下轉換會導致一個運行異常ClassCastException。787.9對象轉換Shapes=newCircle();//合法正確,s指向一個Circle的實例Rectr2=(Rect)s;//產生運行時錯誤797-18給定下面的類和對象: classC1{}; classC2extendsC1{}; classC3extendsC1{}; C2c2=newC2(); C3c3=newC3();分析如下語句:c2=(C2)((C1)c3);c3成功轉換為c2你將遇到一個運行時錯誤,因為你不能將對象轉換為兄弟對象你將遇到一個運行時錯誤,因為Java運行時系統不能以嵌套形式執行多個類型轉換語句是正確的ABCD提交單選題2分807.9對象轉換在進行向下轉換時,為了避免編譯時正確而運行時出現錯誤,一個好的、慣用的做法是在進行向下轉換之前,利用instanceof運算符判斷父類引用變量的實際類型。例如,下面的一段代碼改寫方法display的實現:voiddisplay(Shapes){if(sinstanceofCircle)//判斷s是否指向類Circle的一個實例

System.out.println(“這是一個圓,半徑為:”+((Circle)s).getRadius());…}在這個例子中,類Shape沒有方法getRadius,只有類Circle有getRadius(),因此,如果沒有將s向下轉換指向一個圓對象,那么使用s.getRadius()會引起編譯錯誤。通過向下轉換,s被轉換成Circle的一個實例,再調用方法getRadius就沒有問題了。817-19給定下面的代碼:classC1{}classC2extendsC1{}classC3extendsC2{}classC4extendsC1{}c1instanceofC1c2instanceofC1c3instanceofC1c4instanceofC2ABCD提交C1c1=newC1();C2c2=newC2();C3c3=newC3();C4c4=newC4();下列哪個表達式的值是false?()單選題1分內容7.1繼承7.2super7.3方法重寫7.4final7.5密封類827.6Object類7.7多態性7.14抽象類與接口7.8動態綁定7.9對象轉換7.10抽象類7.11抽象類示例7.12接口7.13接口示例7.10抽象類83現實世界存在一些抽象的概念。水果車動物植物抽象概念書比賽這些抽象概念沒有具體實例抽象概念可由抽象類表示,抽象類是沒有具體實例的類7.10抽象類84在Java語言中,使用關鍵字abstract修飾抽象類的定義。例如,定義一個公有抽象類的一般形式如下:publicabstractclass類名{….}//一個公有抽象類的定義抽象方法是沒有具體實現的方法,即無需定義方法體。定義抽象方法時,需要在方法頭的返回值類型之前使用關鍵字abstract進行修飾定義一個公有抽象方法的一般形式如下:

publicabstract返回值類型方法名(形式參數列表);//一個公有抽象方法定義示例:ShapeObj類、CircleObj類、RectObj類、TestShapeObjs類。這些類的代碼分別如程序清單7-14、程序清單7-15、程序清單7-16、程序清單7-17所示。857-20抽象類定義時,必須使用[填空1]關鍵字修飾類的定義。作答填空題1分7.10抽象類86關于抽象類,下面幾點需要注意:(1)抽象類定義時,使用abstract關鍵字修飾類的定義。(2)抽象類不能使用new關鍵字創建自己的實例,例如,抽象類ShapeObj類不能創建自己的實例。具體來說,下面語句:ShapeObjobj=newShapeObj();//在編譯時,會產生編譯錯誤但可聲明一個ShapeObj類型的引用變量,讓其指向一個子類實例,如下所示:ShapeObjsObj=newCircleObj(3);//抽象父類變量sObj指向一個子類實例還可以使用new關鍵字定義抽象類的數組,如下所示:ShapeObj[]shapes=newShapeObj[10];shapes[0]=newRect(2,3);877-21抽象類不能使用new關鍵字創建自己的實例和對象數組,這句話是否正確?()正確錯誤AB提交單選題1分887-22假定A是一個抽象類,B是繼承A類的一個具體子類,A和B均有無參構造方法,下列語句正確的是()Aa=newA();Aa=newB();Bb=newA();Bb=newB();ABCD提交多選題1分7.10抽象類89關于抽象類,下面幾點需要注意:(3)通常,抽象類的構造方法應被設計成protected權限,僅被其子類調用。(4)抽象方法沒有方法體的定義,在方法頭中使用abstract關鍵字。(5)一個具體子類繼承了抽象類,該具體子類必須實現抽象父類中定義的所有抽象方法。(6)如果一個類繼承了抽象類,但沒有實現抽象父類中定義的所有抽象方法,那么該類也會成為一個抽象類。907-23一個抽象類必須含有至少一個抽象方法,這句話是否正確?()正確錯誤AB提交單選題1分7.10抽象類91關于抽象類,下面幾點需要注意:(7)含有抽象方法的類必須被定義為抽象類,然而,一個抽象類可以沒有抽象方法。(8)抽象方法是非靜態的。靜態方法不能被定義為抽象的。這是因為抽象方法是沒有實現的,而靜態方法在一個類加載到JVM時,就可以被調用和使用,靜態方法是必須要有方法實現的。(9)子類可以重寫父類的方法并將它們定義為抽象的,在這種情況下,子類由于存在抽象方法,所以必須被定義為抽象類。這種做法雖然很少見,但是在希望父類的某個方法實現在子類中變得無效時,這種做法還是有用的。927-24下列關于抽象方法的描述,哪些是正確的()抽象類可以使用抽象類的構造方法創建實例。抽象類可以被擴展。非抽象超類的子類可以是抽象的。子類可以重寫超類中的具體方法來聲明它是抽象的。ABCD提交抽象方法可以是靜態方法E多選題1分內容7.1繼承7.2super7.3方法重寫7.4final7.5密封類937.6Object類7.7多態性7.14抽象類與接口7.8動態綁定7.9對象轉換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是一個抽象類,可用于表示詳細的日歷信息,例如,年、月、日、時、分、秒等。Calendar類的具體子類可以實現特定的日歷系統。Java語言內建支持公歷日歷系統的實現。95抽象類Calendar的常量數據域7.11.1抽象類Calendar和子類GregorianCalendar96抽象類Calendar的常量數據域7.11.1抽象類Calendar和子類GregorianCalendar97抽象類Calendar的構造方法與部分常用方法7.11.1抽象類Calendar和子類GregorianCalendar98抽象類Calendar的構造方法與部分常用方法7.11.1抽象類Calendar和子類GregorianCalendar99抽象類Calendar的構造方法與部分常用方法1007-25Java語言的日歷系統中,每周的第一天,美國是Monday,法國是Sunday,這句話是否正確?()正確錯誤AB提交單選題1分此題未設置答案,請點擊右側設置按鈕7.11.1抽象類Calendar和子類GregorianCalendar101java.util.GreGorianCalendar(公歷類)繼承了抽象類Calendar,其數據域具有默認值。7.11.1抽象類Calendar和子類GregorianCalendar102GreGorianCalendar構造方法7.11.1抽象類Calendar和子類GregorianCalendar程序演示:程序清單7-18TestCalendar.java方法getMaximum(Calendar.DAY_OF_MONTH)可獲得當月的實際天數1037.11抽象類示例1047.11.1抽象類Calendar和子類GregorianCalendar7.11.2抽象類Number及其子類7.11.2抽象類Number及其子類1054個方法各子類實現調用intValue()實現程序演示:程序清單7-19TestNumberClasses.java內容7.1繼承7.2super7.3方法重寫7.4final7.5密封類1067.6Object類7.7多態性7.14抽象類與接口7.8動態綁定7.9對象轉換7.10抽象類7.11抽象類示例7.12接口7.13接口示例7.12接口1077.12.1普通接口聲明7.12.2接口實現7.12.3父接口與子接口7.12.4默認方法、靜態和私有方法7.12.5默認方法沖突7.12.6密封接口7.12.7注解與注解接口7.12.1普通接口聲明普通接口聲明的簡單形式:[接口修飾符]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);}等價1097-26下列哪個是一個正確的接口?()interfaceA{voidprint(){};}abstractinterfaceA{print();}abstractinterfaceA{abstractvoidprint(){};}interfaceA{voidprint();}ABCD提交單選題1分7.12接口1107.12.1普通接口聲明7.12.2接口實現7.12.3父接口與子接口7.12.4默認方法、靜態和私有方法7.12.5默認方法沖突7.12.6密封接口7.12.7注解與注解接口7.12.2接口實現接口與實現該接口的類之間的關系稱為接口實現或接口繼承接口實現使用關鍵字implements,其一般形式如下:[修飾符]class類名[extends父類名]implements接口1[,接口2][,接口3][,…]{ …}該類需要實現這些接口中的所有抽象方法雖然接口不是類,但是Java語言把接口看做一種特殊的類。與類一樣,每個接口被編譯為獨立的字節碼文件。1117.12.2接口實現接口可將一組不相關的類組織在一起。示例:這些類的代碼分別如程序清單7-20~7-26當傳遞給接口類型變量的對象的實際類型不同時,就會回調不同類實現的接口方法,這也被稱為接口回調。1121137-27接口與實現該接口的類之間的關系稱為

[填空1]

[填空2]。

作答填空題2分7.12接口1147.12.1普通接口聲明7.12.2接口實現7.12.3父接口與子接口7.12.4默認方法、靜態和私有方法7.12.5默認方法沖突7.12.6密封接口7.12.7注解與注解接口7.12.3父接口與子接口一個接口可以通過關鍵字extends擴展多個接口,一般形式如下:publicinterface接口名extends接口名1[,接口名2][,…][,接口名n]{…}被聲明的接口是子接口,被擴展的接口是父接口(或超級接口)子接口會繼承所有父接口的成員。一個實現了某個接口的類必須實現該接口及其所有父接口中定義的抽象方法。115publicinterfaceI1extendsI2,I3{…}I1obj1;/*obj1既是子接口I1的引用變量,也是父接口I2、I3的引用變量*/7.12接口1167.12.1普通接口聲明7.12.2接口實現7.12.3父接口與子接口7.12.4默認方法、靜態和私有方法7.12.5默認方法沖突7.12.6密封接口7.12.7注解與注解接口7.12.4默認方法、靜態和私有方法自Java8開始,接口中的方法是允許有默認實現的,稱為默認方法。使用關鍵字default定義默認方法。例如,interfaceTop{defaultStringname(){return"unnamed";}}默認方法在實現該接口的類中可以被重寫,也可以無須進行重寫。1171187-28接口中定義默認方法必須使用的關鍵字是

[填空1]

作答填空題1分7.12.4默認方法、靜態和私有方法從Java8開始,允許在接口中定義公有靜態方法。公有靜態方法可以通過接口名直接調用,與類中公有靜態方法的使用是一樣的。從Java9開始,允許在接口中定義私有方法。這些私有方法的用法有限,只能作為接口中其他方法的輔助方法。119publicinterfaceDemoInterface1{//公有靜態方法publicstaticintgetObjCount(){return0;}…}interfaceDemoInterface2{//私有靜態方法privatestaticvoiddislay(){System.out.println

("defaultprivateimplementation!");}//私有實例方法privateintgetAttribute(){return1;}…}7.12接口1207.12.1普通接口聲明7.12.2接口實現7.12.3父接口與子接口7.12.4默認方法、靜態和私有方法7.12.5默認方法沖突7.12.6密封接口7.12.7注解與注解接口7.12.5默認方法沖突問題:一個類可以繼承一個類,實現多個接口。如果一個被實現的接口中定義了一個默認方法,而在父類或另一個實現的接口中存在同樣的方法,這種沖突,該如何解決?Java語言的處理規則如下:(1)接口與父類沖突。如果父類提供了一個具體方法,那么接口中具有相同方法簽名的默認方法會被忽略,即采取父類優先的原則。(2)接口沖突。如果一個接口提供了一個默認方法,另一個接口提供了一個方法簽名相同的方法,那么必須重寫這個方法來解決沖突。示例:程序清單7-27Student.java-規則1程序清單7-28Teacher.java-規則21211227-29當被實現的接口與被繼承的父類存在方法沖突時,如果父類提供了一個具體方法,那么接口中具有相同方法簽名的默認方法會被忽略,即采取

[填空1]

的原則。作答填空題1分1237-30當被實現的兩個接口存在方法沖突時,如果一個接口提供了一個默認方法,另一個接口提供了一個方法簽名相同的方法,那么必須

[填空1]

這個方法來解決沖突。作答填空題1分7.12接口1247.12.1普通接口聲明7.12.2接口實現7.12.3父接口與子接口7.12.4默認方法、靜態和私有方法7.12.5默認方法沖突7.12.6密封接口7.12.7注解與注解接口7.12.6密封接口如果一個接口的所有直接子類或子接口是已知的,那么該接口可以被聲明為密封的(sealed),即密封接口。與密封類相似,Java語言可以使用關鍵字sealed對接口進行密封,使用關鍵字permits指定允許的實現類和子接口125sealedinterfaceEatablepermitsFruit,Vegetable,egg,Cooked{…}abstractsealedclassFruitimplementsEatablepermitsApple,Orange{…}finalclassAppleextendsFruit{…}finalclassOrangeextendsFruit{…}abstractnon-sealedclassVegetableimplementsEatable{…}finalclasseggimplementsEatable{…}non-sealedinterfaceCookedextendsEatable{…}接口Eatable是密封接口,它有三個直接子類Fruit、Vegetable、egg和一個子接口Cooked。子類Fruit是一個密封的抽象類,限定了兩個子類Apple、Orange。子類Vegetable是一個非密封的抽象類,可以任意擴展。子類egg是一個最終類,不允許被擴展。一個非密封的子接口Cooked擴展了密封接口Eatable7.12.6密封接口關于密封接口的幾點說明。(1)當一個接口的所有直接超級接口都不是密封接口,自身也不是密封的,該接口是可以被任意擴展的。(2)一個具有直接密封超級接口的子接口當且僅當它被聲明為非密封(non-sealed)時,它才是可以被任意擴展的。(3)如果一個接口沒有密封的超級接口,那么該接口不能被聲明為non-sealed,否則,會產生編譯錯誤。(4)如果一個接口繼承了一個密封的超級接口,那么該子接口必須被聲明為sealed或non-sealed,否則,會產生編譯錯誤。(5)如果一個密封接口在一個命名模塊中,那么在permits語句中指定的類或接口,也必須在同一個模塊中。(6)如果一個密封接口在一個未命名模塊中,那么在permits語句中指定的類或接口,也必須在同一個包中。1261277-31如果一個接口沒有密封的超級接口,那么該接口不能被聲明為non-sealed,否則,會產生

[填空1]

作答填空題1分1287-32如果一個接口繼承了一個密封的超級接口,那么該子接口必須被聲明為

[填空1]

[填空2]

,否則,會產生編譯錯誤。作答填空題2

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論