OK-------------Java繼承_抽象類與接口的應用_第1頁
OK-------------Java繼承_抽象類與接口的應用_第2頁
OK-------------Java繼承_抽象類與接口的應用_第3頁
OK-------------Java繼承_抽象類與接口的應用_第4頁
OK-------------Java繼承_抽象類與接口的應用_第5頁
已閱讀5頁,還剩25頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、JavaJava繼承繼承, ,抽象類與接口的應用抽象類與接口的應用1.繼承及繼承實例2.方法重寫(Overwrite)3.super關鍵字4.方法重載(Overload)5.final修飾符6.abstract修飾符7.抽象類8.接口9.接口和抽象類對比10.接口和抽象類使用場合實例11.總結什么是繼承什么是繼承在第一節(jié)課的時候,我們就已經(jīng)初始了繼承的概念:子類自動共享父類數(shù)據(jù)結構和方法的機制,這是類之間的一種關系。繼承也是提高代碼復用的有力手段,當多個類之間存在相同的屬性和方法時,就可以考慮繼承,從這些類中抽象出父類在父類中定義這些相同的屬性和方法,子類無需再定義這些相同的屬性和方法,只需要

2、通過extends語句來聲明繼承關系即可:public class Son extends Base繼承具有單根性:即一個類只能繼承最多一個類。不能出現(xiàn): public class Son extends Base,Base2但是Base類可以繼承其他類。son:代表子類,又叫做超類。Base:代表父類,又叫做基類。繼承的基本語法繼承的基本語法public class 子類名 extends 父類名語法:下面,我們通過一個實際的例子來學習繼承。注意:子類只能繼承父類public和protected修飾的屬性和方法。創(chuàng)建父類創(chuàng)建父類DoorDoor所有門都擁有開(open)和關(close)這樣

3、的動作,不管是普通的門還是安全門,所以我們這里定義一個公用的父類Door類,并且默認的認為所有的門的名字都叫門。public class Door public String doorName=門; /門的名字public void open() /開門方法System.out.println(門開了!);public void close() /關門方法System.out.println(門關了);父類:創(chuàng)建子類創(chuàng)建子類CommonDoorCommonDoor和和SecurityDoorSecurityDoorpublic class CommDoor extends Door 普通門Co

4、mmDoor :public class SecurityDoor extends Door 安全門:文件結構:這三個類都放在同一個demo1包下:繼承測試繼承測試可以發(fā)現(xiàn),在CommDoor和SecurityDoor中我們一行代碼都沒有寫,只是繼承了Door類,就可以直接使用open和close方法了。這正是繼承的特點子類可以共享父類的數(shù)據(jù)和方法。public static void main(String args) CommDoor cd=new CommDoor();System.out.println(cd.doorName);cd.open();cd.close();Securit

5、yDoor sd=new SecurityDoor();System.out.println(sd.doorName);sd.open();sd.close();結果:如果說類的數(shù)量很多,那么這種優(yōu)勢就更加顯而易見了。但是繼承的弱點是:打破了封裝,當父類一旦改變,子類也就可能發(fā)生變化,類的耦合度過高,不符合我們高內(nèi)聚低耦合的設計原則。繼承中的構造方法繼承中的構造方法在父類Door中定義無參構造方法:在子類CommonDoor中定義無參構造方法:public CommDoor()System.out.println(這是子類構造方法);public Door()System.out.printl

