第14次 第4章 抽象類、接口、包_第1頁
第14次 第4章 抽象類、接口、包_第2頁
第14次 第4章 抽象類、接口、包_第3頁
第14次 第4章 抽象類、接口、包_第4頁
第14次 第4章 抽象類、接口、包_第5頁
已閱讀5頁,還剩52頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

補(bǔ)充:對(duì)象引用和對(duì)象的區(qū)別對(duì)象引用:對(duì)象名,存放對(duì)象實(shí)際的存儲(chǔ)地址。即:對(duì)象引用的值是地址。只要使用類聲明,對(duì)象引用便存在。對(duì)象:特指類實(shí)例化后的一個(gè)特例,例如使用Student類實(shí)例化一個(gè)Student對(duì)象,我們討論對(duì)象時(shí)更多的是關(guān)注其中的數(shù)據(jù),比如:姓名、年齡等。對(duì)象需要使用new創(chuàng)建后才會(huì)生成,此時(shí),內(nèi)存會(huì)給對(duì)象分配一塊存儲(chǔ)空間。Studentstu=newStudent();24.4多態(tài)性的實(shí)現(xiàn)多態(tài)性是指使用相同類型的對(duì)象引用調(diào)用同一個(gè)簽名的成員方法,卻執(zhí)行不同的代碼段的現(xiàn)象。若要實(shí)現(xiàn)多態(tài)性,需要具備下面兩個(gè)條件。若得到多態(tài)性的操作,父類和子類必須至少包含一個(gè)簽名完全一樣的成員方法。多態(tài)性作用于子類,它是依賴于類層次結(jié)構(gòu)中的一項(xiàng)新功能??偨Y(jié):不同類型的對(duì)象與引用的賦值1父類引用可以指向子類對(duì)象;但子類引用不能指向父類對(duì)象,也不能指向其他子類對(duì)象;舉例1.已知類關(guān)系如下:ClassEmployee{}ClassManagerextendsEmployee{}ClassDirectorextendsEmployee{}則下列語句正確的是:()。A.Employeee=newManager(); B.Directord=newManager();C.Directord=newEmployee(); D.Managerm=newDirector();4課堂練習(xí)classParent{}classDerivedOneextendsParent{}classDerivedTwoextendsParent{}關(guān)于以下表達(dá)式,說法正確的是?Parentp=newParent();DerivedOned1=newDerivedOne();DerivedTwod2=newDerivedTwo();d1=(DerivedOne)d2;A. 編譯和運(yùn)行均報(bào)告“非法”B. 編譯通過,運(yùn)行時(shí)報(bào)告“非法”C. 編譯運(yùn)行均能通過如果父類引用指向了子類對(duì)象,使用父類引用訪問父類和子類都有的方法(事實(shí)上,是子類覆蓋了父類的方法)時(shí),實(shí)際調(diào)用的子類中的方法??偨Y(jié):不同類型的對(duì)象與引用的賦值2舉例classAclass{voidgo(){System.out.println("Aclass");}}publicclassBclassextendsAclass{voidgo(){System.out.println("Bclass");}publicstaticvoidmain(Stringargs[]){Aclassa=newAclass();

Aclassa1=newBclass();a.go();

a1.go();}}父類引用雖然可以指向子類對(duì)象,但不能直接通過父類引用來調(diào)用子類中所特有public的成員方法,而是需要將該父類引用強(qiáng)制轉(zhuǎn)換成子類引用才能調(diào)用子類中的方法。它可以直接調(diào)用父類中public的成員方法;補(bǔ)充:不同類型的對(duì)象與引用的賦值3舉例classParent{}classChildextendsParent{ publicStringgetChild(){ Stringname="child";returnname;}

publicstaticvoidmain(Stringargv[]){

Parentp=newChild(); //插入代碼 }}以下哪個(gè)選項(xiàng)的代碼插入注釋語句“//插入代碼”處可以完成調(diào)用getChild()方法使程序輸出為字符串child?A.System.out.println(p.getChild());B.System.out.println();C.System.out.println((Parent)p.getChild());D.System.out.println(((Child)p).getChild());9104.5抽象類抽象類:是對(duì)類進(jìn)行高層抽象的結(jié)果,可實(shí)例化的類是抽象概念的具體表現(xiàn)。在Java語言中,用抽象類表示概念性的事物,用類表示可實(shí)例化的實(shí)體類別;11在Java語言中,抽象類就是用abstract修飾符聲明的類。[Modifier]abstractclassclassName……{//成員變量和成員方法}其中的成員方法既可以是抽象的,也可以是一般的。Java語言中抽象類的定義12抽象方法所謂抽象方法是指在類定義中,只被聲明原型,而不定義方法體的成員方法。[Modifier]abstractreturnTypemethodName(parameterList)其中,abstract是聲明抽象方法的關(guān)鍵字,

returnType是返回類型,

methodName是抽象方法的名稱,

parameterList是參數(shù)列表。由于抽象方法是不完整的成員方法,因此,它只能出現(xiàn)在抽象類中,但是不能出現(xiàn)在一般類中。13

Animal、Dog、Cat、Duck類關(guān)系的UML類圖

抽象類舉例14Animal類publicabstractclassAnimal{protectedStringtype;//種類

protectedStringname;//名稱

protectedStringbreed;//品種

publicAnimal(Stringtype,Stringname,Stringbreed){this.type=newString(type);=newString(name);this.breed=newString(breed);}publicStringtoString(){return"Thisisa"+type+"\nIt's"+name+"the"+breed;}

publicabstractvoidsound();//抽象方法}15Animal的幾個(gè)子類publicclassDogextendsAnimal{……

publicvoidsound(){System.out.println("WoofWoof");}}publicclassCatextendsAnimal{……

publicvoidsound(){System.out.println("Miiaooww");}}

classDuckextendsAnimal{……

publicvoidsound(){System.out.println("Quackquackquack");}}TestAnimal類publicclassTestAnimal{publicstaticvoidmain(String[]args){Animal[]theAnimals={newDog("Rover","Poodle"),newCat("Max","Abyssinian"),newDuck("Daffy","Aylesbury")};for(inti=0;i<theAnimals.length;i++){theAnimals[i].sound();}}}1617任何包含抽象方法的類都必須被定義成抽象類但抽象類中允許有非抽象方法;由于抽象類不是一個(gè)完整的類,因此不能夠被實(shí)例化抽象類主要用來派生子類,且在子類中必須覆蓋抽象類中的所有抽象方法,以便完善它們的定義static、private和final修飾符不能應(yīng)用于抽象方法和抽象類中。使用抽象類時(shí),需要注意下面幾點(diǎn):練習(xí)找出以下程序中的錯(cuò)誤。abstractclassA{ abstractvoidf(){};publicabstractvoidk();}classBextendsA{

voidf(){ System.out.print("Iamsubclass");} voidk(){ System.out.print("Iamsubclass");}publicstaticvoidmain(String[]args){ Aa=newA(); a.f();a.k(); }}

18抽象方法不應(yīng)該有方法體;子類中實(shí)現(xiàn)的抽象方法的訪問屬性應(yīng)與父類中訪問屬性一致或更多權(quán)限。抽象類不能實(shí)例化。接口是特殊的抽象類,它側(cè)重于描述概念的所具備的功能和具體屬性(成員變量為常量),但不實(shí)現(xiàn)。例如:洗衣機(jī)的接口 interfaceWasher{ publicvoidstartUp();//啟動(dòng) publicvoidletWaterIn();//進(jìn)水 publicvoidwashClothes();//洗衣 publicvoidletWaterOut();//排水 publicvoidstop();//停止 }194.6接口定義接口的基本格式為:[public]interface

interfacename{

常量聲明;

抽象方法聲明;}接口的訪問屬性或者為”public”或者”缺省”;定義接口的關(guān)鍵字是interface而不是class;常量必須為publicstaticfinal,在接口中可以省略;成員方法必須是抽象方法,在接口中也可以省略publicabstract。接口具有繼承性,可通過extends關(guān)鍵字聲明父接口,但不能被實(shí)例化。204.6接口接口舉例1:計(jì)量單位轉(zhuǎn)換系數(shù)publicinterface

Conversions{//各種計(jì)量單位轉(zhuǎn)換接口 doubleCM_TO_MM=10;//1厘米=10毫米

doubleTON_TO_KILOGRAM=1000;//1噸=1000千克

doublePOUND_TO_GRAM=453.5924;

//1磅=453.5924克}21相當(dāng)于:publicstaticfinal

doubleCM_TO_MM=10;判斷以下接口的定義是否正確?publicinterfaceA{

intCONST=1;//合法,CONST默認(rèn)為public,static,final類型

voidmethod();//合法,method()默認(rèn)為public,abstract類型

publicabstractvoidmethod2();//method2()顯示聲明為public,abstract類型

}22判斷以下接口的定義是否正確?publicinterfaceA{

intvar;//錯(cuò),var是常量,必須顯示初始化

voidmethod(){...};//錯(cuò),接口中只能包含抽象方法

protectedvoidmethod2(); //錯(cuò),接口中的方法必須是public類型

staticvoidmethod3(){...}; //錯(cuò),接口中不能包含靜態(tài)方法

}23接口的使用接口的使用分為3個(gè)步驟:定義接口實(shí)現(xiàn)接口使用接口2425接口舉例2:

Comparable接口publicinterfaceComparable

{//比較兩個(gè)對(duì)象大小

intcompareTo(ObjectotherObject); }compareTo的含義:將調(diào)用這個(gè)方法的對(duì)象與參數(shù)帶入的對(duì)象otherObject進(jìn)行比較,如果前者小,返回-1;如果相等返回0;否則,返回1。26接口是一種用來聲明常量和操作行為格式的特殊抽象類,在接口中聲明的所有成員方法都是抽象方法,因此接口不能實(shí)例化;需要構(gòu)造一個(gè)類,并在該類中覆蓋接口中的所有方法,以便將其完善,通常,稱此為某個(gè)類實(shí)現(xiàn)接口。4.6.2接口的實(shí)現(xiàn)Comparable接口的實(shí)現(xiàn)27以職工類(Employee)實(shí)現(xiàn)Comparable接口為例EmployeeprivateStringname;privatedoublesalary;privateStringdepartment;//成員變量的更改器//成員變量的獲取器publicStringtoString()publicintcompareTo(ObjectotherObject)Employee實(shí)現(xiàn)Comparable接口publicclassEmployeeimplements

Comparable{ privateStringname; //姓名

privatedoublesalary; //工資

privateStringdepartment; //部門

……

//構(gòu)造方法

…… //其他成員方法

publicintcompareTo(ObjectotherObject)

{……}}28compareTo方法的實(shí)現(xiàn)publicintcompareTo(ObjectotherObject)

{ //定義3個(gè)可能的返回值的所滿足的條件

Employeeother=(Employee)otherObject;if(salary<other.salary)return-1;//比較工資多少

if(salary==other.salary)return0;elsereturn1;}}2930Comparable接口的使用Employeee1=newEmployee("Wang",4000.0,"Software");Employeee2=newEmployee("Sun",3000.0,"Math");switch(pareTo(e2)){case-1:System.out.println("<");break;case0:System.out.println("==");break;case1:System.out.println(">");break;}運(yùn)行的結(jié)果是?練習(xí)下面的程序輸出的結(jié)果是()publicclassAimplementsB{publicstaticvoidmain(Stringargs[]){inti;Ac1=newA();i=c1.k;System.out.println("i="+i);}}interfaceB{intk=10;}A)i=0B)i=10C)程序有編譯錯(cuò)誤D)i=true補(bǔ)充:

