第五章面向對象抽象類接口及內部類下_第1頁
第五章面向對象抽象類接口及內部類下_第2頁
第五章面向對象抽象類接口及內部類下_第3頁
第五章面向對象抽象類接口及內部類下_第4頁
第五章面向對象抽象類接口及內部類下_第5頁
已閱讀5頁,還剩64頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

上一章重點內容復習1.繼承2.this、super3.強制類型轉換4.多態(tài)5.構造方法的多態(tài)與繼承6.Equals()方法理解目前一頁\總數六十九頁\編于十八點本章主要內容5.1抽象類5.2接口5.3內部類2目前二頁\總數六十九頁\編于十八點5.1抽象類用abstract修飾的類稱為抽象類,用abstract修飾的成員方法稱為抽象方法。對于抽象方法,在抽象類中只指定方法名及類型,而不寫實現代碼。3目前三頁\總數六十九頁\編于十八點5.1.1抽象類的定義[public]abstractclass類名[extends父類名列表]{//數據成員聲明

//抽象方法聲明

[public][abstract]返回值方法名(參數列表)[throw異常列表]}4目前四頁\總數六十九頁\編于十八點abstractclassShapes{protectedintx,y,k;protecteddoublem;abstractpublicdoublegetArea();abstractpublicdoublegetPerimeter();}如實例:4/sample4-15不能把一個類同時標識為abstract和final的,abstract表示很多類的事物總稱,可以再分子類;而final的類一定不能再分子類.兩者相反含義。5目前五頁\總數六十九頁\編于十八點5.1.2抽象方法抽象方法充當著占位的角色,其具體實現在子類中.抽象方法只有方法聲明,沒有方法體.

Publicabstractvoidstartup(); publicabstractvoidgo2(){};抽象類與抽象方法之間的關系是,抽象方法只能存在于抽象的類中.6目前六頁\總數六十九頁\編于十八點抽象方法示例抽象類中可以有非抽象方法,非抽象類中不能有抽象方法.6/4/sample4_16.7目前七頁\總數六十九頁\編于十八點抽象類注意以下幾個方面抽象類中可以有零個或多個抽象方法,也可以包含非抽象方法。只要有一個抽象方法,類前就必須有abstract修飾。若沒有抽象方法,類前也可有abstract修飾。抽象類不能創(chuàng)建對象,創(chuàng)建對象必須由具體子類來實現,但可以有聲明,聲明能引用所有具體子類的對象。如實例:Ab.java8目前八頁\總數六十九頁\編于十八點對于抽象方法來說,在抽象類只指定其方法及其類型,而不書寫其實現代碼。抽象類必定要派生子類,若派生的子類是具體類,則具體子類中必須實現抽象類中定義的所有抽象方法(覆蓋);若子類還是抽象類,父類中已有的abstract方法,則子類中就不能再有。如實例:an.java9目前九頁\總數六十九頁\編于十八點在抽象類中,非抽象方法可以調用抽象方法。

abstract不能與final并列修飾同一個類;abstract不能與private,static,final或native并列修飾同一個方法;abstract類中不能有private成員如實例:an.java10目前十頁\總數六十九頁\編于十八點5.1.4抽象類的產生過程抽象類形成的思維過程:客觀事物—>對象—>類—>抽象類。(x,y)(x,y)widthheightrxyzwidthheight(x’,y’)11目前十一頁\總數六十九頁\編于十八點對以上三類進行抽象:圖6-412目前十二頁\總數六十九頁\編于十八點抽象實例AbstractclassInstrument4{inti;Publicabstractvoidplay();PublicStringwhat(){return“Instruemt4”;}publicabstractvoidadjust();}Classwind3extendsInstrument4{publicvoidplay(){System.out.println(“wind.play”);}PublicStringwhat(){return“wind3”;}Publicvoidadjust(){}}13目前十三頁\總數六十九頁\編于十八點抽象實例AbstractTest.java6/4/sample4_17.java14目前十四頁\總數六十九頁\編于十八點5.1.5抽象類在繼承方面的應用可以簡化子類定義的煩瑣度明晰類的層次關系如實例:6.815目前十五頁\總數六十九頁\編于十八點5.1.6引用具體子類對象抽象類不能有自己的實例對象,但是可以有自己的聲明,而且其聲明可以引用所有具體子類的對象。實例:6.916目前十六頁\總數六十九頁\編于十八點5.1.7抽象類設計注意事項抽取同類對象的共同行為包含對象的本質盡可能簡單17目前十七頁\總數六十九頁\編于十八點抽象類——設計不當的舉例abstract