6、n(這是父類構造方法!);測試:CommDoor cd=new CommDoor();結果:這里可以得出一個結論:實例子類時,子類默認會自動調(diào)用父類的無參構造方法。方法重寫(方法重寫(OverwriteOverwrite)方法重寫(Overwrite)又叫方法覆蓋(Override),是有繼承關系的類之間的一種多態(tài)特性。如果,對于一般門,當調(diào)用open方的時候直接輸出“門開了”就好了,可是對于安全門我們可能在開門之前需要做一個身份驗證,以確定是否真的要開門。那么我們就需要在子類里面重寫父類的open方法。public void open()System.out.println(/*-安全門,模

7、擬執(zhí)行了安全驗證-*/);System.out.println(門開了!);這種在子類中重新定義父類已有方法的行為就是重寫,重寫是多態(tài)的一種體現(xiàn)形式。重寫測試重寫測試這里重寫了父類里的open方法,相當于將父類的open方法覆蓋掉了。當執(zhí)行:SecurityDoor sd=new SecurityDoor();sd.open();步驟如下:1、在SecurityDoor類查找open方法,如果有責直接調(diào)用,否則執(zhí)行下一步2、在父類中查找open方法,如果有則調(diào)用輸出結果:重寫必須保證子類的方法定義完全和父類相同,不允許返回值類型不同的重寫。如:public String open()super

8、super關鍵字關鍵字一般在以下情況我們會用到super關鍵字:1.在子類構造方法中,通過super調(diào)用父類構造方法2.在子類中訪問父類被覆蓋重寫的方法和屬性現(xiàn)在給Door添加構造方法,如下:public Door(String doorName)this.doorName=doorName;在SecurityDoor中可以如下定義:public SecurityDoor(String doorName,String brand)super(doorName);this.brand=brand;這里的super代表調(diào)用父類的構造方法。說明,SecurityDoor有一個自己的brand屬性。s

9、upersuper關鍵字關鍵字如果在子類中重寫了父類屬性,如在Security中重新定義了doorName屬性:private String doorName=安全門;要想再訪問到父類的屬性,則可以使用:super.doorName;測試:System.out.println(this.doorName+ + super.doorName);結果:方法重載(方法重載(OverloadOverload)方法重載(Overload),是類的同一功能(方法)有多種實現(xiàn)方式。其實重載在我們學習Math數(shù)學類的時候已經(jīng)有所接觸了,如下:這里有四個都叫max的方法,但是他們的參數(shù)列表不同,這樣就可以實現(xiàn),

10、當我們不論輸入任何兩個數(shù)字型(double,int,float,long)的參數(shù)的時候,都能返回最大值。不需要定義doubleMax,floatMax,intMax,longMax這樣的方法。方法重載(方法重載(OverloadOverload)假設,我們的安全門現(xiàn)在有多種開門方式,可以使用鑰匙開門,使用6位密碼開門,輸入房號和訪客姓名請求開門三種方式。那么我們可以做如下定義:public void open(String key)System.out.println(/*-用鑰匙開安全門,模擬驗證鑰匙是否正確-*/);System.out.println(門開了!);public void

11、open(int pwd)System.out.println(/*-用6位密碼開門,模擬驗證密碼是否正確-*/);System.out.println(門開了!);public void open(int doorNo,String visitName)System.out.println(/*-+visitName+請求+doorNo+開門,模擬確定是否開門-*/);System.out.println(門開了!);不允許僅僅返回值不同的重載。如:public void open(String key)和public String open(String key)是不能通過編譯的。重載的特

12、點:方法名都相同,參數(shù)列表不同。重載測試重載測試sd.open(123456); /使用密碼開門sd.open(萬能鑰匙); /使用鑰匙開門sd.open(1802,學員); /根據(jù)房號和訪客姓名開門測試:結果:可以看到,對于不同的請求方式,程序能作出不同的響應結果。重載和重寫小結重載和重寫小結重載:發(fā)生在一個類中,方法名相同,參數(shù)列表不同(包括類型,個數(shù),順序)。重寫(覆蓋):發(fā)在在有繼承情況的類中,子類方法和父類聲明完全一致。在此基礎上,我們可以回顧幾個訪問修飾符。final修飾符final修飾符可以修飾類,變量,方法。被final修飾的變量叫做常量,址不能被修改,如final int P

13、I=3.14;被final修飾的類不能被繼承。被final修飾的方法不能被重寫。abstract修飾符abstract修飾符可以修飾類,方法。被abstract修飾的類叫做抽象類,抽象類不能被實例化。被abstract修飾的方法叫做抽象方法,抽象方法沒有方法體,不提供具體實現(xiàn)。public abstract class Door public abstract void open();所謂不能實例,就是指不能:Door door=new Door();所謂無方法體,不實現(xiàn)就是指:open方法沒有具體的指定實現(xiàn)。那么定義這樣的類和方法有什么用呢?我們最終當然要為這樣的類和方法提供一個實現(xiàn),這個實

14、現(xiàn)就是繼承他的類,他的子類可以為抽象方法提供具體的實現(xiàn)。抽象類通常代表一個抽象概念,可以用一句話來概括抽象類的用途:抽象類是用來繼承的。反過來可以說具體類不是用來繼承的,只要有可能,我們不要從具體類繼承之前我們的做法雖然實現(xiàn)了功能,但是沒有達到思想上的真正意義。abstract修飾符使用abstract有以下幾個需要遵循的原則:抽象類中可以沒有抽象方法,但包含抽象方法的類就必須是抽象類。抽象方法不能是靜態(tài)的。抽象類及抽象方法不能被final修飾。抽象類不象具體類那樣描述一類具體事物,它是提取多種具有相似性的具體事物的共同特征而產(chǎn)生的 。而不是一個具體描述對象的類。同時抽象類和抽象方法其實是面向

15、契約的一種體現(xiàn),抽象類就相當于一個制定者。對于某些強制要被定義和實現(xiàn)的方法,可以定義為抽象方法,那么一旦有子類繼承該抽象類,子類就必須要按照契約來實現(xiàn)這個抽象方法。用抽象類來實現(xiàn)之前開關門的業(yè)務現(xiàn)在我們使用抽象類來實現(xiàn)之前的功能。public abstract class Door public void open()System.out.println(門開了!);public void close()System.out.println(門關了);這樣看似在結果上沒有任何變化,但是卻已經(jīng)符合抽象思維某種角度和語義就相當于,水果是抽象類,那么蘋果,梨就是具體類,由具體類負責來實例對象,抽象類

16、只負責描述抽象特征和行為。注意:如果一個類繼承了抽象類,但沒有實現(xiàn)它所有的抽象方法,那么這個類也是抽象類。用抽象類來實現(xiàn)之前開關門的業(yè)務在Door抽象類中定義抽象方法:public abstract void theNo();如果我們現(xiàn)在要求每個門都必須有一個提供自己門牌號的方法由于每個門的門牌號都不一樣,所以可以定義一個抽象方法,由子類具體實現(xiàn)內(nèi)容。在子類中實現(xiàn)抽象方法:public void theNo() System.out.println(我是安全門No2085);相當于契約。實現(xiàn)契約。接口由于繼承具有單根性,java不支持一個類有多個直接的父類,所以一個類只能繼承一個抽象類。為解決

17、這一問題,Java引入了接口類型,彌補了Java的單繼承的弱點。一個類只能有一個直接的父類,但可以實現(xiàn)多個接口。接口的定義語法:public interface 接口名接口只負責定義規(guī)則,不負責任何實現(xiàn)。實現(xiàn)交給實現(xiàn)接口的類。接口接口有以下特點:1.接口中的成員變量默認都是public static final的即靜態(tài)常量。2.接口中的方法都沒有方法體即可以認為都是抽象方法,但是不需要abstract關鍵字來修飾。3.接口不能實現(xiàn)接口,但可以繼承多個接口。4.接口必須通過他的實現(xiàn)類來實例。public interface UserDAO int DEFAULT_COLOR=1;int RED=

18、2;public boolean deleteById(int id);定義接口:想一想,能不能在接口中定義私有的方法?接口的實現(xiàn)類實現(xiàn)接口:僅僅定義一個接口不去實現(xiàn),就像定義一個類,但什么都不寫;或者定義一個類,從來都不使用;是沒有什么意義的。所以我們需要為接口編寫實現(xiàn)類。public class UserDAOImpl implements UserDAOpublic boolean deleteById(int id) System.out.println(模擬通過id刪除信息!);return true;一個類通過implements關鍵字來實現(xiàn)一個接口,而且必須實現(xiàn)接口中所有的方法。

19、習慣上,對于某個接口的實現(xiàn)類,我們一般命名規(guī)則是:接口名+Impl如UserDAOImpl是UserDAO接口的實現(xiàn)類。實現(xiàn)某個接口的類叫做該接口的實現(xiàn)類,而不是子類。接口的實現(xiàn)類一般來說,我們在實例抽象類的子類或者接口的實現(xiàn)類的時候,都傾向于這樣的實例方法:抽象類 對象名=new 子類(); 接口 對象名=new 實現(xiàn)類();而不是直接new 子類或者實現(xiàn)類。接口和抽象類一樣不能被直接實例化,只能實例化他的實現(xiàn)類。這樣的做法是出于多態(tài)的考慮。凡是通過這種方式實例出的對象,都可以認為他的類型就是父類或者接口類。在編寫方法的時候,假如只寫一個方法,將基礎類作為變量或參數(shù)使用,而不是使用那些特定的

20、衍生類,那么可以減少很多代碼量。這種自下而上的抽象,就是java中所謂的“上溯造型”。抽象類和接口對比抽象類和接口的主要區(qū)別:1.抽象類里面可以為部分方法提供實現(xiàn);接口只聲明方法,不提供任何實現(xiàn)2.一個類只能繼承一個父類,但可以實現(xiàn)多個接口。接口是構建松耦合的軟件系統(tǒng)的法寶,他只描述服務或者契約,沒有具體的實現(xiàn),可以實現(xiàn)解耦。所以很多大師級人物都推崇面向接口編程,而不是面向實現(xiàn)編程。從設計模式的角度考慮:應當優(yōu)先使用對象組合,而不是類繼承。那么到底什么情況下該使用接口,什么情況下使用抽象類呢?我們通過一個實例來進行考究。接口和抽象類使用場合實例解決方案1.全部放進抽象類public abstr

21、act class Door public void open()System.out.println(門開了!);public void close()System.out.println(門關了);public void ring()System.out.println(按門鈴);由于繼承抽象類的子類可以使用父類的屬性和方法。所以不管ring方法如何被定義,最終子類都是能拿到的。不符合我們只是有些門具有按門鈴動作的要求。假設,我們現(xiàn)在有些門有開門,關門,按門鈴三個動作,其中開門,關門動作是所有門都有的動作,而按門鈴只是部分門才具有的,那么這三個動作該如何分配呢?接口和抽象類使用場合實例解決方案2.全部放進接口這里也同樣面臨和抽象類一樣的問題,實現(xiàn)接口就必須實現(xiàn)接口中所有的方法,違反了ISP(接口

溫馨提示

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

評論

0/150

提交評論