程序設(shè)計(jì)教程電子教案第5章繼承_第1頁
程序設(shè)計(jì)教程電子教案第5章繼承_第2頁
程序設(shè)計(jì)教程電子教案第5章繼承_第3頁
程序設(shè)計(jì)教程電子教案第5章繼承_第4頁
程序設(shè)計(jì)教程電子教案第5章繼承_第5頁
已閱讀5頁,還剩46頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、v學(xué)習(xí)導(dǎo)讀學(xué)習(xí)導(dǎo)讀v本章討論面向?qū)ο蟮木幊蹋ū菊掠懻撁嫦驅(qū)ο蟮木幊蹋∣OP)及其關(guān)鍵技術(shù):及其關(guān)鍵技術(shù):繼承和多態(tài)、接口、包。繼承和多態(tài)、接口、包。v繼承性是軟件復(fù)用的一種形式,對降低軟件復(fù)雜繼承性是軟件復(fù)用的一種形式,對降低軟件復(fù)雜性行之有效。繼承性同時(shí)是面向?qū)ο蟪绦蛟O(shè)計(jì)語性行之有效。繼承性同時(shí)是面向?qū)ο蟪绦蛟O(shè)計(jì)語言的特點(diǎn),采用對象但沒有繼承性的語言是基于言的特點(diǎn),采用對象但沒有繼承性的語言是基于對象的語言,但不是面向?qū)ο蟮恼Z言,這是兩者對象的語言,但不是面向?qū)ο蟮恼Z言,這是兩者的區(qū)別。的區(qū)別。v多態(tài)性允許以統(tǒng)一的風(fēng)格處理已存在的變量及相多態(tài)性允許以統(tǒng)一的風(fēng)格處理已存在的變量及相關(guān)的類,使增

2、加系統(tǒng)中新功能變得容易。關(guān)的類,使增加系統(tǒng)中新功能變得容易。第5章 繼承v教學(xué)重點(diǎn)與難點(diǎn)教學(xué)重點(diǎn)與難點(diǎn) v理解繼承和復(fù)用的概念理解繼承和復(fù)用的概念v理解父類和子類理解父類和子類v掌握擴(kuò)展類編程掌握擴(kuò)展類編程v理解多態(tài)性是如何擴(kuò)充和維護(hù)系統(tǒng)性能理解多態(tài)性是如何擴(kuò)充和維護(hù)系統(tǒng)性能v掌握如何建立包和接口掌握如何建立包和接口第5章 繼承第5章 繼承v5.1 繼承的概念繼承的概念v5.2 擴(kuò)展類擴(kuò)展類v5.3 多態(tài)與動(dòng)態(tài)綁定多態(tài)與動(dòng)態(tài)綁定v5.4 構(gòu)造函數(shù)的繼承與重載構(gòu)造函數(shù)的繼承與重載v5.5 包包v5.6 接口接口v5.7 本章小結(jié)本章小結(jié)v5.8 思考與練習(xí)思考與練習(xí)5. 1 繼承的概念繼承性是面

3、向?qū)ο蟪绦蛟O(shè)計(jì)語言的最主要的特點(diǎn),是其繼承性是面向?qū)ο蟪绦蛟O(shè)計(jì)語言的最主要的特點(diǎn),是其他語言(如面向過程語言)所沒有的。他語言(如面向過程語言)所沒有的。 類之間的繼承關(guān)系是現(xiàn)實(shí)世界中遺傳關(guān)系的直接模擬,類之間的繼承關(guān)系是現(xiàn)實(shí)世界中遺傳關(guān)系的直接模擬,它表示類之間的內(nèi)在聯(lián)系以及對屬性和操作的共享,它表示類之間的內(nèi)在聯(lián)系以及對屬性和操作的共享,即子類可以沿用父類(被繼承類)的某些特征。當(dāng)然,即子類可以沿用父類(被繼承類)的某些特征。當(dāng)然,子類也可以具有自己獨(dú)立的屬性和操作。子類也可以具有自己獨(dú)立的屬性和操作。繼承例如,飛行器、汽車和例如,飛行器、汽車和輪船可歸于交通工具類,輪船可歸于交通工具類,