class

Door

{

publicabstract

void

open();

publicabstract

void

close();

publicabstract

void

alarm();

}

報警門子類的代碼實現如下:class

AlarmDoor

extends

Door

{

publicvoid

open()

{

}

publicvoid

close()

{

}

publicvoid

alarm()

{

}

}

但其它類也要繼承Door,由于繼承關系,必須實現一個和它不相干的方法alarm,這顯然對于其它子類的實現帶來不便。18目前十八頁\總數六十九頁\編于十八點5.2接口接口是一系列方法的聲明,是一些方法特征的集合,一個接口只有方法的特征,沒有方法的實現.接口不是類,而是對類的一組需求描述,這些類要遵從接口描述的統(tǒng)一格式進行定義。

publicinterfaceComparable{intcompareTo(Objectother);}

任何實現Comparable接口的類都必須包含compareTo方法,且該方法參數必須是一個Object對象,返回一個整型數值.19目前十九頁\總數六十九頁\編于十八點接口的定義當定義一個接口時,實際上是在編寫一個合約,該合約規(guī)定了用來描述實現該接口的類能夠做什么,充當什么角色.而接口中并沒有功能的具體實現,具體實現由簽了合約的類自己來完成.20目前二十頁\總數六十九頁\編于十八點接口的定義[public]interface

接口名[extends父接口名列表]

{//靜態(tài)常量數據成員聲明

[public][static][final]域類型域名=常量值;

//抽象方法聲明

[public][abstract]返回值方法名(參數列表)[throw異常列表];}21目前二十一頁\總數六十九頁\編于十八點接口的定義下面是合法的接口聲明:PublicabstractinterfaceAerocft{}Publicinterfaceship{}Interfaceship{}InterfaceJetPlaneextendsship{}Public可寫可不寫,如果接口定義為public類型,必須位于與其同名的java文件中.Abstract可寫可不寫.在使用接口繼承時,可以同時從多個接口繼承,(接口以外的類型,都不可以被接口繼承).InterfaceAero{}Interfacejet{}InterfacejetplaneextendsAero,jet{}22目前二十二頁\總數六十九頁\編于十八點接口的兩種含義:可以被引用調用的方法(public方法或同包中的protected方法或默認方法);另一種是同“類”概念地位相當的專有概念interface,interface是功能方法說明的集合。23目前二十三頁\總數六十九頁\編于十八點5.2.2接口的特性

接口定義,使用關鍵字interface,而不是Class,interface前的修飾符要么是public,要么是默認。接口中定義的域變量全是finalstatic,即靜態(tài)常量。即使沒有任何修飾符,其效果完全等效。24目前二十四頁\總數六十九頁\編于十八點接口沒有構造方法,接口中所有方法自動屬于abstract,即使沒有任何修飾符,其效果完全等效。

intcompareTo(Objectother);接口中不能包含靜態(tài)方法

publicinterfaceComparable{staticintcompareTo(Objectother);}因為static修飾的方法必然被直接調用,所以不能聲明為抽象方法。25目前二十五頁\總數六十九頁\編于十八點接口中只能定義靜態(tài)常量,不能含有實例域

publicinterfaceCaculator{staticfinaldoublePI=3.1415926;staticfinaldoubleE=2.71828183;

doublesum;//接口中的域自動設為

staticfinal}26目前二十六頁\總數六十九頁\編于十八點不能在接口中實現方法

publicinterfaceComparable{intcompareTo(Objectother);}publicinterfaceCaculator{Objectadd(Objectother){…};}27目前二十七頁\總數六十九頁\編于十八點接口具有繼承性,可通過extends關鍵字聲明接口的父接口。

