面向對象程序設計-Java語言_第1頁
面向對象程序設計-Java語言_第2頁
面向對象程序設計-Java語言_第3頁
面向對象程序設計-Java語言_第4頁
面向對象程序設計-Java語言_第5頁
已閱讀5頁,還剩67頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

關于面向對象程序設計-Java語言第1頁,共72頁,2023年,2月20日,星期日而把類中的其他成員隱藏起來,用戶不能訪問。繼承是面向對象程序設計的一個重要特征,它是通過一個類派生子類來實現的,這種結構對充分利用已有的類來創建更復雜的類,實現代碼的復用具有重要意義。多態是面向對象的程序中同名不同方法共存的現象,引入多態機制可以提高類的抽象度和封閉性,統一類的對外接口。通過本章的學習,讀者將深入了解類的這些特性。第2頁,共72頁,2023年,2月20日,星期日本章主要內容5.1消息5.2繼承5.3抽象類、接口和包5.4封裝5.5多態第3頁,共72頁,2023年,2月20日,星期日5.1消息在面向對象的系統中,對象間的相互作用是通過一個對象向另一個對象發送消息的方式來體現的。消息就是數據成員和成員方法的引用。第4頁,共72頁,2023年,2月20日,星期日消息的概念消息就是向對象發出服務請求,是對數據成員和成員方法的引用。消息的性質:(1)同一對象可接收不同形式的多個消息,產生不同的響應。第5頁,共72頁,2023年,2月20日,星期日(2)相同形式的消息可以發送給不同對象,所做出的響應可以是截然不同的。(3)消息的發送可以不考慮具體的接收者,對象可以響應消息,也可以對消息不予理會,對消息的響應并不是必須的。第6頁,共72頁,2023年,2月20日,星期日公有消息和私有消息對象之間的消息傳遞稱為公有消息;而對象內部數據成員或成員方法之間的調用稱為私有消息。【例5.1】公有消息和私有消息示例。第7頁,共72頁,2023年,2月20日,星期日5.2繼承繼承是面向對象程序設計的又一種重要手段,在面向對象程序設計中,采用繼承機制可以有效地組織程序結構,設計系統中的類,明確類之間的關系,充分利用已有的類來創建更復雜的類,大大提高程序開發的效率,提高代碼的復用率,降低維護的工作量。第8頁,共72頁,2023年,2月20日,星期日

