版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
本章內(nèi)容5.1關(guān)鍵字:static類(lèi)變量、類(lèi)方法單例(Singleton)設(shè)計(jì)模式5.2理解main方法的語(yǔ)法
5.3類(lèi)的成員之四:初始化塊5.4關(guān)鍵字:final5.5抽象類(lèi)(abstractclass)模板方法設(shè)計(jì)模式(TemplateMethod)5.6更徹底的抽象:接口(interface)工廠(chǎng)方法(FactoryMethod)和代理模式(Proxy)5.7類(lèi)的成員之五:內(nèi)部類(lèi)
當(dāng)我們編寫(xiě)一個(gè)類(lèi)時(shí),其實(shí)就是在描述其對(duì)象的屬性和行為,而并沒(méi)有產(chǎn)生實(shí)質(zhì)上的對(duì)象,只有通過(guò)new關(guān)鍵字才會(huì)產(chǎn)生出對(duì)象,這時(shí)系統(tǒng)才會(huì)分配內(nèi)存空間給對(duì)象,其方法才可以供外部調(diào)用。我們有時(shí)候希望無(wú)論是否產(chǎn)生了對(duì)象或無(wú)論產(chǎn)生了多少對(duì)象的情況下,某些特定的數(shù)據(jù)在內(nèi)存空間里只有一份,例如所有的中國(guó)人都有個(gè)國(guó)家名稱(chēng),每一個(gè)中國(guó)人都共享這個(gè)國(guó)家名稱(chēng),不必在每一個(gè)中國(guó)人的實(shí)例對(duì)象中都單獨(dú)分配一個(gè)用于代表國(guó)家名稱(chēng)的變量。5.1關(guān)鍵字staticSportsMans1=newSportsMan("金龍",23);SportsMans2=newSportsMan("銀龍",21);="花龍";s1.nation="China";s1:s2:name:金龍age:23nation:name:銀龍age:21nation:靜態(tài)域nation:null花龍China關(guān)鍵字staticclassCircle{ privatedoubleradius; publicCircle(doubleradius){this.radius=radius;} publicdoublefindArea(){returnMath.PI*radius*radius;}}創(chuàng)建兩個(gè)Circle對(duì)象Circlec1=newCircle(2.0); //c1.radius=2.0Circlec2=newCircle(3.0); //c2.radius=3.0Circle類(lèi)中的變量radius是一個(gè)實(shí)例變量(instancevariable),它屬于類(lèi)的每一個(gè)對(duì)象,不能被同一個(gè)類(lèi)的不同對(duì)象所共享。上例中c1的radius獨(dú)立于c2的radius,存儲(chǔ)在不同的空間。c1中的radius變化不會(huì)影響c2的radius,反之亦然。如果想讓一個(gè)類(lèi)的所有實(shí)例共享數(shù)據(jù),就用類(lèi)變量!類(lèi)屬性、類(lèi)方法的設(shè)計(jì)思想類(lèi)屬性作為該類(lèi)各個(gè)對(duì)象之間共享的變量。在設(shè)計(jì)類(lèi)時(shí),分析哪些類(lèi)屬性不因?qū)ο蟮牟煌淖?,將這些屬性設(shè)置為類(lèi)屬性。相應(yīng)的方法設(shè)置為類(lèi)方法。如果方法與調(diào)用者無(wú)關(guān),則這樣的方法通常被聲明為類(lèi)方法,由于不需要?jiǎng)?chuàng)建對(duì)象就可以調(diào)用類(lèi)方法,從而簡(jiǎn)化了方法的調(diào)用關(guān)鍵字static使用范圍:在Java類(lèi)中,可用static修飾屬性、方法、代碼塊、內(nèi)部類(lèi)被修飾后的成員具備以下特點(diǎn):隨著類(lèi)的加載而加載優(yōu)先于對(duì)象存在修飾的成員,被所有對(duì)象所共享訪(fǎng)問(wèn)權(quán)限允許時(shí),可不創(chuàng)建對(duì)象,直接被類(lèi)調(diào)用靜態(tài)域堆棧country:CHINAStatic的屬性a1:0x1232name:Peterage:12country:a2:0x1222name:Lileiage:21country:Athletea1=newAthlete("劉翔","110米欄","China");Athletea2=newAthlete("姚明","籃球","China");a2:a1:name:劉翔major:110米欄name:姚明major:籃球靜態(tài)域contry:China中國(guó)CHINAclassCircle{privatedoubleradius;publicstaticStringname="這是一個(gè)圓";publicstaticStringgetName(){returnname;}publicCircle(doubleradius){getName();this.radius=radius;}publicdoublefindArea(){returnMath.PI*radius*radius;}publicvoiddisplay(){System.out.println("name:"+name+"radius:"+radius);}}publicclassTestStatic{publicstaticvoidmain(String[]args){Circlec1=newCircle(2.0);Circlec2=newCircle(3.0);c1.display();c2.display();}}棧堆靜態(tài)域c1:c2:radius:2.0name:radius:3.0name:name:”圓”類(lèi)變量(classVariable)類(lèi)變量(類(lèi)屬性)由該類(lèi)的所有實(shí)例共享publicclassPerson{privateintid;publicstaticinttotal=0;publicPerson(){
total++; id=total;}}Person+total:int=0-id:intp1:Personid=1p2:Personid=2<<instanceOf>><<instanceOf>>Personp1=newPerson();Personp2=newPerson();類(lèi)變量應(yīng)用舉例classPerson{privateintid;publicstaticinttotal=0;publicPerson(){
total++; id=total;}publicstaticvoidmain(Stringargs[]){ PersonTom=newPerson(); Tom.id=0; total=100;//不用創(chuàng)建對(duì)象就可以訪(fǎng)問(wèn)靜態(tài)成員
}}publicclassOtherClass{publicstaticvoidmain(Stringargs[]){
Person.total=100;//不用創(chuàng)建對(duì)象就可以訪(fǎng)問(wèn)靜態(tài)成員
//訪(fǎng)問(wèn)方式:類(lèi)名.類(lèi)屬性,類(lèi)名.類(lèi)方法
System.out.println(Person.total); Personc=newPerson(); System.out.println(c.total);
//輸出101}}
classPerson{privateintid;privatestaticinttotal=0;publicstaticintgetTotalPerson(){ id++;
//非法 returntotal;}publicPerson(){ total++; id=total;}}publicclassTestPerson{publicstaticvoidmain(String[]args){ System.out.println("Numberoftotalis"+Person.getTotalPerson());
//沒(méi)有創(chuàng)建對(duì)象也可以訪(fǎng)問(wèn)靜態(tài)方法
Personp1=newPerson(); System.out.println("Numberoftotalis"+Person.getTotalPerson());}}類(lèi)方法(classMethod)沒(méi)有對(duì)象的實(shí)例時(shí),可以用類(lèi)名.方法名()的形式訪(fǎng)問(wèn)由static標(biāo)記的類(lèi)方法。在static方法內(nèi)部只能訪(fǎng)問(wèn)類(lèi)的static屬性,不能訪(fǎng)問(wèn)類(lèi)的非static屬性。Theoutputis:Numberoftotalis0Numberoftotalis1類(lèi)方法因?yàn)椴恍枰獙?shí)例就可以訪(fǎng)問(wèn)static方法,因此static方法內(nèi)部不能有this。(也不能有super?YES!)重載的方法需要同時(shí)為static的或者非static的。
classPerson{privateintid;privatestaticinttotal=0;publicstaticvoidsetTotalPerson(inttotal){ this.total=total;//非法,在static方法中不能有this,也不能有super}publicPerson(){ total++; id=total;}}publicclassTestPerson{publicstaticvoidmain(String[]args){ Person.setTotalPerson(3);}}練習(xí)1編寫(xiě)一個(gè)類(lèi)實(shí)現(xiàn)銀行賬戶(hù)的概念,包含的屬性有“帳號(hào)”、“密碼”、“存款余額”、“利率”、“最小余額”,定義封裝這些屬性的方法。賬號(hào)要自動(dòng)生成。編寫(xiě)主類(lèi),使用銀行賬戶(hù)類(lèi),輸入、輸出3個(gè)儲(chǔ)戶(hù)的上述信息??紤]:哪些屬性可以設(shè)計(jì)成static屬性。設(shè)計(jì)模式是在大量的實(shí)踐中總結(jié)和理論化之后優(yōu)選的代碼結(jié)構(gòu)、編程風(fēng)格、以及解決問(wèn)題的思考方式。設(shè)計(jì)模式就像是經(jīng)典的棋譜,不同的棋局,我們用不同的棋譜,免去我們自己再思考和摸索。所謂類(lèi)的單例設(shè)計(jì)模式,就是采取一定的方法保證在整個(gè)的軟件系統(tǒng)中,對(duì)某個(gè)類(lèi)只能存在一個(gè)對(duì)象實(shí)例,并且該類(lèi)只提供一個(gè)取得其對(duì)象實(shí)例的方法。如果我們要讓類(lèi)在一個(gè)虛擬機(jī)中只能產(chǎn)生一個(gè)對(duì)象,我們首先必須將類(lèi)的構(gòu)造方法的訪(fǎng)問(wèn)權(quán)限設(shè)置為private,這樣,就不能用new操作符在類(lèi)的外部產(chǎn)生類(lèi)的對(duì)象了,但在類(lèi)內(nèi)部仍可以產(chǎn)生該類(lèi)的對(duì)象。因?yàn)樵陬?lèi)的外部開(kāi)始還無(wú)法得到類(lèi)的對(duì)象,只能調(diào)用該類(lèi)的某個(gè)靜態(tài)方法以返回類(lèi)內(nèi)部創(chuàng)建的對(duì)象,靜態(tài)方法只能訪(fǎng)問(wèn)類(lèi)中的靜態(tài)成員變量,所以,指向類(lèi)內(nèi)部產(chǎn)生的該類(lèi)對(duì)象的變量也必須定義成靜態(tài)的。單例(Singleton)設(shè)計(jì)模式classSingle{
//private的構(gòu)造器,不能在類(lèi)的外部創(chuàng)建該類(lèi)的對(duì)象privateSingle(){}
//私有的,只能在類(lèi)的內(nèi)部訪(fǎng)問(wèn)privatestaticSingleonlyone=newSingle();
//getSingle()為static,不用創(chuàng)建對(duì)象即可訪(fǎng)問(wèn)publicstaticSinglegetSingle(){
returnonlyone; }}publicclassTestSingle{ publicstaticvoidmain(Stringargs[]){ Singles1=Single.getSingle();//訪(fǎng)問(wèn)靜態(tài)方法
Singles2=Single.getSingle(); if(s1==s2){ System.out.println("s1isequalstos2!"); }}}單例(Singleton)設(shè)計(jì)模式-餓漢式classSingleton{ //1.將構(gòu)造器私有化,保證在此類(lèi)的外部,不能調(diào)用本類(lèi)的構(gòu)造器。
privateSingleton(){ }
//2.先聲明類(lèi)的引用
//4.也需要配合static的方法,用static修飾此類(lèi)的引用。
privatestaticSingletoninstance=null;
//3.設(shè)置公共的方法來(lái)訪(fǎng)問(wèn)類(lèi)的實(shí)例
publicstaticSingletongetInstance(){
//3.1如果類(lèi)的實(shí)例未創(chuàng)建,那些先要?jiǎng)?chuàng)建,然后返回給調(diào)用者:本類(lèi)。因此,需要static修飾。
if(instance==null){ instance=newSingleton(); }
//3.2若有了類(lèi)的實(shí)例,直接返回給調(diào)用者。
returninstance; }}單例(Singleton)設(shè)計(jì)模式-懶漢式暫時(shí)懶漢式還存在線(xiàn)程安全問(wèn)題,講到多線(xiàn)程時(shí),可修復(fù)舉例:java.lang.Runtime5.2理解main方法的語(yǔ)法
由于java虛擬機(jī)需要調(diào)用類(lèi)的main()方法,所以該方法的訪(fǎng)問(wèn)權(quán)限必須是public,又因?yàn)閖ava虛擬機(jī)在執(zhí)行main()方法時(shí)不必創(chuàng)建對(duì)象,所以該方法必須是static的,該方法接收一個(gè)String類(lèi)型的數(shù)組參數(shù),該數(shù)組中保存執(zhí)行java命令時(shí)傳遞給所運(yùn)行的類(lèi)的參數(shù)。命令行參數(shù)用法舉例publicclassCommandPara{publicstaticvoidmain(String[]args){ for(inti=0;i<args.length;i++){ System.out.println("args["+i+"]="+args[i]); }}}//運(yùn)行程序CommandPara.javajavaCommandPara"lisa""bily""MrBrown"
輸出結(jié)果:args[0]=lisaargs[1]=bilyargs[2]=MrBrown5.3類(lèi)的成員之四:初始化塊初始化塊(代碼塊)作用:對(duì)Java對(duì)象進(jìn)行初始化程序的執(zhí)行順序:聲明成員變量的默認(rèn)值
顯式初始化、多個(gè)初始化塊依次被執(zhí)行(同級(jí)別下按先后順序執(zhí)行)
構(gòu)造器再對(duì)成員進(jìn)行賦值操作5.3類(lèi)的成員之四:初始化塊一個(gè)類(lèi)中初始化塊若有修飾符,則只能被static修飾,稱(chēng)為靜態(tài)代碼塊(staticblock),當(dāng)類(lèi)被載入時(shí),類(lèi)屬性的聲明和靜態(tài)代碼塊先后順序被執(zhí)行,且只被執(zhí)行一次。static塊通常用于初始化static(類(lèi))屬性classPerson{ publicstaticinttotal;
static{ total=100;//為total賦初值
}
……//其它屬性或方法聲明
}5.3類(lèi)的成員之四:初始化塊非靜態(tài)代碼塊:沒(méi)有static修飾的代碼塊
1.可以有輸出語(yǔ)句。
2.可以對(duì)類(lèi)的屬性、類(lèi)的聲明進(jìn)行初始化操作。
3.可以調(diào)用靜態(tài)的變量或方法。
4.若有多個(gè)非靜態(tài)的代碼塊,那么按照從上到下的順序依
次執(zhí)行。
5.每次創(chuàng)建對(duì)象的時(shí)候,都會(huì)執(zhí)行一次。且先于構(gòu)造器執(zhí)行靜態(tài)代碼塊:用static修飾的代碼塊
1.可以有輸出語(yǔ)句。
2.可以對(duì)類(lèi)的屬性、類(lèi)的聲明進(jìn)行初始化操作。
3.不可以對(duì)非靜態(tài)的屬性初始化。即:不可以調(diào)用非靜態(tài)的屬
性和方法。
4.若有多個(gè)靜態(tài)的代碼塊,那么按照從上到下的順序依次執(zhí)行。
5.靜態(tài)代碼塊的執(zhí)行要先于非靜態(tài)代碼塊。
6.靜態(tài)代碼塊只執(zhí)行一次靜態(tài)初始化塊舉例classPerson{ publicstaticinttotal; static{ total=100; System.out.println("instaticblock!"); }}publicclassTest{ publicstaticvoidmain(String[]args){ System.out.println("total="+Person.total); System.out.println("total="+Person.total); }}舉例二:TestLeaf.java輸出:instaticblocktotal=100total=1005.4關(guān)鍵字:final在Java中聲明類(lèi)、屬性和方法時(shí),可使用關(guān)鍵字final來(lái)修飾,表示“最終”。final標(biāo)記的類(lèi)不能被繼承。提高安全性,提高程序的可讀性。String類(lèi)、System類(lèi)、StringBuffer類(lèi)final標(biāo)記的方法不能被子類(lèi)重寫(xiě)。Object類(lèi)中的getClass()。final標(biāo)記的變量(成員變量或局部變量)即稱(chēng)為常量。名稱(chēng)大寫(xiě),且只能被賦值一次。final標(biāo)記的成員變量必須在聲明的同時(shí)或在每個(gè)構(gòu)造方法中或代碼塊中顯式賦值,然后才能使用。finaldoublePI=3.14;1.final修飾類(lèi)finalclassA{}classBextendsA{//錯(cuò)誤,不能被繼承。}中國(guó)古代,什么人不能有后代,就可以被final聲明,稱(chēng)為太監(jiān)類(lèi)!2.final修飾方法classA{publicfinalvoidprint(){System.out.println(“A”);}}classBextendsA{publicvoidprint(){//錯(cuò)誤,不能被重寫(xiě)。System.out.println(“尚硅谷”);}}3.final修飾變量——常量classA{privatefinalStringINFO=“atguigu”;//聲明常量publicvoidprint(){//INFO=“尚硅谷”;}}常量名要大寫(xiě),內(nèi)容不可修改?!缤糯实鄣氖ブ?。staticfinal:全局常量關(guān)鍵字final應(yīng)用舉例publicfinalclassTest{ publicstaticinttotalNumber=5; publicfinalintID; publicTest(){ ID=++totalNumber;//可在構(gòu)造方法中給final變量賦值
} publicstaticvoidmain(String[]args){ Testt=newTest(); System.out.println(t.ID); finalintI=10; finalintJ; J=20; J=30;//非法
}}排錯(cuò):publicclassSomething{publicintaddOne(finalintx){return++x;}}publicclassSomething{publicstaticvoidmain(String[]args){Othero=newOther();newSomething().addOne(o);}publicvoidaddOne(finalOthero){o.i++;}}classOther{publicinti;}5.5抽象類(lèi)(abstractclass)隨著繼承層次中一個(gè)個(gè)新子類(lèi)的定義,類(lèi)變得越來(lái)越具體,而父類(lèi)則更一般,更通用。類(lèi)的設(shè)計(jì)應(yīng)該保證父類(lèi)和子類(lèi)能夠共享特征。有時(shí)將一個(gè)父類(lèi)設(shè)計(jì)得非常抽象,以至于它沒(méi)有具體的實(shí)例,這樣的類(lèi)叫做抽象類(lèi)。抽象類(lèi)用abstract關(guān)鍵字來(lái)修飾一個(gè)類(lèi)時(shí),這個(gè)類(lèi)叫做抽象類(lèi);
用abstract來(lái)修飾一個(gè)方法時(shí),該方法叫做抽象方法。抽象方法:只有方法的聲明,沒(méi)有方法的實(shí)現(xiàn)。以分號(hào)結(jié)束:abstract
intabstractMethod(inta);含有抽象方法的類(lèi)必須被聲明為抽象類(lèi)。抽象類(lèi)不能被實(shí)例化。抽象類(lèi)是用來(lái)被繼承的,抽象類(lèi)的子類(lèi)必須重寫(xiě)父類(lèi)的抽象方法,并提供方法體。若沒(méi)有重寫(xiě)全部的抽象方法,仍為抽象類(lèi)。不能用abstract修飾屬性、私有方法、構(gòu)造器、靜態(tài)方法、final的方法。抽象類(lèi)舉例abstractclassA{abstractvoidm1();publicvoidm2(){ System.out.println("A類(lèi)中定義的m2方法");}}classBextendsA{voidm1(){ System.out.println("B類(lèi)中定義的m1方法");}}publicclassTest{publicstaticvoidmain(Stringargs[]){ Aa=newB(); a.m1(); a.m2();}}抽象類(lèi)應(yīng)用在航運(yùn)公司系統(tǒng)中,Vehicle類(lèi)需要定義兩個(gè)方法分別計(jì)算運(yùn)輸工具的燃料效率和行駛距離。抽象類(lèi)是用來(lái)模型化那些父類(lèi)無(wú)法確定全部實(shí)現(xiàn),而是由其子類(lèi)提供具體實(shí)現(xiàn)的對(duì)象的類(lèi)。問(wèn)題:卡車(chē)(Truck)和駁船(RiverBarge)的燃料效率和行駛距離的計(jì)算方法完全不同。Vehicle類(lèi)不能提供計(jì)算方法,但子類(lèi)可以。解決方案
Java允許類(lèi)設(shè)計(jì)者指定:超類(lèi)聲明一個(gè)方法但不提供實(shí)現(xiàn),該方法的實(shí)現(xiàn)由子類(lèi)提供。這樣的方法稱(chēng)為抽象方法。有一個(gè)或更多抽象方法的類(lèi)稱(chēng)為抽象類(lèi)。Vehicle是一個(gè)抽象類(lèi),有兩個(gè)抽象方法。publicabstractclassVehicle{ publicabstractdoublecalcFuelEfficiency(); //計(jì)算燃料效率的抽象方法
publicabstractdoublecalcTripDistance(); //計(jì)算行駛距離的抽象方法}publicclassTruckextendsVehicle{ publicdoublecalcFuelEfficiency(){//寫(xiě)出計(jì)算卡車(chē)的燃料效率的具體方法} publicdoublecalcTripDistance(){//寫(xiě)出計(jì)算卡車(chē)行駛距離的具體方法}}publicclassRiverBargeextendsVehicle{ publicdoublecalcFuelEfficiency(){//寫(xiě)出計(jì)算駁船的燃料效率的具體方法} publicdoublecalcTripDistance(){//寫(xiě)出計(jì)算駁船行駛距離的具體方法}}抽象類(lèi)應(yīng)用注意:抽象類(lèi)不能實(shí)例化newVihicle()是非法的思考問(wèn)題1:為什么抽象類(lèi)不可以使用final關(guān)鍵字聲明?問(wèn)題2:一個(gè)抽象類(lèi)中可以定義構(gòu)造器嗎?練習(xí)2編寫(xiě)一個(gè)Employee類(lèi),聲明為抽象類(lèi),包含如下三個(gè)屬性:name,id,salary。提供必要的構(gòu)造器和抽象方法:work()。對(duì)于Manager類(lèi)來(lái)說(shuō),他既是員工,還具有獎(jiǎng)金(bonus)的屬性。請(qǐng)使用繼承的思想,設(shè)計(jì)CommonEmployee類(lèi)和Manager類(lèi),要求類(lèi)中提供必要的方法進(jìn)行屬性訪(fǎng)問(wèn)。模板方法設(shè)計(jì)模式(TemplateMethod)抽象類(lèi)體現(xiàn)的就是一種模板模式的設(shè)計(jì),抽象類(lèi)作為多個(gè)子類(lèi)的通用模板,子類(lèi)在抽象類(lèi)的基礎(chǔ)上進(jìn)行擴(kuò)展、改造,但子類(lèi)總體上會(huì)保留抽象類(lèi)的行為方式。解決的問(wèn)題:當(dāng)功能內(nèi)部一部分實(shí)現(xiàn)是確定,一部分實(shí)現(xiàn)是不確定的。這時(shí)可以把不確定的部分暴露出去,讓子類(lèi)去實(shí)現(xiàn)。編寫(xiě)一個(gè)抽象父類(lèi),父類(lèi)提供了多個(gè)子類(lèi)的通用方法,并把一個(gè)或多個(gè)方法留給其子類(lèi)實(shí)現(xiàn),就是一種模板模式。模板方法設(shè)計(jì)模式(TemplateMethod)abstractclassTemplate{ publicfinalvoidgetTime(){ longstart=System.currentTimeMillis(); code(); longend=System.currentTimeMillis(); System.out.println("執(zhí)行時(shí)間是:"+(end-start)); } publicabstractvoidcode();}classSubTemplateextendsTemplate{ publicvoidcode(){ for(inti=0;i<10000;i++){ System.out.println(i);}
}}5.6接口(1)有時(shí)必須從幾個(gè)類(lèi)中派生出一個(gè)子類(lèi),繼承它們所有的屬性和方法。但是,Java不支持多重繼承。有了接口,就可以得到多重繼承的效果。接口(interface)是抽象方法和常量值的定義的集合。從本質(zhì)上講,接口是一種特殊的抽象類(lèi),這種抽象類(lèi)中只包含常量和方法的定義,而沒(méi)有變量和方法的實(shí)現(xiàn)。實(shí)現(xiàn)接口類(lèi):classSubClassimplementsInterfaceA{}一個(gè)類(lèi)可以實(shí)現(xiàn)多個(gè)接口,接口也可以繼承其它接口。接口(2)運(yùn)動(dòng)員(抽象類(lèi))學(xué)生(抽象類(lèi))籃球運(yùn)動(dòng)員大學(xué)生跨欄運(yùn)動(dòng)員中學(xué)生學(xué)習(xí)英語(yǔ)的技能(接口)extendsimplements接口(3)接口的特點(diǎn):用interface來(lái)定義。接口中的所有成員變量都默認(rèn)是由publicstaticfinal修飾的。接口中的所有方法都默認(rèn)是由publicabstract修飾的。接口沒(méi)有構(gòu)造器。接口采用多繼承機(jī)制。接口定義舉例publicinterfaceRunner{ intID=1; voidstart(); publicvoidrun(); voidstop();}publicinterfaceRunner{publicstaticfinalintID=1;publicabstractvoidstart();publicabstractvoidrun();publicabstractvoidstop();}接口(4)實(shí)現(xiàn)接口的類(lèi)中必須提供接口中所有方法的具體實(shí)現(xiàn)內(nèi)容,方可實(shí)例化。否則,仍為抽象類(lèi)。接口的主要用途就是被實(shí)現(xiàn)類(lèi)實(shí)現(xiàn)。(面向接口編程)與繼承關(guān)系類(lèi)似,接口與實(shí)現(xiàn)類(lèi)之間存在多態(tài)性定義Java類(lèi)的語(yǔ)法格式:先寫(xiě)extends,后寫(xiě)implements
<modifier>class<name>[extends<superclass>] [implements<interface>[,<interface>]*]{ <declarations>* }接口應(yīng)用舉例(1)<<interface>>Runner+start()+run()+stop()Person+start()+run()+stop()+dance()Car+start()+run()+stop()+fillFuel()+crack()Bird+start()+run()+stop()+fly()接口應(yīng)用舉例(1)publicinterfaceRunner{ publicvoidstart(); publicvoidrun(); publicvoidstop();}publicclassPersonimplementsRunner{ publicvoidstart(){
//準(zhǔn)備工作:彎腰、蹬腿、咬牙、瞪眼 //開(kāi)跑
} publicvoidrun(){
//擺動(dòng)手臂
//維持直線(xiàn)方向
} publicvoidstop(){
//減速直至停止、喝水。
}}接口應(yīng)用舉例(2)
一個(gè)類(lèi)可以實(shí)現(xiàn)多個(gè)無(wú)關(guān)的接口interfaceRunner{publicvoidrun();}interfaceSwimmer{publicdoubleswim();}classCreator{publicinteat(){…}}classManextendsCreatorimplementsRunner,Swimmer{ publicvoidrun(){……} publicdoubleswim(){……} publicinteat(){……}}與繼承關(guān)系類(lèi)似,接口與實(shí)現(xiàn)類(lèi)之間存在多態(tài)性publicclassTest{ publicstaticvoidmain(Stringargs[]){ Testt=newTest(); Manm=newMan(); t.m1(m); t.m2(m); t.m3(m); } publicStringm1(Runnerf){f.run();} publicvoidm2(Swimmers){s.swim();} publicvoidm3(Creatora){a.eat();}}接口的其他問(wèn)題如果實(shí)現(xiàn)接口的類(lèi)中沒(méi)有實(shí)現(xiàn)接口中的全部方法,必須將此類(lèi)定義為抽象類(lèi)接口也可以繼承另一個(gè)接口,使用extends關(guān)鍵字。interfaceMyInterface{ Strings=“MyInterface”; publicvoidabsM1(); } interfaceSubInterfaceextendsMyInterface{ publicvoidabsM2(); } publicclassSubAdapterimplementsSubInterface{ publicvoidabsM1(){System.out.println(“absM1”);} publicvoidabsM2(){System.out.println(“absM2”);} }實(shí)現(xiàn)類(lèi)SubAdapter必須給出接口SubInterface以及父接口MyInterface中所有方法的實(shí)現(xiàn)。工廠(chǎng)方法(FactoryMethod)概述:定義一個(gè)用于創(chuàng)建對(duì)象的接口,讓子類(lèi)決定實(shí)例化哪一個(gè)類(lèi)。FactoryMethod使一個(gè)類(lèi)的實(shí)例化延遲到其子類(lèi)。適用性:1.當(dāng)一個(gè)類(lèi)不知道它所必須創(chuàng)建的對(duì)象的類(lèi)的時(shí)候2.當(dāng)一個(gè)類(lèi)希望由它的子類(lèi)來(lái)指定它所創(chuàng)建的對(duì)象的時(shí)候3.當(dāng)類(lèi)將創(chuàng)建對(duì)象的職責(zé)委托給多個(gè)幫助子類(lèi)中的某一個(gè),并且你希望將哪一個(gè)幫助子類(lèi)是代理者這一信息局部化的時(shí)候工廠(chǎng)方法舉例工廠(chǎng)方法(FactoryMethod)總結(jié):
FactoryMethod模式是設(shè)計(jì)模式中應(yīng)用最為廣泛的模式,在面向?qū)ο蟮木幊讨?,?duì)象的創(chuàng)建工作非常簡(jiǎn)單,對(duì)象的創(chuàng)建時(shí)機(jī)卻很重要。FactoryMethod解決的就是這個(gè)問(wèn)題,它通過(guò)面向?qū)ο蟮氖址?,將所要?jiǎng)?chuàng)建的具體對(duì)象的創(chuàng)建工作延遲到了子類(lèi),從而提供了一種擴(kuò)展的策略,較好的解決了這種緊耦合的關(guān)系。代理模式(Proxy)概述:為其他對(duì)象提供一種代理以控制對(duì)這個(gè)對(duì)象的訪(fǎng)問(wèn)。interfaceObject{voidaction();}classProxyObjectimplementsObject{Objectobj;publicvoidaction(){System.out.println("代理開(kāi)始");obj.action();System.out.println("代理結(jié)束");}publicProxyObject(){System.out.println("這是代理類(lèi)");obj=newObjectImpl();}}classObjectImplimplementsObject{publicvoidaction(){System.out.println("======");System.out.println("======");System.out.println("被代理的類(lèi)");System.out.println("======");System.out.println("======");}}publicclassTest2{publicstaticvoidmain(String[]args){Objectob=newProxyObject();ob.action();}}接口用法總結(jié)通過(guò)接口可以實(shí)現(xiàn)不相關(guān)類(lèi)的相同行為,而不需要考慮這些類(lèi)之間的層次關(guān)系。通過(guò)接口可以指明多個(gè)類(lèi)需要實(shí)現(xiàn)的方法,一般用于定義對(duì)象的擴(kuò)張功能。接口主要用來(lái)定義規(guī)范。解除耦合關(guān)系。接口和抽象類(lèi)之間的關(guān)系在開(kāi)發(fā)中,一個(gè)類(lèi)不要去繼承一個(gè)已經(jīng)實(shí)現(xiàn)好的類(lèi),要么繼承抽象類(lèi),要么實(shí)現(xiàn)接口。No.區(qū)別點(diǎn)抽象類(lèi)接口1定義包含一個(gè)抽象方法的類(lèi)抽象方法和全局常量的集合2組成構(gòu)造方法、抽象方法、普通方法、常量、變量常量、抽象方法3使用子類(lèi)繼承抽象類(lèi)(extends)子類(lèi)實(shí)現(xiàn)接口(implements)4關(guān)系抽象類(lèi)可以實(shí)現(xiàn)多個(gè)接口接口不能繼承抽象類(lèi),但允許繼承多個(gè)接口5常見(jiàn)設(shè)計(jì)模式模板設(shè)計(jì)工廠(chǎng)設(shè)計(jì)、代理設(shè)計(jì)6對(duì)象都通過(guò)對(duì)象的多態(tài)性產(chǎn)生實(shí)例化對(duì)象7局限抽象類(lèi)有單繼承的局限接口沒(méi)有此局限8實(shí)際作為一個(gè)模板是作為一個(gè)標(biāo)準(zhǔn)或是表示一種能力9選擇如果抽象類(lèi)和接口都可以使用的話(huà),優(yōu)先使用接口,因?yàn)楸苊鈫卫^承的局限10特殊一個(gè)抽象類(lèi)中可以包含多個(gè)接口,一個(gè)接口中可以包含多個(gè)抽象類(lèi)練習(xí)3定義一個(gè)接口用來(lái)實(shí)現(xiàn)兩個(gè)對(duì)象的比較。interfaceCompareObject{ publicintcompareTo(Objecto);//若返回值是0,代表相等;若為正數(shù),代表當(dāng)前對(duì)象大;負(fù)數(shù)代表當(dāng)前對(duì)象小}定義一個(gè)Circle類(lèi)。定義一個(gè)ComparableCircle類(lèi),繼承Circle類(lèi)并且實(shí)現(xiàn)CompareObject接口。在ComparableCircle類(lèi)中給出接口中方法compareTo的實(shí)現(xiàn)體,用來(lái)比較兩個(gè)圓的半徑大小。定義一個(gè)測(cè)試類(lèi)TestInterface,創(chuàng)建兩個(gè)ComparableCircle對(duì)象,調(diào)用compareTo方法比較兩個(gè)類(lèi)的半徑大小。思考:參照上述做法定義矩形類(lèi)Rectangle和ComparableRectangle類(lèi),在ComparableRectangle類(lèi)中給出compareTo方法的實(shí)現(xiàn),比較兩個(gè)矩形的面積大小。接口的應(yīng)用體會(huì)面向接口編程的思想5.7類(lèi)的成員之五:內(nèi)部類(lèi)在Java中,允許一個(gè)類(lèi)的定義位于另一個(gè)類(lèi)的內(nèi)部,前者稱(chēng)為內(nèi)部類(lèi),后者稱(chēng)為外部類(lèi)。Innerclass一般用在定義它的類(lèi)或語(yǔ)句塊之內(nèi),在外部引用它時(shí)必須給出完整的名稱(chēng)。Innerclass的名字不能與包含它的類(lèi)名相同;Innerclass可以使用外部類(lèi)的私有數(shù)據(jù),因?yàn)樗峭獠款?lèi)的成員,同一個(gè)類(lèi)的成員之間可相互訪(fǎng)問(wèn)。而外部類(lèi)要訪(fǎng)問(wèn)內(nèi)部類(lèi)中的成員需要:內(nèi)部類(lèi).成員或者內(nèi)部類(lèi)對(duì)象.成員。分類(lèi):成員內(nèi)部類(lèi)(static成員內(nèi)部類(lèi)和非static成員內(nèi)部類(lèi))
局部?jī)?nèi)部類(lèi)(不談修飾符)、匿名內(nèi)部類(lèi)內(nèi)部類(lèi)舉例(1)
classA{ privateints; publicclassB{ publicvoidmb(){ s=100; System.out.println("在內(nèi)部類(lèi)B中s="+s); }} publicvoidma(){ Bi=newB(); i.mb(); }}publicclassTest{ publicstaticvoidmain(Stringargs[])
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 標(biāo)準(zhǔn)視頻會(huì)議設(shè)備租賃合同
- 家長(zhǎng)走讀保證書(shū)一份對(duì)生命的承諾
- 保密承諾與職責(zé)明細(xì)
- 信息咨詢(xún)服務(wù)中心合同
- 五金元件購(gòu)銷(xiāo)協(xié)議樣本
- 業(yè)績(jī)提升協(xié)議樣本
- 網(wǎng)絡(luò)打印機(jī)購(gòu)買(mǎi)合同
- 標(biāo)準(zhǔn)房屋買(mǎi)賣(mài)合同的適用心得
- 2024年兼職買(mǎi)手與自行車(chē)店合作協(xié)議3篇
- 進(jìn)出口合同協(xié)議書(shū)范本模板
- 統(tǒng)編版語(yǔ)文三年級(jí)上冊(cè)2024-2025學(xué)年第三單元測(cè)試題 (含答案)
- 2024甘肅省安全員C證考試題庫(kù)
- 2024-2025學(xué)年上學(xué)期廣州初中地理七年級(jí)期末模擬卷1
- 八年級(jí)地理期末模擬卷(考試版A4)【測(cè)試范圍:晉教版八上全冊(cè)】
- 隧道爆破施工合同
- 護(hù)理亮點(diǎn)工作展示
- 2024年河南省中考物理試題解析版
- 2024年文化娛樂(lè)產(chǎn)業(yè)投資合同3篇
- 《肺癌病人的護(hù)理》課件
- 《營(yíng)銷(xiāo)管理與分析》課件
- 挖機(jī)承包土地開(kāi)挖合同2024年
評(píng)論
0/150
提交評(píng)論