4、飛行器類可以繼承交通飛行器類可以繼承交通工具類某些屬性和操作工具類某些屬性和操作。除遺傳關(guān)系外,現(xiàn)實(shí)世界中除遺傳關(guān)系外,現(xiàn)實(shí)世界中還普遍存在著部分還普遍存在著部分整體關(guān)整體關(guān)系。例如,飛機(jī)可由發(fā)動(dòng)機(jī)、系。例如,飛機(jī)可由發(fā)動(dòng)機(jī)、機(jī)身、機(jī)械控制系統(tǒng)、電子機(jī)身、機(jī)械控制系統(tǒng)、電子控制系統(tǒng)等構(gòu)成。聚集關(guān)系。控制系統(tǒng)等構(gòu)成。聚集關(guān)系。5.1.1 5.1.1 繼承定義繼承定義 繼承性是軟件復(fù)用的一種形式。新類由已存在的類生成,通過保留它們的屬性和行為,并且根據(jù)新類的要求對性能加以修改,添加新的屬性和行為。如果子類只從一個(gè)父類繼承,則稱為單繼承;如果子類從一個(gè)以上父類繼承,則稱為多繼承。注意 Java不支持

5、多重繼承,但它支持“接口”概念。接口使Java獲得了多重繼承的許多優(yōu)點(diǎn),摒棄了相應(yīng)的缺點(diǎn)。 父類名跟在父類名跟在extends 關(guān)鍵字后面,用來說明當(dāng)關(guān)鍵字后面,用來說明當(dāng)前類是哪個(gè)已經(jīng)存在類的前類是哪個(gè)已經(jīng)存在類的子類,存在繼承關(guān)系。子類,存在繼承關(guān)系。 定義定義 雇員類雇員類 Employee 的兩個(gè)子類:的兩個(gè)子類:一般雇員類一般雇員類:CommonEmployee 主主 管管 類類:ManagerEmployee子類從父類繼承有子類從父類繼承有兩個(gè)主要的方面:兩個(gè)主要的方面:(1)屬性的繼承。)屬性的繼承。例如,公司是一個(gè)例如,公司是一個(gè)父類,一個(gè)公司有父類,一個(gè)公司有名稱、地址、經(jīng)理

6、、名稱、地址、經(jīng)理、雇員等,這些都屬雇員等,這些都屬于結(jié)構(gòu)方面。于結(jié)構(gòu)方面。(2)方法的繼承。)方法的繼承。一個(gè)父類定義了若一個(gè)父類定義了若干操作,如一個(gè)公干操作,如一個(gè)公司要有項(xiàng)目、利潤、司要有項(xiàng)目、利潤、任命經(jīng)理、錄用職任命經(jīng)理、錄用職工等操作,子公司工等操作,子公司也將繼承這些行為。也將繼承這些行為。5.2.1 5.2.1 繼承關(guān)系定義繼承關(guān)系定義 5. 2 擴(kuò)展類class CommonEmployee extends Employee 子類子類1: int m_ManagerNo ;定義類屬性定義類屬性m _ManagerNo,代表雇員上司的編號代表雇員上司的編號class Mana

7、gerEmployee extends Employee 子類子類2: int m_SecretaryNo; 定義類屬性定義類屬性m_SecretaryNo,代表秘書的編號代表秘書的編號兩個(gè)子類兩個(gè)子類聲明類頭聲明類頭-父類名父類名5.2.2 5.2.2 屬性繼承與隱藏屬性繼承與隱藏 盡管Employee類是一個(gè)父類,但是并不因?yàn)樗歉割惥鸵馕吨懈嗟墓δ?。恰恰相反,子類比它們的父類具有更多的功能。因?yàn)樽宇愂歉割惖臄U(kuò)展,增加了父類沒有的屬性和方法。(1)子類不能訪問父類的private成員,但子類可以訪問其父類的public,(2)protected訪問是public和private訪問之

8、間一個(gè)保護(hù)性的中間層次。(3)由于被繼承的父類成員沒有在子類聲明中列出,但是這些成員確實(shí)存在于子類中。5.2.2 5.2.2 屬性繼承與隱藏屬性繼承與隱藏 Manger類增添了一個(gè)新的字段用于存儲獎(jiǎng)金,并且增添了一個(gè)新方法用于設(shè)置它的值:class Manager extends Employeepublic void setBonus(double b) bonus=b;private double bonus;5.2.3 方法繼承、覆蓋與重載方法繼承、覆蓋與重載 對于Manager對象,可以使用getName和getHireDay等方法。即使這些方法沒有明顯地在Manager類中定義,它們

