第6講 繼承和多態(tài)(上).ppt_第1頁
第6講 繼承和多態(tài)(上).ppt_第2頁
第6講 繼承和多態(tài)(上).ppt_第3頁
第6講 繼承和多態(tài)(上).ppt_第4頁
第6講 繼承和多態(tài)(上).ppt_第5頁
已閱讀5頁,還剩36頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、Java語言概述,1,第六講 繼承和多態(tài)(上),西亞斯學院計算機系 姜斌 2011年,Java語言概述,2,課堂內(nèi)容,一、繼承的概念 1、繼承涵義 2、繼承定義,父類和子類定義 3、繼承例子 二、類庫繼承例子 1、Object類 2、例子 三、擴展類 1、繼承關(guān)系的語法定義 2、屬性繼承和隱藏 3、方法繼承, 覆蓋和重載* 4、子類中構(gòu)造函數(shù)的使用 四、Abstract繼承,一、 繼承涵義和定義,1、涵義,繼承(Inheritance):三大特性之一 類之間的繼承關(guān)系是現(xiàn)實世界中遺傳關(guān)系的直接模擬, 一方面,它表示類之間的擴展性的聯(lián)系以及對屬性和操作的共享,即子類可以沿用父類(被繼承類)的某些

2、特征。 另一方面,子類也可以具有自己獨立的屬性和操作,1、涵義,事物之間最基本聯(lián)系: 1)“IS A”關(guān)系 繼承是一個“IS A”關(guān)系 有時也稱為“普通”和“特殊”的聯(lián)系 新擴展出來的類是原有類的某一個特例,可有一個或多個子類或擴展類存在,繼承關(guān)系,Java語言概述,6,組合關(guān)系,2)“HAS A”關(guān)系 一個事物所具有其他事物 其他事物是其組成部分,這種一般稱為“組合”或“聚合”關(guān)系 (要和繼承區(qū)別開),Java語言概述,7,2、繼承定義,繼承性是指一個新的類繼承原有類的基本特性,并增加新的特性;原有類稱為父類或基類,新的類稱為子類或擴展類。 特征:軟件復用的一種形式。新類由已存在的類生成,可

3、以不去從頭去定義一個新類; 如果子類只從一個父類繼承,則稱為單繼承;如果子類從一個以上父類繼承,則稱為多繼承(在java中沒有多繼承,類似結(jié)構(gòu)通過接口實現(xiàn))。,繼承關(guān)系是可以傳遞的,如左圖, E繼承C,而C繼承A,因而E也繼承了A,所以E也是A的子類,是間接子類,C是A的直接子類 Class C extends A Class F implements C, D ; Class E implements B, D(C,B,D為接口類),Java語言概述,9,3、 繼承例子,例3,飛機、汽車和輪船可歸于交通工具類, 飛機/汽車/輪船可以繼承交通工具類某些屬性和操作,所以交通工具和飛行器/汽車/輪

4、船之間是繼承關(guān)系,例2,企業(yè)中員工可以有不同特殊員工,如經(jīng)理是特殊的員工,所以,員工和經(jīng)理類之間是繼承關(guān)系,例1,動物有不同種類,例如:貓科類和鳥類,所以,動物和貓/鳥之間是繼承關(guān)系,二、類庫繼承例子,Java語言概述,11,1. Object類類中的“黃帝”,是一個特殊的類,所有類(包括類庫中的和用開發(fā)者創(chuàng)作的類都屬于其子類,并繼承其內(nèi)容) Object類是所有類的根. 每個類都以它來作為超類, 所有的類, 包括 數(shù)組(arrays), 都可實現(xiàn)覆蓋Object類中的方法. 每個類都隱藏地擴展了此類,即等同于在類地聲明時加入,“extends Object”,Java語言概述,12,Obje

5、ct類的方法,常用的方法: String toString() 輸出關(guān)于對象的描述信息,可以被覆蓋 返回對象的字符串表示。Object 的方法返回一個字符串、包含該對象的類名、一個字符和實例散列碼(哈希)的十六進制表示。,protected Object clone() 創(chuàng)建并返回此對象的一個副本。(在子類中不要依賴Object的這個方法。) boolean equals(Objectobj) 指示某個其他對象是否與此對象“相等”。(在子類中不要依賴Object的這個方法。) protected void finalize() 當垃圾回收器確定不存在對該對象的更多引用時,由對象的垃圾回收器調(diào)用

6、此方法。 Class getClass() 返回一個對象的運行時類。 Int hashCode() 返回該對象的哈希碼值。,2、類庫類的繼承特例,由于所有類都是由繼承java.lang.Object而來,所以類庫的類都是Object的類的直接或間接子類。 例如: java.lang.String直接繼承Object javax.swing.JOptionPane間接繼承Obejct 用戶自定義類也直接或間接繼承Object,3、定義思考,我們定義的飛機類Plane,其實隱含繼承Object class Plane extends Object /系統(tǒng)在編譯時自動執(zhí)行 例如可以在Plane類中我