繼承的概念繼承所表達的就是一種對象類之間的相交關系,它使得某類對象可以繼承另外一類對象的數據成員和成員方法。繼承避免了對一般類和特殊類之間共同特征進行的重復描述,運用繼承原則使得系統模型比較簡練也比較清晰。第9頁,共72頁,2023年,2月20日,星期日父類與子類之間的關系如圖所示:學生小學生中學生大學生研究生留學生初中生專科生高中生本科生碩士生博士生第10頁,共72頁,2023年,2月20日,星期日繼承的特征(1)繼承關系是傳遞的。(2)繼承簡化了人們對事物的認識和描述,能清晰體現相關類間的層次結構關系。(3)提供軟件復用功能。(4)通過增強一致性來減少模塊間的接口和界面,大大增加程序的易維護性。(5)提供多繼承機制。第11頁,共72頁,2023年,2月20日,星期日繼承的實現在Java程序設計中,繼承是通過extends關鍵字來實現的。在定義類時使用extends關鍵字指明新定義類的父類,新定義的類稱為指定父類的子類,就在兩個類之間建立了繼承關系。這個新定義的子類可以從父類那里繼承所有非private的屬性和方法作為自己的成員。實際上,在定義一個類而不給出extends關鍵字及父類名時,默認這個類是系統類Object的子類。第12頁,共72頁,2023年,2月20日,星期日1.數據成員的繼承:子類可以繼承父類的所有非私有的數據成員。【例5.2】數據成員繼承示例。2.數據成員的隱藏:在子類中重新定義一個與父類中已定義的數據成員名完全相同的數據成員,即子類擁有了兩個相同名字的數據成員,一個是繼承父類的,另一個是自己定義的。第13頁,共72頁,2023年,2月20日,星期日當子類引用這個同名的數據成員時,默認操作是引用它自己定義的數據成員,而把從父類那里繼承來的數據成員“隱藏”起來。當子類要操作繼承自父類的同名數據成員時,可使用關鍵字super引導。【例5.3】數據成員隱藏示例。第14頁,共72頁,2023年,2月20日,星期日3.成員方法的繼承:子類可以繼承父類的非私有成員方法。【例5.4】成員方法繼承示例。4.成員方法的覆蓋:子類可以重新定義與父類同名的成員方法,實現對父類方法的覆蓋。方法的覆蓋與數據成員的隱藏的不同之處在于:第15頁,共72頁,2023年,2月20日,星期日子類隱藏父類的數據成員只是使之不可見,父類同名的數據成員在子類對象中仍然占有自己獨立的內存空間;而子類方法對父類同名方法的覆蓋將清除父類方法占用的內存,從而使父類方法在子類對象中不復存在。【例5.5】成員方法覆蓋示例。第16頁,共72頁,2023年,2月20日,星期日this與super1.this的使用場合。在一些容易混淆的場合,例如,成員方法的形參名與數據成員名相同,或者成員方法的局部變量名與數據成員名相同時,在方法內借助this來明確表示引用的是類的數據成員,而不是形參或局部變量,從而提高程序的可讀性。第17頁,共72頁,2023年,2月20日,星期日簡單地說,this代表了當前對象的一個引用,可將其理解為對象的另一個名字,通過這個名字可以順利地訪問對象、修改對象的數據成員、調用對象的方法。歸納起來,this的使用場合有下述3種:第18頁,共72頁,2023年,2月20日,星期日(1)用來訪問當前對象的數據成員,其使用形式如下:this.數據成員(2)用來訪問當前對象的成員方法,其使用形式如下:this.成員方法(參數)(3)當有重載的構造方法時,用來引用同類的其他構造方法,其使用形式如下:this(參數)第19頁,共72頁,2023年,2月20日,星期日【例5.6】this使用示例。【例5.7】使用this示例。2.super的使用場合。super表示的是當前對象的直接父類對象,是當前對象的直接父類對象的引用。super的使用方法有3種:第20頁,共72頁,2023年,2月20日,星期日(1)用來訪問直接父類隱藏的數據成員,其使用形式如下:super.數據成員(2)用來調用直接父類中被覆蓋的成員方法,其使用形式如下:super.成員方法(參數)(3)用來調用直接父類的構造方法,其使用形式如下:super(參數)【例5.8】super使用示例。第21頁,共72頁,2023年,2月20日,星期日5.3抽象類、接口和包抽象類體現數據抽象的思想,是實現程序多態性的一種手段。接口則是Java中實現多重繼承的唯一途徑。包是一個更大的程序單位,主要實現軟件復用。第22頁,共72頁,2023年,2月20日,星期日抽象類假設要編寫一個計算圓、三角形和矩形面積與周長的程序,若按前面所學的方式編程,必須定義4個類:圓類、三角形類、矩形類和使用前3個類的公共類,它們之間沒有繼承關系。程序寫好后雖然能執行,但從程序的整體結構上看,3個類之間的許多共同屬性和操作在程序中沒有很好地利用,第23頁,共72頁,2023年,2月20日,星期日如圖所示,致使重復編寫代碼,降低了程序的開發效率,且使出現錯誤的機會增加。圓類圓心坐標半徑計算面積計算周長三角形類底邊長高計算面積計算周長矩形類長寬計算面積計算周長第24頁,共72頁,2023年,2月20日,星期日分析上面例子中的3個類,可以看到這3個類都要計算面積與周長,雖然公式不同但目標相同。因此,可以為這3個類抽象出1個父類,在父類里定義圓、三角形和矩形3個類共同的數據成員及成員方法,把計算面積與周長的成員方法名放在父類給予說明,而具體的計算公式再在子類中實現。第25頁,共72頁,2023年,2月20日,星期日這樣,通過父類就大概知道子類所要完成的任務,而且,這些方法還可以應用于求解平行四邊形、梯形等圖形的周長與面積,如圖5-4所示。這種結構就是抽象類的概念。第26頁,共72頁,2023年,2月20日,星期日抽象類抽象方法梯形類上、下底邊長高抽象方法圓類圓心坐標半徑計算面積計算周長三角形類底邊長高計算面積計算周長矩形類長寬計算面積計算周長第27頁,共72頁,2023年,2月20日,星期日抽象類刻畫了公有行為的特征,并通過繼承機制傳送給它的派生類。在抽象類中定義的方法稱為抽象方法,這些方法只有方法頭的聲明,而用一個分號來代替方法體的定義,即只定義成員方法的接口形式,而沒有具體操作,只有派生類對抽象成員方法的重定義才能真正實現與該派生類相關的操作。第28頁,共72頁,2023年,2月20日,星期日在各子類繼承了父類的抽象方法之后,再分別用不同的語句和方法體來重新定義它,形成若干個名字相同、返回值相同、參數列表相同、目的一致但是具體實現有一定差別的方法。抽象類中定義抽象方法的目的是實現一個接口,多種方法的原理,即所有的子類對外都呈現一個相同名字的方法。第29頁,共72頁,2023年,2月20日,星期日抽象類是它的所有子類公共屬性的集合,是包含一個或多個抽象方法的類。使用抽象類的一大優點就是可以充分利用這些公共屬性來提高開發和維護程序的效率。對于抽象類與抽象方法的限制如下:(1)凡是用abstract修飾符修飾的類被稱為抽象類。凡是用abstract修飾符修飾的成員方法被稱為抽象方法。第30頁,共72頁,2023年,2月20日,星期日(2)抽象類中可以有零個或多個抽象方法,也可以包含非抽象方法。(3)抽象類中可以沒有抽象方法,但是,有抽象方法的類必須是抽象類。(4)對于抽象方法來說,在抽象類中只指定其方法名及其類型,而不書寫其實現代碼。(5)抽象類可以派生子類,在抽象類派生的非抽象子類中必須實現抽象類中定義的所有抽象方法。第31頁,共72頁,2023年,2月20日,星期日(6)抽象類不能創建對象,創建對象的工作由抽象類派生的非抽象子類來實現。(7)如果父類中已有同名的abstract方法,則子類中就不能再有同名的抽象方法。(8)abstract不能與final并列修飾同一個類。(9)abstract不能與private、static、final或native并列修飾同一個方法。(10)abstract類中不能有private的數據成員或成員方法。第32頁,共72頁,2023年,2月20日,星期日【例5.9】抽象類應用。注意:在上例中,只能在C5_9類中main方法中定義3個子類的對象,使它們稱為main方法的局部對象,而不能將它們定義在main方法之外,因為非static方法是不能在static方法中被引用的,而方法中的局部變量不能帶修飾符,它們不受此限制。第33頁,共72頁,2023年,2月20日,星期日接口多重繼承是指一個子類可以有多個直接父類,該子類可以全部或部分繼承所有直接父類的數據成員及成員方法。在面向對象的程序設計語言中,有些語言(如C++)提供了多繼承機制。而Java出于安全性、簡化程序結構的考慮,不支持類間的多繼承而只支持單繼承。第34頁,共72頁,2023年,2月20日,星期日然而在解決實際問題的過程中,在很多情況下僅僅依靠單繼承不能將復雜的問題描述清楚。為了Java程序的類間層次結構更加合理,更符合實際問題的本質要求,Java語言提供接口來實現多重繼承機制。第35頁,共72頁,2023年,2月20日,星期日1.聲明接口,格式如下:[修飾符]interface接口名[extends父接口名列表]{常量數據成員聲明抽象方法聲明}常量數據成員前可以有也可沒有修飾符,其默認的修飾符是publicfinalstatic。第36頁,共72頁,2023年,2月20日,星期日接口中方法默認的修飾符為publicabstract。從上面的格式可以看出,定義接口與定義類非常相似。實際上完全可以把接口理解成為一種特殊的類,接口是由常量和抽象方法組成的特殊類。一個類只能有一個父類,但是它可以同時實現若干個接口。第37頁,共72頁,2023年,2月20日,星期日這種情況下,如果把接口理解成特殊的類,那么這個類利用接口實際上就獲得了多個父類,即實現了多重繼承。接口定義僅僅是實現某一特定功能的一組功能的對外接口和規范,而不能真正地實現這個功能,第38頁,共72頁,2023年,2月20日,星期日這個功能的真正實現是在“繼承”這個接口的各個類中完成的,要由這些類來具體定義接口中各抽象方法的方法體。因而在Java中,通常把對接口功能的“繼承”稱為“實現”。2.定義接口注意事項(1)接口定義用關鍵字interface,而不是用class。第39頁,共72頁,2023年,2月20日,星期日(2)接口中定義的數據成員全是publicfinalstatic成員,即常量。(3)接口中沒有自身的構造方法,所有成員方法都是publicabstract方法,即抽象方法。(4)接口也具有繼承性,可以通過extends關鍵字聲明該接口的父接口。第40頁,共72頁,2023年,2月20日,星期日一個類要實現接口時,即一個類要調用多個接口時,要注意以下幾點。:(1)在類中,用implements關鍵字就可以調用接口。一個類可以調用多個接口,這時,在implements后用逗號隔開多個接口的名稱。第41頁,共72頁,2023年,2月20日,星期日(2)如果實現某接口的類不是abstract的抽象類,則在類的定義部分必須實現接口的所有抽象方法,即為所有抽象方法定義方法體,而且方法頭部分應該與接口中的定義完全一致,即有完全相同的返回值和參數列表。(3)如果實現某接口的類是abstract的抽象類,則它可以不實現該接口所有的方法。第42頁,共72頁,2023年,2月20日,星期日但是對于這個抽象類任何一個非抽象的子類而言,它們父類所實現的接口中的所有抽象方法以及自身所實現接口中的抽象方法都必須有實在的方法體。這些方法體可以來自抽象的父類,也可以來自子類自身,但是不允許存在未被實現的接口方法。這主要體現了非抽象類中不能存在抽象方法的原則。第43頁,共72頁,2023年,2月20日,星期日(4)接口的抽象方法的訪問限制符都已指定為public,所以類在實現方法時,必須顯式地使用public修飾符,否則將被系統警告為縮小了接口中定義的方法的訪問控制范圍。【例5.10】將例5.9改寫為接口程序。【例5.11】將例5.10改寫為既有繼承類又有接口的程序。第44頁,共72頁,2023年,2月20日,星期日包在Java程序中,如果要想使一個類在多個場合下反復使用,可以把它存放在一個稱之為“包”的程序組織單位中。可以說,包是接口和類的集合,或者說包是接口和類的容器。第45頁,共72頁,2023年,2月20日,星期日包的作用有兩個,一是劃分類名空間,二是控制類之間的訪問。這就需要注意下述兩點:(1)因為包是一個類名空間,所以,同一個包中的類(包括接口)不能重名,不同包中的類可以重名。第46頁,共72頁,2023年,2月20日,星期日(2)類之間的訪問控制是通過類修飾符來實現的,若類聲明修飾符public,則表明該類不僅可供同一包中的類訪問,也可以被其他包中的類訪問;若類聲明無修飾符,則表明該類僅供同一包中的類訪問。1.Java程序的構成在一般情況下Java源程序的構成由4部分組成。第47頁,共72頁,2023年,2月20日,星期日(1)一個包(package)說明語句(可選項)。其作用是將本源文件中的接口和類納入指定包。源文件中若有包說明語句,必須是第一個語句。(2)若干個import語句(可選項)。其作用是引入本源文件中所需要使用的包。(3)一個public的類聲明。在一個源文件中只能有一個public類。(4)若干個屬于本包的類聲明(可選項)。第48頁,共72頁,2023年,2月20日,星期日2.創建包包的創建就是將源程序文件中的接口和類納入指定的包。包的聲明語句格式如下:package包名;例如,下面的語句是合法的創建包的語句:packagep1;packagep1.p2;第49頁,共72頁,2023年,2月20日,星期日若源文件中未使用package,則該源文件中的接口和類位于Java的無名包中(無名包又稱缺省包),它們之間可以相互引用非private的數據成員或成員方法。無名包中的類不能被其他包中的類所引用和復用。【例5.12】改寫例5.11,將接口與類納入包。第50頁,共72頁,2023年,2月20日,星期日3.包的引用將類組織成包的目的是為了更好地利用包中的類。通常一個類只能引用與它在同一個包中的類。如果需要使用其他包中的public類,則可以使用如下的幾種方法。(1)在引入的類前加包名,例如:p1.Circlec=newp1.Circle(25,25,5,3);第51頁,共72頁,2023年,2月20日,星期日(2)用import關鍵字加載需要使用的類,例如:importp1.Circle;(3)用import關鍵字加載整個包,例如:importp1.*;第52頁,共72頁,2023年,2月20日,星期日5.4封裝封裝也稱信息隱藏,是指類的設計者只為類的使用者提供類的可以訪問的部分(包括類的數據成員和成員方法),而把類中的其他成員隱藏起來,使用戶不能訪問的機制。這種機制為程序的編制和系統的維護提供了方便,設計者不必知道程序實現的細節,而只要知道類可以訪問的部分即可,排除錯誤更為方便。第53頁,共72頁,2023年,2月20日,星期日封裝包含以下幾個方面的含義。(1)在類的定義中設置類的訪問權限及其成員的訪問權限。(2)提供統一供其他類引用的方法。(3)其他對象不能直接修改本對象所擁有的屬性和方法。第54頁,共72頁,2023年,2月20日,星期日Java提供了4種訪問權限來實現封裝機制,即public、protected、private和friendly,每種訪問控制符的訪問權限見表5-1。第55頁,共72頁,2023年,2月20日,星期日類數據成員與方法public缺省public所有類包中類(含當前類)protected包中類(含當前類),所有子類包中類(含當前類)friendly(缺省)包中類(含當前類)包中類(含當前類)private當前類本身當前類本身表5-1類、數據成員和成員方法的訪問控制符及其作用第56頁,共72頁,2023年,2月20日,星期日公共訪問控制符public當一個類被聲明為public時,只要在其他包的程序中使用import語句引入這個public類,就可以訪問和引用這個類,創建這個類的對象、訪問這個類內部可見的數據成員和引用它的可見的方法。表明這個類作為整體對其他類是可見和可使用的,這個類就具有了被其他包中的類訪問的可能性。第57頁,共72頁,2023年,2月20日,星期日但是,處于不同包中的public類作為整體對其他類是可見的,并不代表該類的所有數據成員和成員方法也同時對其他類是可見的,這得由這些數據成員和成員方法的修飾符來決定。需要注意的是,數據成員和成員方法的訪問控制符被聲明為public,會造成安全性和封裝性下降,所以一般應盡量少用。第58頁,共72頁,2023年,2月20日,星期日【例5.13】public訪問控制符的使用。缺省訪問控制符friendly如果一個類沒有訪問控制符,說明它具有缺省的訪問控制特性。這種缺省的訪問控制特性稱為“友好訪問”,即friendly,它規定只有在同一個包中的對象才能訪問和引用這些類,因此,又稱為包訪問性。第59頁,共72頁,2023年,2月20日,星期日保護訪問控制符protected用protected修飾的成員變量可以被3種類所引用,該類自身、與它在同一個包中的其他類及在其他包中的該類的子類。使用protected修飾符的主要作用是,允許其他包中的它的子類來訪問父類的特定屬性。【例5.14】protected訪問控制符示例。第60頁,共72頁,2023年,2月20日,星期日私有訪問控制符private用private修飾的數據成員或成員方法只能被該類自身所訪問和修改,而不能被任何其他類(包括該類的子類)來訪問和引用,它提供了最高的保護級別。當其他類希望獲取或修改私有成員時,需要借助于類的方法來實現。【例5.15】用private修飾的數據成員。第61頁,共72頁,2023年,2月20日,星期日

封裝與繼承的關系其實這兩個概念并沒有實質性的沖突,在面向對象系統中,封裝性主要指的是對象的封裝性,即將屬于某一類的一個具體的對象封裝起來,使其數據和操作成為一個整體。繼承機制的引入絲毫沒有影響對象的封裝性。第62頁,共72頁,2023年,2月20日,星期日5.5多態多態的概念多態(polymorphism)是面向對象程序設計的一個重要特征。利用多態性可以設計和實現一個易于擴展的系統。第63頁,共72頁,2023年,2月20日,星期日在現實生活中,多態的例子比較常見,如不同班級的同學在聽到同一消息——上課鈴響時會做出不同的反應——跑向不同的教室。Java中提供兩種多態機制:重載與覆蓋。第64頁,共72頁,2023年,2月20日,星期日

方法重載在同一類中定義了多個同名而不同內容的成員方法時,這些方法稱為重載(overload)。重載的方法主要

溫馨提示

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

評論

0/150

提交評論