9、也自動(dòng)地從Employee類中繼承過來了。2 2方法覆蓋方法覆蓋方法的覆蓋是指:子類定義同名方法來覆蓋父類的方法,是多態(tài)技術(shù)的一個(gè)實(shí)現(xiàn)。當(dāng)父類方法在子類中被覆蓋時(shí),通常是子類版本調(diào)用父類版本,并做一些附加的工作。1 1方法繼承方法繼承關(guān)于覆蓋應(yīng)注意的事項(xiàng):關(guān)于覆蓋應(yīng)注意的事項(xiàng):(1 1)不使用)不使用supersuper而希望引用父類方法會導(dǎo)致無限的遞而希望引用父類方法會導(dǎo)致無限的遞歸,因?yàn)樽宇惙椒▽?shí)際上是在調(diào)用它自己。歸,因?yàn)樽宇惙椒▽?shí)際上是在調(diào)用它自己。(2 2)當(dāng)通過父類引用調(diào)用一個(gè)方法時(shí),)當(dāng)通過父類引用調(diào)用一個(gè)方法時(shí),JavaJava會正確地會正確地選擇與那個(gè)對象對應(yīng)的類的覆蓋方法。

10、選擇與那個(gè)對象對應(yīng)的類的覆蓋方法。(3 3)方法覆蓋中,子類在重新定義父類已有的方法時(shí))方法覆蓋中,子類在重新定義父類已有的方法時(shí),應(yīng)保持與父類完全相同的方法頭聲明,即與父類完全,應(yīng)保持與父類完全相同的方法頭聲明,即與父類完全相同的方法名、返回值和參數(shù)列表。相同的方法名、返回值和參數(shù)列表。(4 4)子類可以添加字段,也可以添加方法或者覆蓋父)子類可以添加字段,也可以添加方法或者覆蓋父類中的方法。然而,繼承不能去除父類中的任何字段和類中的方法。然而,繼承不能去除父類中的任何字段和方法。方法。3 3方法重載方法重載 重載的定義:可以用相同的方法名但不同的參數(shù)表來定義方法(參數(shù)表中參數(shù)的數(shù)量、類型或

11、次序有差異),這稱為方法重載。 重載(overloading):當(dāng)多個(gè)方法具有相同的名字而含有不同的參數(shù)時(shí),便發(fā)生重載。編譯器必須挑選處調(diào)用哪個(gè)方法。它通過將在不同方法頭部中的參數(shù)類型和在特定的方法調(diào)用中使用值的類型進(jìn)行比較,從而挑選出正確的方法。 5.2.4 5.2.4 在子類中使用構(gòu)造函數(shù)在子類中使用構(gòu)造函數(shù)關(guān)于子類構(gòu)造函數(shù)的規(guī)律總結(jié)如下:(1)子類構(gòu)造函數(shù)總是先調(diào)用(顯式的或隱式地)其父類的構(gòu)造函數(shù),以創(chuàng)建和初始化子類的父類成員。(2)構(gòu)造函數(shù)不能繼承,它們只屬于定義它們的類。如果把一個(gè)對象指定為其父類的引用,那么允許把這個(gè)對象轉(zhuǎn)換回它自己原來的類型,為了向該對象傳送一些在父類中沒有的信

12、息,必須這樣做。(3)當(dāng)創(chuàng)建一個(gè)子類對象時(shí),子類構(gòu)造函數(shù)首先調(diào)用父類的構(gòu)造函數(shù)并執(zhí)行,接著才執(zhí)行子類構(gòu)造函數(shù)。5.2.5 5.2.5 父類對象與子類對象的關(guān)系父類對象與子類對象的關(guān)系調(diào)用過程:e. getSalary()程序會選擇正確的getSalary方法。注意盡管e的聲明類型是Employee.當(dāng)e指向一個(gè)Employee對象時(shí),e.getSalary()會調(diào)用Employee類中的getSalary方法;而當(dāng)e指向一個(gè)Manager對象時(shí),getSalary()方法就變成了Manager類的getSalary()方法。虛擬機(jī)知道e所指對象的實(shí)際類型,因此它會調(diào)用正確的方法。事實(shí)上,一個(gè)對

13、象變量(如e)可以指向多種實(shí)際類型這種現(xiàn)象稱為“多態(tài)”。在運(yùn)行時(shí)自動(dòng)選擇正確的方法進(jìn)行調(diào)用稱作動(dòng)態(tài)綁定。5.2.6 5.2.6 擴(kuò)展類繼承的應(yīng)用示范擴(kuò)展類繼承的應(yīng)用示范現(xiàn)在討論一個(gè)繼承性的具體例子5-2,點(diǎn)、圓的層次結(jié)構(gòu)。首先建立并使用Point類,然后從point類繼承產(chǎn)生Circle類。程序的模塊:(1)模塊1:程序定義了一個(gè)Point類; (2)模塊2:又定義了Circle類,它是從Point類繼承來的;(3)應(yīng)用程序,該程序演示了如何把子類引用指定為父類引用,以及把父類引用強(qiáng)制轉(zhuǎn)換為子類引用,注意當(dāng)p添加到string時(shí)對toString的隱式調(diào)用。用來完成這個(gè)效果的兩項(xiàng)關(guān)鍵編程技術(shù)是