7、們定義有toString方法,這個實際繼承了覆蓋了父類Object同名方法; 方法為: public String toString() return (speed is:+ speed + nlook is:+look); 思考:如果我們不定義這個方法會怎么樣,三、 繼承的實現(xiàn) 定義擴展類,Java語言概述,17,父類名跟在extends 關(guān)鍵字后面,用來說明當前類是哪個已經(jīng)存在類的子類,存在繼承關(guān)系。,定義順序: 1)定義父類“動物類” Animal; 2)然后定義子類“貓類” Cat; Class Cat extends Animal,子類從父類繼承有兩個主要的方面: (1)屬性的繼承。

8、例如,員工是一個父類,有名字、薪水和聘用日期屬性。子類繼承所有屬性 (2)方法的繼承。一個父類定義了若干操作,如屬性獲取的三個get方法,加薪方法,它們要被繼承。,1、 繼承關(guān)系定義,聲明類頭-父類名,Java語言概述,18,1) 在動物類中包含基本屬性,在Cat中包括特有屬性“爪子數(shù)”,在Bird類中有“翅膀數(shù)”屬性; 2)(見Employee類的代碼)Employee類是一個父類。因為子類是父類的擴展,增加了父類沒有的屬性和方法 protected String name; /在Employee類中 protected double salary; protected Date hireD

9、ay;/ 上述屬性已經(jīng)被繼承 /在Manager類中 private double bonus; /經(jīng)理才有業(yè)績金 ,我是擴展類!,2 屬性繼承與隱藏,子類繼承了父類成員屬性和方法,同時提供更多特有屬性和方法,比它們的父類具有更多的功能,,Java語言概述,19,2 屬性繼承與隱藏,對于父類來說,屬性的作用域范圍和屬性設(shè)置是有要求的,要求如下: 父類代碼中定義的private屬性是訪問范圍在子類無法訪問到。,(1)子類可以訪問其父類的protected或 public(不推薦)成員;推薦設(shè)成protected (2)protected訪問是為了體現(xiàn)繼承關(guān)系來專門提供的訪問范圍。 (3)由于被繼

10、承的父類成員沒有在子類聲明中列出,但是這些成員確實存在于子類中。,Java語言概述,20,2 屬性繼承與隱藏,Manger類增添了一個新的字段用于存儲獎金,并且增添了一個新方法用于設(shè)置它的值:(它繼承了Employee中的所有屬性和方法) class Manager extends Employee public void setBonus(double b) bonus=b; private double bonus; ,Java語言概述,21,3 方法繼承、覆蓋與重載,對于Manager對象,可以使用getName和getHireDay等方法。即使這些方法沒有明顯地在Manager類中定義

11、,它們也自動地從Employee類中繼承過來了。(注意Object是所以類的超類,見附錄) 2)方法覆蓋(Methods Overriding) 方法的覆蓋是指:子類定義同名方法來覆蓋父類的方法,是多態(tài)技術(shù)的一個實現(xiàn)。當父類方法在子類中被覆蓋時,通常是子類版本在方法被子類對象調(diào)用時動態(tài)使用,并做一些附加的工作。,1)方法繼承(Methods Inheriting),Java語言概述,22,方法覆蓋實現(xiàn)如下:Override,如果Employee中定義了getSalary()方法,Manager類中也要定義getSalary()方法,那么有兩種情況, a, 一種是方法體完全重寫; b, 一種是調(diào)

12、用父類中的該方法,再加一些語句。 Public double getSalary() double baseSalary=super.getSalary(); return baseSalary+bonus; Super使編譯器調(diào)用父類方法的一種手段。,Java語言概述,23,關(guān)于覆蓋應注意的事項:,(1)不使用super而希望引用父類方法會導致無限的遞歸,因為子類方法實際上是在調(diào)用它自己。 (2)方法覆蓋中,子類在重新定義父類已有的方法時,應保持與父類完全相同的方法頭聲明,即與父類完全相同的方法名、返回值和參數(shù)列表。 (3)子類可以添加字段,也可以添加方法或者覆蓋父類中的方法。然而,繼承不能

13、去除父類中的任何字段和方法。,Java語言概述,24,3)方法重載(Methods Overloading),重載的定義:可以用相同的方法名但不同的參數(shù)表來定義方法(參數(shù)表中參數(shù)的數(shù)量、類型或次序有差異),注意方法的限定符相同,返回值類型相同,這稱為方法重載。,重載(overloading):當多個方法具有相同的名字而含有不同的參數(shù)時,便發(fā)生重載。編譯器必須挑選出調(diào)用哪個方法。它通過將在不同方法頭部中的參數(shù)類型和在特定的方法調(diào)用中使用值的類型進行比較,從而挑選出正確的方法。,Java語言概述,25,注意重載不是子類對父類同名方法的重新定義,而是類對自身已有同名方法的重新定義: A)java中允

