版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
本章內(nèi)容5.1關(guān)鍵字:static類變量、類方法單例(Singleton)設(shè)計模式5.2理解main方法的語法
5.3類的成員之四:初始化塊5.4關(guān)鍵字:final5.5抽象類(abstractclass)模板方法設(shè)計模式(TemplateMethod)5.6更徹底的抽象:接口(interface)工廠方法(FactoryMethod)和代理模式(Proxy)5.7類的成員之五:內(nèi)部類
當(dāng)我們編寫一個類時,其實就是在描述其對象的屬性和行為,而并沒有產(chǎn)生實質(zhì)上的對象,只有通過new關(guān)鍵字才會產(chǎn)生出對象,這時系統(tǒng)才會分配內(nèi)存空間給對象,其方法才可以供外部調(diào)用。我們有時候希望無論是否產(chǎn)生了對象或無論產(chǎn)生了多少對象的情況下,某些特定的數(shù)據(jù)在內(nèi)存空間里只有一份,例如所有的中國人都有個國家名稱,每一個中國人都共享這個國家名稱,不必在每一個中國人的實例對象中都單獨分配一個用于代表國家名稱的變量。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)建兩個Circle對象Circlec1=newCircle(2.0); //c1.radius=2.0Circlec2=newCircle(3.0); //c2.radius=3.0Circle類中的變量radius是一個實例變量(instancevariable),它屬于類的每一個對象,不能被同一個類的不同對象所共享。上例中c1的radius獨立于c2的radius,存儲在不同的空間。c1中的radius變化不會影響c2的radius,反之亦然。如果想讓一個類的所有實例共享數(shù)據(jù),就用類變量!類屬性、類方法的設(shè)計思想類屬性作為該類各個對象之間共享的變量。在設(shè)計類時,分析哪些類屬性不因?qū)ο蟮牟煌淖?,將這些屬性設(shè)置為類屬性。相應(yīng)的方法設(shè)置為類方法。如果方法與調(diào)用者無關(guān),則這樣的方法通常被聲明為類方法,由于不需要創(chuàng)建對象就可以調(diào)用類方法,從而簡化了方法的調(diào)用關(guān)鍵字static使用范圍:在Java類中,可用static修飾屬性、方法、代碼塊、內(nèi)部類被修飾后的成員具備以下特點:隨著類的加載而加載優(yōu)先于對象存在修飾的成員,被所有對象所共享訪問權(quán)限允許時,可不創(chuàng)建對象,直接被類調(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中國CHINAclassCircle{privatedoubleradius;publicstaticStringname="這是一個圓";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:”圓”類變量(classVariable)類變量(類屬性)由該類的所有實例共享publicclassPerson{privateintid;publicstaticinttotal=0;publicPerson(){
total++; id=total;}}Person+total:int=0-id:intp1:Personid=1p2:Personid=2<<instanceOf>><<instanceOf>>Personp1=newPerson();Personp2=newPerson();類變量應(yīng)用舉例classPerson{privateintid;publicstaticinttotal=0;publicPerson(){
total++; id=total;}publicstaticvoidmain(Stringargs[]){ PersonTom=newPerson(); Tom.id=0; total=100;//不用創(chuàng)建對象就可以訪問靜態(tài)成員
}}publicclassOtherClass{publicstaticvoidmain(Stringargs[]){
Person.total=100;//不用創(chuàng)建對象就可以訪問靜態(tà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());
//沒有創(chuàng)建對象也可以訪問靜態(tài)方法
Personp1=newPerson(); System.out.println("Numberoftotalis"+Person.getTotalPerson());}}類方法(classMethod)沒有對象的實例時,可以用類名.方法名()的形式訪問由static標(biāo)記的類方法。在static方法內(nèi)部只能訪問類的static屬性,不能訪問類的非static屬性。Theoutputis:Numberoftotalis0Numberoftotalis1類方法因為不需要實例就可以訪問static方法,因此static方法內(nèi)部不能有this。(也不能有super?YES!)重載的方法需要同時為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àn)銀行賬戶的概念,包含的屬性有“帳號”、“密碼”、“存款余額”、“利率”、“最小余額”,定義封裝這些屬性的方法。賬號要自動生成。編寫主類,使用銀行賬戶類,輸入、輸出3個儲戶的上述信息??紤]:哪些屬性可以設(shè)計成static屬性。設(shè)計模式是在大量的實踐中總結(jié)和理論化之后優(yōu)選的代碼結(jié)構(gòu)、編程風(fēng)格、以及解決問題的思考方式。設(shè)計模式就像是經(jīng)典的棋譜,不同的棋局,我們用不同的棋譜,免去我們自己再思考和摸索。所謂類的單例設(shè)計模式,就是采取一定的方法保證在整個的軟件系統(tǒng)中,對某個類只能存在一個對象實例,并且該類只提供一個取得其對象實例的方法。如果我們要讓類在一個虛擬機中只能產(chǎn)生一個對象,我們首先必須將類的構(gòu)造方法的訪問權(quán)限設(shè)置為private,這樣,就不能用new操作符在類的外部產(chǎn)生類的對象了,但在類內(nèi)部仍可以產(chǎn)生該類的對象。因為在類的外部開始還無法得到類的對象,只能調(diào)用該類的某個靜態(tài)方法以返回類內(nèi)部創(chuàng)建的對象,靜態(tài)方法只能訪問類中的靜態(tài)成員變量,所以,指向類內(nèi)部產(chǎn)生的該類對象的變量也必須定義成靜態(tài)的。單例(Singleton)設(shè)計模式classSingle{
//private的構(gòu)造器,不能在類的外部創(chuàng)建該類的對象privateSingle(){}
//私有的,只能在類的內(nèi)部訪問privatestaticSingleonlyone=newSingle();
//getSingle()為static,不用創(chuàng)建對象即可訪問publicstaticSinglegetSingle(){
returnonlyone; }}publicclassTestSingle{ publicstaticvoidmain(Stringargs[]){ Singles1=Single.getSingle();//訪問靜態(tài)方法
Singles2=Single.getSingle(); if(s1==s2){ System.out.println("s1isequalstos2!"); }}}單例(Singleton)設(shè)計模式-餓漢式classSingleton{ //1.將構(gòu)造器私有化,保證在此類的外部,不能調(diào)用本類的構(gòu)造器。
privateSingleton(){ }
//2.先聲明類的引用
//4.也需要配合static的方法,用static修飾此類的引用。
privatestaticSingletoninstance=null;
//3.設(shè)置公共的方法來訪問類的實例
publicstaticSingletongetInstance(){
//3.1如果類的實例未創(chuàng)建,那些先要創(chuàng)建,然后返回給調(diào)用者:本類。因此,需要static修飾。
if(instance==null){ instance=newSingleton(); }
//3.2若有了類的實例,直接返回給調(diào)用者。
returninstance; }}單例(Singleton)設(shè)計模式-懶漢式暫時懶漢式還存在線程安全問題,講到多線程時,可修復(fù)舉例:java.lang.Runtime5.2理解main方法的語法
由于java虛擬機需要調(diào)用類的main()方法,所以該方法的訪問權(quán)限必須是public,又因為java虛擬機在執(zhí)行main()方法時不必創(chuàng)建對象,所以該方法必須是static的,該方法接收一個String類型的數(shù)組參數(shù),該數(shù)組中保存執(zhí)行java命令時傳遞給所運行的類的參數(shù)。命令行參數(shù)用法舉例publicclassCommandPara{publicstaticvoidmain(String[]args){ for(inti=0;i<args.length;i++){ System.out.println("args["+i+"]="+args[i]); }}}//運行程序CommandPara.javajavaCommandPara"lisa""bily""MrBrown"
輸出結(jié)果:args[0]=lisaargs[1]=bilyargs[2]=MrBrown5.3類的成員之四:初始化塊初始化塊(代碼塊)作用:對Java對象進行初始化程序的執(zhí)行順序:聲明成員變量的默認(rèn)值
顯式初始化、多個初始化塊依次被執(zhí)行(同級別下按先后順序執(zhí)行)
構(gòu)造器再對成員進行賦值操作5.3類的成員之四:初始化塊一個類中初始化塊若有修飾符,則只能被static修飾,稱為靜態(tài)代碼塊(staticblock),當(dāng)類被載入時,類屬性的聲明和靜態(tài)代碼塊先后順序被執(zhí)行,且只被執(zhí)行一次。static塊通常用于初始化static(類)屬性classPerson{ publicstaticinttotal;
static{ total=100;//為total賦初值
}
……//其它屬性或方法聲明
}5.3類的成員之四:初始化塊非靜態(tài)代碼塊:沒有static修飾的代碼塊
1.可以有輸出語句。
2.可以對類的屬性、類的聲明進行初始化操作。
3.可以調(diào)用靜態(tài)的變量或方法。
4.若有多個非靜態(tài)的代碼塊,那么按照從上到下的順序依
次執(zhí)行。
5.每次創(chuàng)建對象的時候,都會執(zhí)行一次。且先于構(gòu)造器執(zhí)行靜態(tài)代碼塊:用static修飾的代碼塊
1.可以有輸出語句。
2.可以對類的屬性、類的聲明進行初始化操作。
3.不可以對非靜態(tài)的屬性初始化。即:不可以調(diào)用非靜態(tài)的屬
性和方法。
4.若有多個靜態(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中聲明類、屬性和方法時,可使用關(guān)鍵字final來修飾,表示“最終”。final標(biāo)記的類不能被繼承。提高安全性,提高程序的可讀性。String類、System類、StringBuffer類final標(biāo)記的方法不能被子類重寫。Object類中的getClass()。final標(biāo)記的變量(成員變量或局部變量)即稱為常量。名稱大寫,且只能被賦值一次。final標(biāo)記的成員變量必須在聲明的同時或在每個構(gòu)造方法中或代碼塊中顯式賦值,然后才能使用。finaldoublePI=3.14;1.final修飾類finalclassA{}classBextendsA{//錯誤,不能被繼承。}中國古代,什么人不能有后代,就可以被final聲明,稱為太監(jiān)類!2.final修飾方法classA{publicfinalvoidprint(){System.out.println(“A”);}}classBextendsA{publicvoidprint(){//錯誤,不能被重寫。System.out.println(“尚硅谷”);}}3.final修飾變量——常量classA{privatefinalStringINFO=“atguigu”;//聲明常量publicvoidprint(){//INFO=“尚硅谷”;}}常量名要大寫,內(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;//非法
}}排錯:publicclassSomething{publicintaddOne(finalintx){return++x;}}publicclassSomething{publicstaticvoidmain(String[]args){Othero=newOther();newSomething().addOne(o);}publicvoidaddOne(finalOthero){o.i++;}}classOther{publicinti;}5.5抽象類(abstractclass)隨著繼承層次中一個個新子類的定義,類變得越來越具體,而父類則更一般,更通用。類的設(shè)計應(yīng)該保證父類和子類能夠共享特征。有時將一個父類設(shè)計得非常抽象,以至于它沒有具體的實例,這樣的類叫做抽象類。抽象類用abstract關(guān)鍵字來修飾一個類時,這個類叫做抽象類;
用abstract來修飾一個方法時,該方法叫做抽象方法。抽象方法:只有方法的聲明,沒有方法的實現(xiàn)。以分號結(jié)束:abstract
intabstractMethod(inta);含有抽象方法的類必須被聲明為抽象類。抽象類不能被實例化。抽象類是用來被繼承的,抽象類的子類必須重寫父類的抽象方法,并提供方法體。若沒有重寫全部的抽象方法,仍為抽象類。不能用abstract修飾屬性、私有方法、構(gòu)造器、靜態(tài)方法、final的方法。抽象類舉例abstractclassA{abstractvoidm1();publicvoidm2(){ System.out.println("A類中定義的m2方法");}}classBextendsA{voidm1(){ System.out.println("B類中定義的m1方法");}}publicclassTest{publicstaticvoidmain(Stringargs[]){ Aa=newB(); a.m1(); a.m2();}}抽象類應(yīng)用在航運公司系統(tǒng)中,Vehicle類需要定義兩個方法分別計算運輸工具的燃料效率和行駛距離。抽象類是用來模型化那些父類無法確定全部實現(xiàn),而是由其子類提供具體實現(xiàn)的對象的類。問題:卡車(Truck)和駁船(RiverBarge)的燃料效率和行駛距離的計算方法完全不同。Vehicle類不能提供計算方法,但子類可以。解決方案
Java允許類設(shè)計者指定:超類聲明一個方法但不提供實現(xiàn),該方法的實現(xiàn)由子類提供。這樣的方法稱為抽象方法。有一個或更多抽象方法的類稱為抽象類。Vehicle是一個抽象類,有兩個抽象方法。publicabstractclassVehicle{ publicabstractdoublecalcFuelEfficiency(); //計算燃料效率的抽象方法
publicabstractdoublecalcTripDistance(); //計算行駛距離的抽象方法}publicclassTruckextendsVehicle{ publicdoublecalcFuelEfficiency(){//寫出計算卡車的燃料效率的具體方法} publicdoublecalcTripDistance(){//寫出計算卡車行駛距離的具體方法}}publicclassRiverBargeextendsVehicle{ publicdoublecalcFuelEfficiency(){//寫出計算駁船的燃料效率的具體方法} publicdoublecalcTripDistance(){//寫出計算駁船行駛距離的具體方法}}抽象類應(yīng)用注意:抽象類不能實例化newVihicle()是非法的思考問題1:為什么抽象類不可以使用final關(guān)鍵字聲明?問題2:一個抽象類中可以定義構(gòu)造器嗎?練習(xí)2編寫一個Employee類,聲明為抽象類,包含如下三個屬性:name,id,salary。提供必要的構(gòu)造器和抽象方法:work()。對于Manager類來說,他既是員工,還具有獎金(bonus)的屬性。請使用繼承的思想,設(shè)計CommonEmployee類和Manager類,要求類中提供必要的方法進行屬性訪問。模板方法設(shè)計模式(TemplateMethod)抽象類體現(xiàn)的就是一種模板模式的設(shè)計,抽象類作為多個子類的通用模板,子類在抽象類的基礎(chǔ)上進行擴展、改造,但子類總體上會保留抽象類的行為方式。解決的問題:當(dāng)功能內(nèi)部一部分實現(xiàn)是確定,一部分實現(xiàn)是不確定的。這時可以把不確定的部分暴露出去,讓子類去實現(xiàn)。編寫一個抽象父類,父類提供了多個子類的通用方法,并把一個或多個方法留給其子類實現(xiàn),就是一種模板模式。模板方法設(shè)計模式(TemplateMethod)abstractclassTemplate{ publicfinalvoidgetTime(){ longstart=System.currentTimeMillis(); code(); longend=System.currentTimeMillis(); System.out.println("執(zhí)行時間是:"+(end-start)); } publicabstractvoidcode();}classSubTemplateextendsTemplate{ publicvoidcode(){ for(inti=0;i<10000;i++){ System.out.println(i);}
}}5.6接口(1)有時必須從幾個類中派生出一個子類,繼承它們所有的屬性和方法。但是,Java不支持多重繼承。有了接口,就可以得到多重繼承的效果。接口(interface)是抽象方法和常量值的定義的集合。從本質(zhì)上講,接口是一種特殊的抽象類,這種抽象類中只包含常量和方法的定義,而沒有變量和方法的實現(xiàn)。實現(xiàn)接口類:classSubClassimplementsInterfaceA{}一個類可以實現(xiàn)多個接口,接口也可以繼承其它接口。接口(2)運動員(抽象類)學(xué)生(抽象類)籃球運動員大學(xué)生跨欄運動員中學(xué)生學(xué)習(xí)英語的技能(接口)extendsimplements接口(3)接口的特點:用interface來定義。接口中的所有成員變量都默認(rèn)是由publicstaticfinal修飾的。接口中的所有方法都默認(rèn)是由publicabstract修飾的。接口沒有構(gòu)造器。接口采用多繼承機制。接口定義舉例publicinterfaceRunner{ intID=1; voidstart(); publicvoidrun(); voidstop();}publicinterfaceRunner{publicstaticfinalintID=1;publicabstractvoidstart();publicabstractvoidrun();publicabstractvoidstop();}接口(4)實現(xiàn)接口的類中必須提供接口中所有方法的具體實現(xiàn)內(nèi)容,方可實例化。否則,仍為抽象類。接口的主要用途就是被實現(xiàn)類實現(xiàn)。(面向接口編程)與繼承關(guān)系類似,接口與實現(xiàn)類之間存在多態(tài)性定義Java類的語法格式:先寫extends,后寫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)備工作:彎腰、蹬腿、咬牙、瞪眼 //開跑
} publicvoidrun(){
//擺動手臂
//維持直線方向
} publicvoidstop(){
//減速直至停止、喝水。
}}接口應(yīng)用舉例(2)
一個類可以實現(xiàn)多個無關(guān)的接口interfaceRunner{publicvoidrun();}interfaceSwimmer{publicdoubleswim();}classCreator{publicinteat(){…}}classManextendsCreatorimplementsRunner,Swimmer{ publicvoidrun(){……} publicdoubleswim(){……} publicinteat(){……}}與繼承關(guān)系類似,接口與實現(xiàn)類之間存在多態(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();}}接口的其他問題如果實現(xiàn)接口的類中沒有實現(xiàn)接口中的全部方法,必須將此類定義為抽象類接口也可以繼承另一個接口,使用extends關(guān)鍵字。interfaceMyInterface{ Strings=“MyInterface”; publicvoidabsM1(); } interfaceSubInterfaceextendsMyInterface{ publicvoidabsM2(); } publicclassSubAdapterimplementsSubInterface{ publicvoidabsM1(){System.out.println(“absM1”);} publicvoidabsM2(){System.out.println(“absM2”);} }實現(xiàn)類SubAdapter必須給出接口SubInterface以及父接口MyInterface中所有方法的實現(xiàn)。工廠方法(FactoryMethod)概述:定義一個用于創(chuàng)建對象的接口,讓子類決定實例化哪一個類。FactoryMethod使一個類的實例化延遲到其子類。適用性:1.當(dāng)一個類不知道它所必須創(chuàng)建的對象的類的時候2.當(dāng)一個類希望由它的子類來指定它所創(chuàng)建的對象的時候3.當(dāng)類將創(chuàng)建對象的職責(zé)委托給多個幫助子類中的某一個,并且你希望將哪一個幫助子類是代理者這一信息局部化的時候工廠方法舉例工廠方法(FactoryMethod)總結(jié):
FactoryMethod模式是設(shè)計模式中應(yīng)用最為廣泛的模式,在面向?qū)ο蟮木幊讨校瑢ο蟮膭?chuàng)建工作非常簡單,對象的創(chuàng)建時機卻很重要。FactoryMethod解決的就是這個問題,它通過面向?qū)ο蟮氖址?,將所要?chuàng)建的具體對象的創(chuàng)建工作延遲到了子類,從而提供了一種擴展的策略,較好的解決了這種緊耦合的關(guān)系。代理模式(Proxy)概述:為其他對象提供一種代理以控制對這個對象的訪問。interfaceObject{voidaction();}classProxyObjectimplementsObject{Objectobj;publicvoidaction(){System.out.println("代理開始");obj.action();System.out.println("代理結(jié)束");}publicProxyObject(){System.out.println("這是代理類");obj=newObjectImpl();}}classObjectImplimplementsObject{publicvoidaction(){System.out.println("======");System.out.println("======");System.out.println("被代理的類");System.out.println("======");System.out.println("======");}}publicclassTest2{publicstaticvoidmain(String[]args){Objectob=newProxyObject();ob.action();}}接口用法總結(jié)通過接口可以實現(xiàn)不相關(guān)類的相同行為,而不需要考慮這些類之間的層次關(guān)系。通過接口可以指明多個類需要實現(xiàn)的方法,一般用于定義對象的擴張功能。接口主要用來定義規(guī)范。解除耦合關(guān)系。接口和抽象類之間的關(guān)系在開發(fā)中,一個類不要去繼承一個已經(jīng)實現(xiàn)好的類,要么繼承抽象類,要么實現(xiàn)接口。No.區(qū)別點抽象類接口1定義包含一個抽象方法的類抽象方法和全局常量的集合2組成構(gòu)造方法、抽象方法、普通方法、常量、變量常量、抽象方法3使用子類繼承抽象類(extends)子類實現(xiàn)接口(implements)4關(guān)系抽象類可以實現(xiàn)多個接口接口不能繼承抽象類,但允許繼承多個接口5常見設(shè)計模式模板設(shè)計工廠設(shè)計、代理設(shè)計6對象都通過對象的多態(tài)性產(chǎn)生實例化對象7局限抽象類有單繼承的局限接口沒有此局限8實際作為一個模板是作為一個標(biāo)準(zhǔn)或是表示一種能力9選擇如果抽象類和接口都可以使用的話,優(yōu)先使用接口,因為避免單繼承的局限10特殊一個抽象類中可以包含多個接口,一個接口中可以包含多個抽象類練習(xí)3定義一個接口用來實現(xiàn)兩個對象的比較。interfaceCompareObject{ publicintcompareTo(Objecto);//若返回值是0,代表相等;若為正數(shù),代表當(dāng)前對象大;負(fù)數(shù)代表當(dāng)前對象小}定義一個Circle類。定義一個ComparableCircle類,繼承Circle類并且實現(xiàn)CompareObject接口。在ComparableCircle類中給出接口中方法compareTo的實現(xiàn)體,用來比較兩個圓的半徑大小。定義一個測試類TestInterface,創(chuàng)建兩個ComparableCircle對象,調(diào)用compareTo方法比較兩個類的半徑大小。思考:參照上述做法定義矩形類Rectangle和ComparableRectangle類,在ComparableRectangle類中給出compareTo方法的實現(xiàn),比較兩個矩形的面積大小。接口的應(yīng)用體會面向接口編程的思想5.7類的成員之五:內(nèi)部類在Java中,允許一個類的定義位于另一個類的內(nèi)部,前者稱為內(nèi)部類,后者稱為外部類。Innerclass一般用在定義它的類或語句塊之內(nèi),在外部引用它時必須給出完整的名稱。Innerclass的名字不能與包含它的類名相同;Innerclass可以使用外部類的私有數(shù)據(jù),因為它是外部類的成員,同一個類的成員之間可相互訪問。而外部類要訪問內(nèi)部類中的成員需要:內(nèi)部類.成員或者內(nèi)部類對象.成員。分類:成員內(nèi)部類(static成員內(nèi)部類和非static成員內(nèi)部類)
局部內(nèi)部類(不談修飾符)、匿名內(nèi)部類內(nèi)部類舉例(1)
classA{ privateints; publicclassB{ publicvoidmb(){ s=100; System.out.println("在內(nèi)部類B中s="+s); }} publicvoidma(){ Bi=newB(); i.mb(); }}publicclassTest{ publicstaticvoidmain(Stringargs[])
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 印刷質(zhì)量管理-洞察分析
- 2024年度地?zé)岬匕骞こ贪惭b與維護服務(wù)協(xié)議3篇
- 采購合同的履行保障3篇
- 采購合同跟蹤的案例分析與策略研究3篇
- 采購合同預(yù)付款的信用風(fēng)險管理3篇
- 采購合同會審制度的特點分析3篇
- 采購合同管理表格的使用與技巧3篇
- 采購框架協(xié)議指標(biāo)3篇
- 采購合同流程的五個關(guān)鍵環(huán)節(jié)3篇
- 采購合同會審制度的優(yōu)化建議3篇
- 辦公樓外立面玻璃更換施工方案
- 出生醫(yī)學(xué)證明警示教育培訓(xùn)
- 酒店業(yè)安全管理雙重預(yù)防機制制度
- 軟件正版化概念培訓(xùn)
- 2024-2025學(xué)年人教版道法八年級上冊 第一學(xué)期期末測試卷01
- 譯林新版(2024)七年級英語上冊Unit 5 Reading課件
- 期末試卷(試題)-2024-2025學(xué)年四年級上冊數(shù)學(xué)滬教版
- 光伏電站運維詳細版手冊
- 基于深度教學(xué)構(gòu)建高品質(zhì)課堂
- 51job在線測評題集
- 2024新教科版一年級科學(xué)上冊全冊教案
評論
0/150
提交評論