publicinterfaceMoveable{voidmove(doublex,doubley);}publicinterfacePoweredextendsMoveable{doublemilesPerGallon();}28目前二十八頁\總數六十九頁\編于十八點接口和子接口都不能有自己的實例對象,但可以有自己的聲明,可引用那些實現本接口或子接口的類對象。因此接口中的常量必須定義為static,以表明其沒有對象這一特點。29目前二十九頁\總數六十九頁\編于十八點5.2.3接口的角色接口扮演將實現者和使用者有機聯系到一起的角色。當功能沒有實現和使用前,先定義接口,再進行功能的實現以及使用。使用者按照接口進行使用,實現者按照接口進行實現。30目前三十頁\總數六十九頁\編于十八點5.2.4接口中方法的實現與使用類的繼承使得開發(fā)人員可以處理同類的事物,但不能處理不同類但具有相同功能的事物.接口能夠被很多不同的類實現,但接口中定義的方法僅僅是實現某一特定功能的規(guī)范,而并沒有真正實現這些功能.這些功能都需要在實現該接口的類中完成.如實例sample5.131目前三十一頁\總數六十九頁\編于十八點5.2.5接口實現要注意幾點在類中,用implements關鍵字來實現接口。一個類可以實現多個接口,在implements后用逗號隔開多個接口的名字。一個接口也可被多個類來實現。接口的實現者可以繼承接口中定義的常量,其效果等效于在這個實現類當中定義了一個靜態(tài)常量。如果實現某接口的類不是abstract的抽象類,則在類的定義部分必須實現接口的所有抽象方法,而且方法頭部分應該與接口中的定義完全一致。32目前三十二頁\總數六十九頁\編于十八點如果實現接口的類是abstract類,則它可以不實現該接口的所有方法。但對于抽象類的任何一個非抽象的子類而言,接口中的所有抽象方法都必須實現。這些方法體可以來自抽象的父類(被子類繼承),也可以來自子類自身的實現,這主要體現了非抽象類中不能存在抽象方法的原則。接口的抽象方法的訪問限制符如果為缺省或public時,類在實現方法時,必須顯式使用public修飾符,否則將被警告為縮小了接口中定義的方法的訪問控制范圍。33目前三十三頁\總數六十九頁\編于十八點讓類實現一個接口將類聲明為實現給定的接口

classEmployeeimplementsComparable對接口中的所有方法進行定義publicintcompareTo(ObjectotherObject){Employeeother=(Employee)otherObject;if(salary<other.salary)return-1;if(salary>other.salary)return1;return0;}34目前三十四頁\總數六十九頁\編于十八點接口不能使用new運算符實例化一個接口

x=newComparable(...);//ERROR可以聲明接口的變量,接口變量必須引用實現了該接口的類的對象

Comparablex;x=newEmployee(...);35目前三十五頁\總數六十九頁\編于十八點實例6.1036目前三十六頁\總數六十九頁\編于十八點5.2.6.實例所有實現interface中的方法必須被申明為public如實例Store.javaInterface可以從多個interface得到繼承,但是不能繼承類。如實例HorrorShow.java一個可以實現多個interface,如實例Adventure.java37目前三十七頁\總數六十九頁\編于十八點接口在編程中的作用接口的作用主要體現在:一個接口可以被多個類實現,這些類的對象都可以被這個接口的聲明所引用。如實例集合類接口Collection,它的直接實現類有十一個。AbstractSet,Vector,LinkedList,等。在LinkedList中有如下的方法:PublicbooleanaddAll(intindex,Collectionc){intnumNew=c.size();…….}當調用此方法時,第二個參數Collection接口聲明C可以引用所有實現類對象,不管那一種都一定有size()這個接口方法。38目前三十八頁\總數六十九頁\編于十八點通過共同的接口方法來對這些傳入的對象進行統(tǒng)一操作。如果沒有Collection接口,則在LinkedList中不得不這樣寫:PublicbooleanaddAll(intindex,Abstractlistc)PublicbooleanaddAll(intindex,AbstractSetc)PublicbooleanaddAll(intindex,ArrayListc)……接口聲明能引用所有實現類對象,抽象類聲明能引用所有具體類對象。39目前三十九頁\總數六十九頁\編于十八點接口在JAVA事件處理機制中的應用JAVA事件實現的機制,采用事件監(jiān)聽模式,能將事件發(fā)生對象和事件處理對象分開,而接口在這個方式中起到了很大的作用?;具^程如圖所示如實例:6.11,6.1240目前四十頁\總數六十九頁\編于十八點5.2.8接口與抽象類比較