14、:(1)創(chuàng)建Circle類繼承了Point類。(2)在Point類和Circle類中用完全相同的signature覆蓋toString方法。值得強(qiáng)調(diào)的是以下幾點(diǎn):(1)Java將隱式地把Object類(java.lang包)作為新定義類的父類。Object類提供了一套任何類的任何對象均可使用的方法。(2)子類構(gòu)造函數(shù)總是先調(diào)用(顯式的或隱式地)其父類的構(gòu)造函數(shù),以創(chuàng)建和初始化子類的父類成員;構(gòu)造函數(shù)不能繼承,它們只屬于定義它們的類。(3)父類的實(shí)例變量可用Protected限定,因此,從Point衍生Circle類時(shí),Circle類的方法能直接引用坐標(biāo)x和y,而不必使用訪問。5.3 多態(tài)與動(dòng)態(tài)

15、綁定多態(tài)與動(dòng)態(tài)綁定多態(tài)(Polymorphism)提高了程序可擴(kuò)充性,調(diào)用多態(tài)性行為的軟件傳送給對象的消息(即方法調(diào)用)與對象的類型無關(guān),因此能響應(yīng)已有消息的新類型可以直接加入系統(tǒng),而不用修改基本系統(tǒng)。在運(yùn)行時(shí)自動(dòng)選擇正確的方法進(jìn)行調(diào)用稱作動(dòng)態(tài)綁定(dynamic binding)。5.3.1 5.3.1 多態(tài)多態(tài) 對于數(shù)據(jù)來說,繼承是否為正確的設(shè)計(jì)可以用一個(gè)簡單的規(guī)則來判斷。“is-a”規(guī)則表明子類的每一個(gè)對象都是一個(gè)超類的對象。例如,每一個(gè)經(jīng)理是一個(gè)員工。然而,只有經(jīng)理類是員工類的子類才是有意義的。很明顯,反過來就不行了并不是每個(gè)員工都是經(jīng)理。 還有一個(gè)明確敘述“is-a”規(guī)則的方法是替代

16、原則。該原則規(guī)定無論何時(shí),如果程序需要一個(gè)超類對象,都可以用一個(gè)子類對象來代替。 5 . 3 . 2 5 . 3 . 2 動(dòng) 態(tài) 綁動(dòng) 態(tài) 綁定定理解調(diào)用一個(gè)對象方法的機(jī)制是非常重要的。下面具體介紹:(1)編譯器檢查對象的聲明類型和方法名。(2)接著,編譯器檢查方法調(diào)用中的參數(shù)類型。如果在所有的叫做f的方法中有一個(gè)其參數(shù)類型同調(diào)用提供的參數(shù)類型最匹配,那么該方法就會被選擇調(diào)用。這個(gè)過程稱作超載選擇。(3)當(dāng)程序運(yùn)行并且使用動(dòng)態(tài)綁定來調(diào)用一個(gè)方法時(shí),那么虛擬機(jī)必須調(diào)用同x所指向的對象的實(shí)際類型相匹配的方法版本。動(dòng)態(tài)綁定是非常重要的特性:它能使程序變得可擴(kuò)展而無需重編譯已存代碼。5.3.35.3.

17、3父類對象與子類對象的使用與轉(zhuǎn)化父類對象與子類對象的使用與轉(zhuǎn)化 this表示的是當(dāng)前對象本身,更準(zhǔn)確地說,this代表了當(dāng)前對象的一個(gè)引用。對象的引用可以理解為對象的另一個(gè)名字,通過引用可以順利地訪問對象,包括修改對象的屬性、調(diào)用對象的方法。 1 1thisthis 現(xiàn)介紹程序里父類對象與子類對象間的指代使用和轉(zhuǎn)化。this和super是常用來指代父類對象與子類對象的關(guān)鍵字. super表示的是當(dāng)前對象的直接父類對象,是當(dāng)前對象的直接父類對象的引用。所謂直接父類是相對于當(dāng)前對象的其他“祖先”而言的。 2 2supersuper提供一個(gè)構(gòu)造函數(shù):public Manager(String n,d

18、ouble s,int year,int month,int day)super(n,s,year,month,day);bonus=0;這里關(guān)鍵字super具有不同的意義。代碼:super(n,s,year,month,day);的意思是“調(diào)用Employee父類的構(gòu)造函數(shù),同時(shí)帶有n、s、year、month以及day參數(shù)”。5.3.35.3.3父類對象與子類對象的使用與轉(zhuǎn)化父類對象與子類對象的使用與轉(zhuǎn)化父類對象與和子類對象的轉(zhuǎn)化需要注意如下的原則:(1)子類對象可以被視為是其父類的一個(gè)對象;(2)父類對象不能當(dāng)成是其某一個(gè)子類的對象;(3)如果一個(gè)方法的形式參數(shù)定義的是父類對象,那么調(diào)用