14、許對任何方法重載。所有,要描述一個方法,需要指定方法的名字以及它的參數(shù)類型。此表達式被稱為方法的型構(gòu)(Signiture) 例如: String 類有四個叫做indexOf的方法,它們的型構(gòu)不同: indexOf(int); indexOf(String) indexOf(int,int); indexOf(String, int) B)注意:返回值類型不是方法特征中的一部分。即不能有這樣的兩個方法:它們具有相同的名字和參數(shù)類型,但只是具有不同的返回值類型。,Java語言概述,26,4 在子類中使用構(gòu)造函數(shù),子類構(gòu)造函數(shù)也不能直接訪問父類中的私有字段 (1)子類構(gòu)造函數(shù)總是先調(diào)用(顯式的或隱式

15、地)其父類的構(gòu)造函數(shù),以創(chuàng)建和初始化子類的父類成員。 (2)構(gòu)造函數(shù)不能繼承,它們只屬于定義它們的類。 (3)當創(chuàng)建一個子類對象時,子類構(gòu)造函數(shù)首先調(diào)用父類的構(gòu)造函數(shù)并執(zhí)行,接著才執(zhí)行子類構(gòu)造函數(shù)。 見書上構(gòu)造器規(guī)則(P74, 段1),Java語言概述,27,如果構(gòu)造函數(shù)有參數(shù)時,子類構(gòu)造函數(shù)在使用時可先執(zhí)行父類帶有參數(shù)的構(gòu)造函數(shù)。 Person(String n,int i) name=n; age=i; Student(String n,int i,String j) super(n,i); Sno=j; ,/要放在子類構(gòu)造器第一行,四、抽象類與抽象方法,abstract是抽象修飾符,可以

16、用來修飾類或方法。,1、抽象類(abstract) 現(xiàn)實生活中,可以發(fā)現(xiàn)很多事物可以認為是同一種概念,而這個概念只是抽象的概念。例如:“交通工具”,“鳥”,“人”等等; 相對應有些事物是具體的:如“自行車”,“三輪車”,“卡車”;“麻雀”,“老鷹”;“學生”,“職工”等等;,實際的使用中動物是一個“抽象概念”,我們可以把剛才例子改一下,如何抽象?,Code: public class cat extends Animal . public class Bird extends Animal . ,RETURN,2、 抽象類(abstract) 抽象類是針對具體類(Concrete)來說的,抽象

17、類和具體類是繼承的關(guān)系(抽象繼承)。 當一個類被聲明為abstract時,這個類被稱為是抽象類。所謂抽象類就是沒有具體實例對象的類。 抽象類包含了一些概念基本的屬性和抽象方法,具體類包含子類特殊的屬性和方法。,詳細,new,Animal cat1 = new Cat(); /向上轉(zhuǎn)型 Animal cat2 = new Cat(); Animal bird1 = new Bird();,見例子TestExtends2,注意: 抽象類不能實例化,3、 抽象方法 作為類方法修飾符,abstract則聲明了一種僅有方法頭,而沒有具體的方法體和操作實現(xiàn)的抽象方法。只含有一個聲明,沒有方法主體。下面是抽

18、象方法聲明時采用的語法: abstract void methodName(); 抽象類中:abstract方法只有方法頭的聲明,而用一個分號來代替方法體的定義: 子類:在繼承的子類中,對于抽象方法要求實現(xiàn),方法頭和抽象方法一樣。(如果還有子類,這個類還可定義為抽象類),抽象方法很重要,在Java編程語言中抽象方法是非常重要的概念。不僅抽象類,在接口里你會大量的用到它。,Java語言概述,34,小結(jié),繼承的涵義和概念,是現(xiàn)實什么關(guān)系體現(xiàn)? 父類和子類的概念,又叫做什么? 如何定義Java繼承關(guān)系,關(guān)鍵詞是? 繼承中屬性和方法的特點,this和super關(guān)鍵詞的用法 什么是抽象類,,Java語言

19、概述,35,作業(yè),做書上課后題1,2 理解Manager繼承Employee的例子(代碼見我的課后任務包(實驗時ftp上下載 ,包括Employee,Manager,InheritanceTest.java)。 通過Manager例子的理解,自己思考工資系統(tǒng)的UML圖設(shè)計,實現(xiàn)工資系統(tǒng)的例子;,附錄,UML說明和,Java語言概述,37,特別例子:繼承的應用示范(點,圓的抽象),+setPoint(),+toString(),-X: int,-Y: intr,Point,+setRadius(),+getRadius(),-,Circle,+getX(),+getY(),-radius,+toString(),+area(),點和圓的關(guān)系是一種繼承關(guān)系,圓可以理解成具有半徑的點。,Java語言概述,38,6 擴展類繼承的應用示范,(見例子5-2) 現(xiàn)在討論一個繼承性的具體例子5-2,點、圓的層次結(jié)構(gòu)。首先建立并使用Point類,然后從point類繼承產(chǎn)生Circle類。

溫馨提示

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

最新文檔

評論

0/150

提交評論