abstractclassComparable{publicabstractintcompareTo(Objectother);}classEmployeeextendsComparable{publicintcompareTo(Objectother){...}}

每個類只能繼承一個類,但可以實現多個接口1語法上的不同41目前四十一頁\總數六十九頁\編于十八點抽象類接口共同點

二者都可具有抽象方法,都不能實例化,但都可以有自己的聲明,并能引用子類或實現類對象。不同點屬性變量可以有變量,沒有限制

不能有,只能是靜態(tài)常量。成員方法

可以有具體方法(而且具體方法可以調用抽象方法)。編譯器不會自動添加任何修飾符,可以有抽象方法,也可沒有抽象方法,若只要有一個抽象方法,則類就必須為抽象類所有接口中的方法均隱含為公有的和抽象的,編譯器會自動添加修飾符.如果有方法,則全部是抽象方法。實現策略必須有子類繼承必須有實現類實現42目前四十二頁\總數六十九頁\編于十八點抽象類接口不同點繼承抽象類只能繼承一個父類,但可以實現多個接口,其可以選擇性地設計父類或父接口中的抽象方法接口可以繼承多個來自不同繼承樹上的接口,但是其只能繼承自接口,不能繼承自類.繼承后,不能設計其父接口中的方法,接口不能實現別的接口,即接口中不能出現implements關鍵字多態(tài)抽象類的引用可以指向其子類的對象,通過該引用可以訪問子類中繼承自該抽象類的所有屬性和方法.接口類型的引用可以指向任何實現自該接口或實現自該接口的子接口的類,通過接口的引用可以訪問其指向對角中的實現自接口的方法.擴展性弱強43目前四十三頁\總數六十九頁\編于十八點2、具體的含義不同抽象類更注重其是什么及其本質;而接口則不是,接口更注重其具有什么樣的功能及其能充當什么樣的角色。例如實例:Sample5_2可以飛的事物有很多,飛機、鳥或者超人。但是飛機的實質是個機械工具,需要汽油;而鳥與超人的實質是動物,需要進食。所以鳥可以繼承自動物,但其可以扮演飛行器這個角色。超人??抽象類:物體的本質接口:物體可以充當的角色44目前四十四頁\總數六十九頁\編于十八點接口與抽象類

接口不是類,它需要類去實現,實現類和接口之間不是繼承關系,而是實現與被實現的關系。因此當接口增加新方法時,完全可能通過接口的繼承,將變化體現在子接口中,保證父接口的穩(wěn)定,進而穩(wěn)定父接口實現類和使用類。抽象類增加新方法,必定對繼承抽象類的所有子類產生影響,如果在抽象類的繼承體系中為增加新功能方法而增加新子類,同接口繼承相比,抽象類繼承相對復雜,不利于體系的進一步演化。45目前四十五頁\總數六十九頁\編于十八點接口與抽象類舉例抽象類(abstractclass):家用電器(HomeAlliances)

接口(interface):音量調節(jié)(VolumeControl)

繼承類:電視機(TV),洗衣機(Washing)

實現電視機的方法:

pulbicclassTVextendsHomeAlliancesimplementsVolumeControl{

}

實現洗衣機的方法(洗衣機不具有音量調節(jié)功能):

publicclassWashingextendsHomeAlliances{

}

大家可以細細體會抽象類同接口的區(qū)別。文章46目前四十六頁\總數六十九頁\編于十八點接口與回調回調一種常見的程序設計模式。利用回調技術可以處理這樣的問題:

事件A發(fā)生時要執(zhí)行處理事件A的代碼,判斷何時發(fā)生事件A及何時執(zhí)行處理的代碼。