19、這個(gè)方法時(shí),可以使用子類對象作為形式參數(shù);(4)如果父類對象引用指向的實(shí)際是一個(gè)子類對象,那么這個(gè)父類對象的引用可以用強(qiáng)制類型轉(zhuǎn)換轉(zhuǎn)化成子類對象的引用。 5.3.4 5.3.4 多態(tài)性在工資系統(tǒng)中的應(yīng)用多態(tài)性在工資系統(tǒng)中的應(yīng)用下面給出了一個(gè)根據(jù)員工類型利用抽象方法和多態(tài)性完成工資單計(jì)算的程序。Employee是抽象(abstract)父類,Employee的子類有經(jīng)理Boss,每星期發(fā)給他固定工資,而不計(jì)工作時(shí)間;普通雇員CommissionWorker,除基本工資外還根據(jù)銷售額發(fā)放浮動(dòng)工資;對計(jì)件工人PieceWorker,按其生產(chǎn)的產(chǎn)品數(shù)發(fā)放工資;對計(jì)時(shí)工人HourlyWorker,根據(jù)工

20、作時(shí)間長短發(fā)放工資。該例的Employee的每個(gè)子類都聲明為final,因?yàn)椴恍枰儆伤鼈兩勺宇?。對程序的幾點(diǎn)說明:(1)對所有員工類型都使用earnings方法,但是每個(gè)人掙的工資按他所屬的員工類計(jì)算,所有員工的類都是從父類Employee繼承出的。(2)如果一個(gè)子類是從一個(gè)具有abstract方法的父類繼承的,子類也是一個(gè)abstract類并且必須被顯式聲明為abstract類。(3)一個(gè)abstract類可以有實(shí)例數(shù)據(jù)和非abstract方法,而且它們遵循一般的子類繼承規(guī)則。(4)現(xiàn)在分析一下Employee類,其中public方法包括:構(gòu)造函數(shù),以及一個(gè)abstract方法earni

21、ngs。為什么earnings方法應(yīng)是abstract呢?因?yàn)樵贓mployee類中為這個(gè)方法提供實(shí)現(xiàn)是沒有意義的,誰也不能為一個(gè)抽象的員工發(fā)工資,而必須先知道是哪種員工。(5)Boss類是從Employee中繼承出來的,其中public方法包括一個(gè)以名、姓和每周工資作為參數(shù)的構(gòu)造函數(shù)(6)CommissionWorker類從Employee中繼承出來。(7)PieceWorker類,也是從Employee繼承。(8)HourlyWorker類亦從Employee繼承。(9)Test應(yīng)用程序的main方法首先聲明了ref為Employee引用。5.4 構(gòu)造函數(shù)的繼承與重載構(gòu)造函數(shù)的繼承與重載5

22、.4.1 5.4.1 默認(rèn)字段初始化默認(rèn)字段初始化構(gòu)造函數(shù)的作用是來定義對象的初始狀態(tài)。然而由于對象的構(gòu)造如此重要,Java還另外提供了一些不同的機(jī)制來編寫構(gòu)造函數(shù)。 如果在構(gòu)造函數(shù)中沒有明確地給某個(gè)字段賦值,那么此字段會被自動(dòng)地賦值以一個(gè)默認(rèn)值:若是數(shù)字則被賦值以0,若是布爾類型則被賦值以false,若是對象引用則被賦值以null。但使用默認(rèn)值被認(rèn)為是一種糟糕的編程做法。因?yàn)椋绻侄我圆豢梢姷男问奖怀跏蓟瘯沟脛e人很難讀懂程序。5.4.2 5.4.2 默認(rèn)構(gòu)造函數(shù)默認(rèn)構(gòu)造函數(shù)默認(rèn)構(gòu)造函數(shù)是指沒有參數(shù)的構(gòu)造函數(shù)(這種構(gòu)造函數(shù)有時(shí)也稱作無參數(shù)構(gòu)造函數(shù))。例如,下面是個(gè)Employee類的默認(rèn)構(gòu)