接口的繼承關(guān)系

1.接口的單繼承2.接口的多重繼承1.接口的單繼承。interfaceA{voidF1();}interfaceBextendsA{voidF2();}說明:接口B將繼承接口A中的所有變量和方法,這種接口之間的繼承稱為單繼承。接口之間的繼承與類的繼承一樣使用關(guān)鍵字extends。2.接口的多重繼承在Java語言中,不支持類的多重繼承。但是支持接口的多重繼承,其語法格式如下:

interface接口名extends接口名1,接口名2,…可見接口的多重繼承只是在單繼承的基礎(chǔ)上再加上幾個(gè)接口,并把這些接口用逗號(hào)分隔開。35接口是一種特殊形式的抽象類,它主要用來組織公用的常量,并統(tǒng)一操作行為的格式,通常它被應(yīng)用在兩個(gè)主要方面:用接口包裝常量??梢詫⒏魇礁鳂拥某A糠旁诮涌谥校屆總€(gè)使用這些常量的類對(duì)象實(shí)現(xiàn)這個(gè)接口,從而達(dá)到享有這些常量的目的統(tǒng)一同類事物的操作接口。使用接口是為了解決Java語言中不支持多重繼承的問題。接口的主要應(yīng)用抽象類與接口的比較36抽象類接口共同點(diǎn)二者都可具有抽象方法,都不能實(shí)例化,但都可以有自己的聲明,并能引用子類或?qū)崿F(xiàn)類對(duì)象。不同點(diǎn)屬性變量可以有變量不能有,只能是靜態(tài)常量。成員方法可以有具體方法(而且具體方法可以調(diào)用抽象方法)。如果有方法,則全部是抽象方法。實(shí)現(xiàn)策略必須有子類繼承必須有實(shí)現(xiàn)類實(shí)現(xiàn)擴(kuò)展性弱強(qiáng)課堂練習(xí)1.關(guān)于接口的聲明和實(shí)現(xiàn),以下描述正確的是