這些代碼是固定的,先行編寫完畢,供使用。但事件A的處理代碼開放給其它人編寫,可以有很多不同的實現,使用時可以注冊具體需要的實現來處理。如實例:sample5_347目前四十七頁\總數六十九頁\編于十八點5.3內部類內部類是定義在另一個類中的類為什么需要使用內部類?內部類方法可以訪問該類定義所在的作用域中的數據,包括私有的數據.內部類可以對同一個包中的其他類隱藏起來.當想要定義一個回調函數前不想編寫大量代碼時,使用匿名內部類比較便捷.48目前四十八頁\總數六十九頁\編于十八點5.3內部類內部類分為四種:1)成員內部類,作為外部類的一個成員存在,與外部類的屬性、方法并列。2)局部內部類,在方法中定義的內部類稱為局部內部類。3)匿名內部類,沒有名字的內部類。4)靜態(tài)內部類,如果不需要內部類對象與外圍類對象之間有聯系,則聲明為static49目前四十九頁\總數六十九頁\編于十八點5.3.1成員內部類語法Class<外部類>{[成員的訪問限制修飾符][static]class<內部類>{//內部類的成員}//外部類的成員}成員內部類完全可以將其看成是外部類的一個成員,與普通成員的限制、修飾等都可加之于非靜態(tài)成員內部類。在成員內部類類體中,一樣有自己的成員變量和方法,可以用private、protected、public來修飾成員內部類。50目前五十頁\總數六十九頁\編于十八點5.3.1成員內部類publicclassOuter{//內部類publicclassInner{//內部類的成員inti=12;}//外部類的普通成員intcount=0;}51目前五十一頁\總數六十九頁\編于十八點成員內部類可以引用外部類的所有成員,包括被private修飾的如實例:o.java

classOuter{privateinta=10;voidf(){…}classInner{intd;publicInner(){d=a;f();}}}52目前五十二頁\總數六十九頁\編于十八點外部類與成員內部類定義的成員重名時,利用關鍵字this引用成員如實例TestOuterAndInner.java

53目前五十三頁\總數六十九頁\編于十八點Outer.javaclassOuter{inta;classInner{inta=20;voidf(){inta=10;System.out.println(a);

System.out.println(this.a);

System.out.println();}}}54目前五十四頁\總數六十九頁\編于十八點成員內部類的不能被static修飾,但允許靜態(tài)常量存在成員.如實例o.java

classOuter{classInner{inta;//可以

voidf(){…}//可以

staticfinalintb=10;//可以

staticintc;//錯誤

staticvoidg(){….}//錯誤

}}55目前五十五頁\總數六十九頁\編于十八點內部類創(chuàng)建對象只有創(chuàng)建了外部類對象之后,才能創(chuàng)建內部類對象,才能使用內部類的成員。創(chuàng)建內部類對象的方式有2種:1、在外部類之內創(chuàng)建內部類對象。2、在外部類之外創(chuàng)建內部類對象。56目前五十六頁\總數六十九頁\編于十八點1、在外部類之內創(chuàng)建內部類對象在外部類中創(chuàng)建內部類對象的語法與創(chuàng)建普通對象的語法相同,即用new操作符調用相應的構造器即可。注意:非靜態(tài)內部類是外部類的非靜態(tài)成員,不能在靜態(tài)上下文中使用。如sample5_4編譯后產生幾個類文件??

57目前五十七頁\總數六十九頁\編于十八點2、在外部類之外創(chuàng)建內部類對象<外部類類名>.<內部類類名>引用變量=<外部類類對象引用>.new<內部類構造器><外部類類名>.<內部類類名>引用變量=new<外部類構造器>.new<內部類構造器>兩種含義相同如實例sample5_5

成員內部類實例:innerclass/Parcel3.javaTestOuterAndInner.java58目前五十八頁\總數六十九頁\編于十八點5.3.2局部內部類定義在方法中的內部類稱為局部內部類。定義形式:

voidf(){classInner{…..}}59目前五十九頁\總數六十九頁\編于十八點與方法的局部變量類似,局部類不能用public或private修飾。局部類的作用域被限定在聲明這個局部類的塊中。局部類可以對外部世界完全隱藏,除了f()方法外,其他代碼方法都不能訪問局部類。60目前六十頁\總數六十九頁\編于十八點局部類可以訪問外部類的所有屬性和方法,包括private屬性。局部類只能引用方法體內的常量,不能訪問方法體內的局部變量。

61目前六十一頁\總數六十九頁\編于十八點實例

outter.java

溫馨提示

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

評論

0/150

提交評論