23、造函數(shù):public Employee()name=”;salary=0;hireDay=new Date();默認(rèn)構(gòu)造函數(shù)是指沒有參數(shù)的構(gòu)造函數(shù)(這種構(gòu)造函數(shù)有時(shí)也稱作無參數(shù)構(gòu)造函數(shù))。例如,下面是個(gè)Employee類的默認(rèn)構(gòu)造函數(shù):public Employee()name=”;salary=0;hireDay=new Date();如果編寫了一個(gè)沒有構(gòu)造函數(shù)的方法,則系統(tǒng)會自動(dòng)為此方法提供一個(gè)默認(rèn)構(gòu)造函數(shù)。此默認(rèn)構(gòu)造函數(shù)將所有的實(shí)例字段初始化為默認(rèn)值。 5.4.3 5.4.3 顯式字段初始化顯式字段初始化 由于在類中可以重載構(gòu)造函數(shù)方法,所以可以采用多種方式來設(shè)置類中實(shí)例字段的初始狀態(tài)不

24、管什么樣的構(gòu)造函數(shù)調(diào)用,確保每個(gè)實(shí)例字段都被設(shè)置為某個(gè)有意義的值是一種很好的習(xí)慣。 在類的定義中,可以簡單地把一個(gè)值賦值給任何字段。例如,private String name=”lili” 在執(zhí)行構(gòu)造函數(shù)前,此賦值會被執(zhí)行。當(dāng)類中所有的構(gòu)造函數(shù)都需要把某一特定的實(shí)例字段賦值以相同的值時(shí),此語法非常有用。 5.4.4 5.4.4 參數(shù)名參數(shù)名當(dāng)編寫小的構(gòu)造函數(shù)時(shí),一般選擇單個(gè)字母作為參數(shù)名。public Employee(String n,double s) name=n; salary=s;然而,這么做的缺點(diǎn)是需要閱讀代碼才能知道參數(shù)n和s表示的是什么。一些程序員在每個(gè)參數(shù)前加一前綴“a”:

25、5.4.5 5.4.5 調(diào)用另一個(gè)構(gòu)造函數(shù)調(diào)用另一個(gè)構(gòu)造函數(shù)關(guān)鍵字this指向隱式參數(shù)。此外,此關(guān)鍵字還有另一種含義。如果構(gòu)造函數(shù)第一個(gè)語句具有形式this(),那么此構(gòu)造函數(shù)調(diào)用此類中的另一個(gè)構(gòu)造函數(shù)。下面是一個(gè)典型的實(shí)例:public Employee(double s)/calls Employee(String,double)this(“Employee #”+nextId,s);nextId+;5.4.6 5.4.6 初始化塊初始化塊在Java中實(shí)際上還有第三種機(jī)制,它叫做初始化塊。在類聲明中可以包含任意數(shù)量的代碼塊。只要構(gòu)造了此類的一個(gè)對象,這些代碼塊就會被執(zhí)行。例如:class

26、Employeepublic Employee(String n,double s)name=n;salary=s;5.4.6 5.4.6 初始化塊初始化塊public Employee()name=” ”;salary=0; /對象初始化模塊 id=nextId;nextId+;5.4.6 5.4.6 初始化塊初始化塊private String name;private double salary;private int id;private static int nextId;在這個(gè)例子中,id字段在對象初始化塊中被初始化,而不管是哪個(gè)構(gòu)造函數(shù)構(gòu)造了一個(gè)對象。初始化塊首先被運(yùn)行,然后構(gòu)造

27、函數(shù)的主體部分被執(zhí)行。 5.5 包包5.5.1 5.5.1 包用途包用途 Java允許把多個(gè)類收集在一起成為一組,稱作包(package)。包便于組織任務(wù),以及使自己的任務(wù)和其他人提供的代碼庫相分離。 標(biāo)準(zhǔn)Java庫被分類成許多的包,其中包括java.1ang、java.util和等等。標(biāo)準(zhǔn)Java包是分層次的。就像在硬盤上嵌套有各級子目錄一樣,可以通過層次嵌套組織包。所有的Java包都在Java和Javax包層次內(nèi)。5.5.2 5.5.2 創(chuàng)建包創(chuàng)建包已經(jīng)看到,已有的庫,比如Java API中的類和接口,可以導(dǎo)入到Java程序中。Java API中的每一個(gè)類和接口屬于一個(gè)特定的包。它包含一組

28、相關(guān)聯(lián)的類和接口,實(shí)際是對類和接口進(jìn)行組織的目錄結(jié)構(gòu)。例如,假定文件名是MyClass.java。它意味著在那個(gè)文件有一個(gè)、而且只能有一個(gè)public類。而且那個(gè)類的名字必須是MyClass(包括大小寫形式):package mypackage;public class MyClass 5.5.2 5.5.2 創(chuàng)建包創(chuàng)建包創(chuàng)建可復(fù)用的類的步驟簡要說明如下:(1)定義一個(gè)public類。如果類不是public,它只能被同一包中的其他類使用。(2)選擇一個(gè)包名,并把package語句加到可復(fù)用的類的源代碼文件中。(3)編譯這個(gè)類。這樣,它就被放到適當(dāng)?shù)陌夸浗Y(jié)構(gòu)中,以供編譯器和解譯器使用。(4)把