。A.接口聲明的方法只有聲明沒有實(shí)現(xiàn)

B.接口聲明中的變量都必須寫明final和staticC.如果一個(gè)接口由多個(gè)類來實(shí)現(xiàn),則這些類在實(shí)現(xiàn)該接口中的方法時(shí)采用統(tǒng)一的代碼D.如果一個(gè)類實(shí)現(xiàn)接口,則必須實(shí)現(xiàn)該接口中的所有方法,但方法未必申明為public37課堂練習(xí)2.下面程序運(yùn)行的結(jié)果是

。interfaceInterfaceA{ Strings="good"; voidf(); }classClassAimplementsInterfaceA{ publicvoidf(){ System.out.print(s); }}

classClassB{ voidg(InterfaceAa){ a.f(); } }publicclassE{ publicstaticvoidmain(String[]args){ ClassBb=newClassB(); b.g(newClassA()); }}A.good B.編譯正確,但無運(yùn)行結(jié)果C.編譯錯(cuò)誤:b.g(newClassA()) D.以上都不對(duì)38課堂練習(xí)1.下列有關(guān)抽象類與接口的敘述中正確的是哪一個(gè)

。A.抽象類中不可以有非抽象方法,接口中也必須有抽象方法B.抽象類中可以有非抽象方法,接口中也可以有非抽象方法C.接口中的方法必須是抽象方法D.抽象類中的變量定義時(shí)必須初始化,而接口中不是39404.7包包是類和接口的集合。從資源管理的角度,可以將“包”理解為文件夾(目錄)。將所有的類和接口按功能分別放置在不同的包中主要有兩點(diǎn)好處:一是便于將若干個(gè)已存在的類或接口整體地添加到程序代碼中;二是避免出現(xiàn)類名沖突的現(xiàn)象。41創(chuàng)建一個(gè)包就是用包的名稱在文件系統(tǒng)下創(chuàng)建一個(gè)目錄。在創(chuàng)建的目錄下,既可以存放類文件或接口文件,也可以包含子目錄,這些子目錄是該包中的子包。創(chuàng)建一個(gè)包且將類文件放入其中的語法格式為:

packagepackageName;//

packageName是包名在NetBeans中,如果將類文件放入默認(rèn)包,則沒有包語句;如果將類文件放入指定的包中,類文件中會(huì)自動(dòng)生成包語句。4.7.1創(chuàng)建包42對(duì)于在包中具有public訪問屬性的類或接口,可以通過導(dǎo)入語句(import)將其添加到程序代碼中。導(dǎo)入語句的基本格式為import后跟包名序列及類名。

importuserPackage.*;userPackage是包名,.*代表將包中的所有類和接口都加載進(jìn)來。

importuserPackage1.userPackage2.userPackage3.*;這條語句表示將userPackage1包中的子包userPackage2的子包userPackage3中的所有類和接口加載進(jìn)來。4.7.2加載包引用不同包中的類434.8應(yīng)用舉例設(shè)計(jì)二人游戲二人游戲:由兩名選手參與的游戲。比如:象棋、跳棋和五子棋等分析:兩人游戲中有哪些共同的數(shù)據(jù)和操作。數(shù)據(jù):應(yīng)包含標(biāo)識(shí)兩名選手的常量;記錄下一步應(yīng)該是哪位選手操作的成員變量。44游戲中的操作1.指定從哪位選手開始2.返回當(dāng)前操作的選手3.改變當(dāng)前操作的選手4.返回游戲規(guī)則;5.判斷游戲是否結(jié)束;6.返回獲勝選手;7.返回游戲的提示信息8.返回游戲當(dāng)前狀態(tài);9.游戲操作;10.接受用戶輸入;11.報(bào)告游戲當(dāng)前狀態(tài);12.游戲信息提示;45TwoPlayerGame(抽象類)46publicstaticfinalintPLAYER_ONE=1;publicstaticfinalintPLAYER_TWO=2;protectedbooleanonePlaysNext=true;publicvoidsetPlayer(intstarter)//指定從哪位選手開始publicintgetPlayer()//返回當(dāng)前操作的選手publicvoidchangePlayer()//改變當(dāng)前操作的選手publicabstractStringgetRules();//返回游戲規(guī)則publicabstractbooleangameOver();//返回游戲是否結(jié)束publicabstractStringgetWinner();

//返回獲勝者

TwoPlayerGamesetPlayerpublicvoidsetPlayer(intstarter)//指定從哪位選手開始

{if(starter==PLAYER_TWO){onePlaysNext=false;}else{onePlaysNext=true;}}47getPlayerpublicintgetPlayer()//返回當(dāng)前操作的選手

{if(onePlaysNext==true){returnPLAYER_ONE;}else{returnPLAYER_TWO;}}48changePlayer()publicvoidchangePlayer()//改變當(dāng)前操作的選手

{onePlaysNext=!onePlaysNext;}49Game接口publicinterfaceGame{publicStringgetGamePrompt(); //返回游戲提示

publicStringreportGameState(); //返回游戲當(dāng)前狀態(tài)}50UIPlay接口publicinterfaceUIPlayextendsGame{voidplay(UserInterfaceui

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論