29、這個(gè)可復(fù)用的類導(dǎo)入到需要用它的程序中?,F(xiàn)在就可以使用它了。注意 在Java語言中可以出現(xiàn)在類定義的括號外面的僅有兩個(gè)語句,它們是package和import。 5.5.3 5.5.3 包引用包引用-每個(gè)類名前加上完整的包名每個(gè)類名前加上完整的包名例如,給出一個(gè)指向此包中的類的快捷方式。一旦使用import(導(dǎo)入)了以后,就不再需要給出完整的包名??梢砸胍粋€(gè)特定的類,也可以引入整個(gè)包。import語句要放在源文件的頭部(但在所有package語句的下面)。例如,可以通過下面的語句引入在java.util包中的所有的類:import java.util.*;然后,就可以使用Date today=

30、new Date();而不需要在前面加上包名。也可以引入包中某個(gè)特定的類:import java.util.Date; 5.5.3 5.5.3 包引用包引用-向包中添加類向包中添加類要把類放人一個(gè)包中,必須把此包的名字放在源文件頭部,并且放在對包中的類進(jìn)行定義的代碼之前。例如,在文件Employee.java的開始部分如下:package com.horstmann.corejava;public class Employee把包中的文件放入與此完整的包名相匹配的子目錄中。例如,在包c(diǎn)om.horstmann.corejava中的所有的類文件都必須放在子目錄c o m / h o r s t

31、m a n n / c o r e . j a v a ( W i n d o w s 下 的comhorstmanncorejava)下。這是最簡單的一種方法,在本章的后面可以看到更多的選項(xiàng)。 5.5.3 5.5.3 包引用包引用-定位類定位類類被存儲在文件系統(tǒng)的子目錄中。類的路徑必須與所在包名相匹配。在前面的例子中,包目錄com/horstmann/corejava是程序目錄的一個(gè)子目錄。然而這樣安排很不靈活。一般,有多個(gè)程序需要訪問包文件。為了使包可以在多個(gè)程序間共享,需要做以下事情:1 ) 把 類 放 在 一 個(gè) 或 多 個(gè) 特 定 的 目 錄 中 , 比 如/home/user/cl

32、assdir。此目錄是包樹的基本目錄。如果加入了類com.horstmann.corejava.Employee,那么此類文件必須位于子目錄/home/user/classdir/com/horstmann/corejava下。2)設(shè)置類路徑。類路徑是其子目錄包含類文件的所有基本目錄的集合。 5.5.3 5.5.3 包引用包引用-標(biāo)記包作用域標(biāo)記包作用域已經(jīng)接觸過public和private訪問指示符。被標(biāo)記為Public的部件可以被任何類使用,而私有部件只能被定義它們的類使用。如果沒有指定public或private,那么部件(即類、方法或變量)可以被同一個(gè)包中的所有方法訪問。5.5.4 5

33、.5.4 Java APIJava API包包 為了簡化面向?qū)ο蟮木幊踢^程,Java系統(tǒng)事先設(shè)計(jì)并實(shí)現(xiàn)了一些體現(xiàn)了常用功能的標(biāo)準(zhǔn)類,如用于輸入輸出的類,用于數(shù)學(xué)運(yùn)算的類,用于圖形用戶界面設(shè)計(jì)的類,用于網(wǎng)絡(luò)處理的類等。這些系統(tǒng)標(biāo)準(zhǔn)類根據(jù)實(shí)現(xiàn)的功能不同,可以劃分成不同的集合,每個(gè)集合是一個(gè)包,合稱為類庫??梢砸眠@些包,也可以創(chuàng)建自己的包。 Java的類庫是系統(tǒng)提供的已實(shí)現(xiàn)的標(biāo)準(zhǔn)類的集合,是Java編程的API,它可以幫助開發(fā)者方便、快捷地開發(fā)Java程序。表5-1 Java API基本包一覽 5.6 接口接口5.6.1 5.6.1 接口概念接口概念 接口主要作用是可以幫助實(shí)現(xiàn)類似于類的多重繼承的

34、功能。在Java中,出于簡化程序結(jié)構(gòu)的考慮,不再支持類間的多重繼承而只支持單重繼承,即一個(gè)類至多只能有一個(gè)直接父類。然而在解決實(shí)際問題的過程中,僅僅依靠單重繼承在很多情況下都不能將問題的復(fù)雜性表述完整,需要其他的機(jī)制作為輔助。 在Java語言中,接口(Interface)是對符合接口需求的類的一套規(guī)范。接口與包相似,也是用來組織應(yīng)用中的各類并調(diào)節(jié)它們的相互關(guān)系的一種結(jié)構(gòu),更準(zhǔn)確地說,接口是用來實(shí)現(xiàn)類間多重繼承功能的結(jié)構(gòu)。 5.6.2 5.6.2 接口聲明接口聲明Java中聲明接口的語法如下:public interface 接口名 extends 父接口名列表 /接口體;/常量域聲明 publ

35、ic static final 域類型 域名=常量值; /抽象方法聲明 public abstract native返回值 方法名(參數(shù)列表) throw異常列表;從上面的語法規(guī)定可以看出,定義接口與定義類非常相似,實(shí)際上完全可以把接口理解成為一種特殊的類,接口是由常量和抽象方法組成的特殊類。 5.6.2 5.6.2 接口聲明接口聲明(1)接口中的屬性都是用 final修飾的常量,在這個(gè)類中,所有的成員函數(shù)都是抽象的,也就是說它們都只有說明沒有定義;(2)接口中的方法都是用abstract修飾的抽象方法,在接口中只能給出這些抽象方法的方法名、返回值和參數(shù)列表,而不能定義方法體,即僅僅規(guī)定了一組

36、信息交換、傳輸和處理的“接口”。5.6.2 5.6.2 接口的實(shí)現(xiàn)接口的實(shí)現(xiàn)一個(gè)類要實(shí)現(xiàn)某個(gè)或某幾個(gè)接口時(shí),有如下的步驟和注意事項(xiàng): (1)在類的聲明部分,用implements關(guān)鍵字聲明該類將要實(shí)現(xiàn)哪些接口;(2)如果實(shí)現(xiàn)某接口的類不是abstract的抽象類,則在類的定義部分必須實(shí)現(xiàn)指定接口的所有抽象方法,即為所有抽象方法定義方法體,而且方法頭部分應(yīng)該與接口中的定義完全一致,即有完全相同的返回值和參數(shù)列表; (3)如果實(shí)現(xiàn)某接口的類是abstract的抽象類,則它可以不實(shí)現(xiàn)該接口所有的方法。(4)一個(gè)類在實(shí)現(xiàn)某接口的抽象方法時(shí),必須使用完全相同的方法頭。(5)接口的抽象方法,其訪問限制符都

37、已指定是public,所以類在實(shí)現(xiàn)方法時(shí),必須顯式地使用public修飾符。5.7 本章小結(jié)本章小結(jié)面向?qū)ο缶幊痰膬?yōu)點(diǎn)之一是可通過繼承性實(shí)現(xiàn)軟件復(fù)用。新類通過繼承性可繼承父類已定義過的實(shí)例變量和方法。在這種情況下,新類叫做子類。單一繼承是指一個(gè)子類繼承一個(gè)父類。多重繼承是指一個(gè)子類繼承多個(gè)父類。Java不支持多重繼承,但Java提供了接口。接口具有多繼承的許多優(yōu)點(diǎn),而卻沒有它的缺點(diǎn)。在子類中通常要加入它自己的實(shí)例變量和方法,所以子類一般要比它的父類大。另一方面,子類比父類更具體,因而代表了較少的對象。5.7 本章小結(jié)本章小結(jié)子類不能訪問父類的private成員,但子類可以訪問其父類的public,protected和包訪問成員;要訪問父類的包訪問成員,子類一定要在父類的包內(nèi)。子類構(gòu)造函數(shù)總是先調(diào)用(顯式的或隱式地)其父類的構(gòu)造函數(shù),以創(chuàng)建和初始化子類的父類成員。繼承性實(shí)現(xiàn)了軟件的復(fù)用,這不但節(jié)省了開發(fā)時(shí)間,也鼓勵(lì)人們使用已經(jīng)驗(yàn)證無誤和調(diào)試過的高質(zhì)量軟件。子類的對象可以

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論