第5章面向?qū)ο蟾呒?jí)特性_第1頁(yè)
第5章面向?qū)ο蟾呒?jí)特性_第2頁(yè)
第5章面向?qū)ο蟾呒?jí)特性_第3頁(yè)
第5章面向?qū)ο蟾呒?jí)特性_第4頁(yè)
第5章面向?qū)ο蟾呒?jí)特性_第5頁(yè)
已閱讀5頁(yè),還剩91頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

測(cè)驗(yàn)(20151012)classTest{publicstaticvoidmain(Stringargs[]){

Personp1=newPerson("李娜",1982);

Personp2=newPerson("彭帥",1986);

if(p1.getBirth()<p2.getBirth())

System.out.println(

p1.getName()+"比"+

p2.getName()+"年齡大");

}}請(qǐng)寫出Person類的定義。第五章

面向?qū)ο蟾呒?jí)特性2015-10-135.1變量多態(tài)1.變量多態(tài)類型為X的參考變量,其指向的對(duì)象類型既可以是X,也可以是X的子類如:Studentx=new

Collegian();Studenty=newStudent();【多態(tài)例5-1】classStudent{StringstudentNo,name;

Student(Stringsn,Stringnm){studentNo=sn;name=nm;}voidshowInfo(){System.out.println

("學(xué)號(hào):"+studentNo);System.out.println

("姓名:"+name);}}classCollegianextendsStudent{Stringmajor;Collegian

(Stringsn,Stringnm,Stringmj){

super(sn,nm);

major=mj;}voidshowInfo(){super.showInfo();System.out.println("專業(yè):"+major);}}【多態(tài)例5-1】classtest{publicstaticvoidmain(Stringargsp[]){Students1,s2;s1=newStudent("651003","王五");s1.showInfo();s2=newCollegian("0810123","張三","計(jì)算機(jī)");System.out.println("姓名:"+);System.out.println("專業(yè):"+s2.major);s2.showInfo();}}【分析例5-1的問題】出錯(cuò)的語(yǔ)句:

System.out.println("專業(yè):"+s2.major);改為:

System.out.println("專業(yè):"+((Collegian)s2).major);原因:通過對(duì)象名訪問成員變量時(shí),取決于該對(duì)象聲明時(shí)的類型,因此s2聲明時(shí)是Student類型,因此訪問major會(huì)出錯(cuò);而通過對(duì)象名調(diào)用方法時(shí),則取決于該對(duì)象實(shí)際的類型,因此s2.showInfo()是調(diào)用的子類的方法。2.補(bǔ)充幾個(gè)實(shí)例

理解覆蓋和隱藏的區(qū)別(2.1)——實(shí)例方法能夠被覆蓋classSuper{

Stringname(){return“mother";}}classSubextendsSuper{

Stringname(){return“baby";}}

(2.1)——實(shí)例方法能夠被覆蓋classTest{publicstaticvoidmain(String[]args){

Super

s=new

Sub();System.out.println(());}}輸出:baby(2.2)——靜態(tài)方法不能被覆蓋classSuper{

staticStringname(){return“mother";}}classSubextendsSuper{

staticStringname(){return“baby";}}(2.2)——靜態(tài)方法不能被覆蓋classTest{publicstaticvoidmain(String[]args){

Super

s=new

Sub();System.out.println(());}}輸出:mother原因靜態(tài)方法在編譯時(shí)根據(jù)調(diào)用該方法的類或?qū)ο笏鶎俚念悰Q定實(shí)例方法在運(yùn)行時(shí)根據(jù)對(duì)象所屬的類決定例如:Supers=newSub();編譯時(shí)s是Super類的對(duì)象,而運(yùn)行時(shí)s指向Sub類的對(duì)象(2.3)——屬性的隱藏classBase{intx=1;staticinty=2;}classSubclassextendsBase{intx=4;inty=5;}(2.3)——屬性的隱藏publicclassTest{publicstaticvoidmain(String[]args){

Subclass

s=newSubclass();System.out.println(s.x+""+s.y);}}輸出什么?修改(2.3):(2.3')publicclassTest{publicstaticvoidmain(String[]args){Base

s=newSubclass();System.out.println(s.x+""+s.y);}}輸出什么?原因:編譯時(shí)根據(jù)類或?qū)ο箢愋蜎Q定總結(jié)父類的實(shí)例方法被子類的同名實(shí)例方法覆蓋父類的靜態(tài)方法被子類的同名靜態(tài)方法隱藏父類的實(shí)例變量和類變量(static)可以被子類的實(shí)例變量和類變量隱藏(2.4)classBase{intx=1;staticinty=2;Stringname(){return"mother";}staticStringstaticname(){return"staticmother";}}classSubclassextendsBase{intx=4;inty=5;Stringname(){return"baby";}staticStringstaticname(){return"staticbaby";}}(2.4)publicclassTest{publicstaticvoidmain(String[]args){Subclasss=newSubclass();System.out.println(s.x+""+s.y);System.out.println(());System.out.println(s.staticname());Basess=s;System.out.println(ss.x+""+ss.y);System.out.println(());System.out.println(ss.staticname());}}隱藏和覆蓋的區(qū)別將子類對(duì)象轉(zhuǎn)換為父類對(duì)象(直接賦值)后,可以訪問被隱藏的變量和方法(編譯時(shí)根據(jù)類型決定),但是不能訪問被覆蓋的變量和方法(運(yùn)行時(shí)根據(jù)類型決定)。3.instanceof操作符

修改(2.4)可以根據(jù)對(duì)象所屬的類進(jìn)行不同的處理:

publicstaticvoidmain(String[]args){Basess=newSubclass();if(ssinstanceofSubclass){System.out.print(ss.x+""+ss.y);System.out.print(());System.out.print(ss.staticname());}}還存在問題?classBase{intx=1;staticinty=2;}classSubclassextendsBase{intx=4;inty=5;intz=9;}編譯出錯(cuò)publicstaticvoidmain(String[]args){Basess=newSubclass();if(ssinstanceofSubclass){System.out.print(ss.z);}}解決方法——對(duì)象類型轉(zhuǎn)換publicstaticvoidmain(String[]args){Basess=newSubclass();if(ssinstanceofSubclass){System.out.print(((Subclass)ss).z);}}對(duì)象類型轉(zhuǎn)換

——對(duì)(2.2)的修改classSuper{staticStringname(){return"mother";}}classSubextendsSuper{staticStringname(){return"baby";}}對(duì)象類型轉(zhuǎn)換

——對(duì)(2.2)的修改classTest{publicstaticvoidmain(String[]args){Supers=newSub();System.out.println(((Sub)s).name());}}對(duì)象類型轉(zhuǎn)換

——對(duì)(2.3’)的修改classBase{intx=1;staticinty=2;}classSubclassextendsBase{intx=4;inty=5;}對(duì)象類型轉(zhuǎn)換

——對(duì)(2.3’)的修改publicclassTest{publicstaticvoidmain(String[]args){Bases=newSubclass();System.out.println(((Subclass)s).x+""+

((Subclass)s).y);}}對(duì)(2.4)的修改publicstaticvoidmain(String[]args){Basess=newSubclass();if(ssinstanceofSubclass){System.out.print(ss.x+""+

ss.y);System.out.print(());System.out.print(ss.staticname());}}將紅色的ss都改為((Subclass)ss),才可以得到子類的x和y,調(diào)用子類的靜態(tài)方法staticname()5.1.2多態(tài)的用途1——異類收集classAnimal{publicvoideat(){}}classDogextendsAnimal{publicvoideat(){System.out.println("狗吃骨頭");}}classCatextendsAnimal{publicvoideat(){System.out.println("貓吃老鼠");}}classWolfextendsAnimal{publicvoideat(){System.out.println("吃喜羊羊");}}5.1.2多態(tài)的用途1——異類收集classTest{publicstaticvoidmain(Stringargs[]){

Animalaa[]=newAnimal[3];aa[0]=newDog();aa[1]=newCat();aa[2]=newWolf();for(inti=0;i<3;i++){aa[i].eat();}}}5.1.2多態(tài)的用途1——參數(shù)傳遞classAnimal{publicintlegs;publicAnimal(intlegs){this.legs=legs;}}classDogextendsAnimal{publicStringname;publicDog(Stringname){super(4);=name;}}classWolfextendsAnimal{publicWolf(){super(4);}}5.1.2多態(tài)的用途1——參數(shù)傳遞classtest{publicstaticvoidmain(Stringargs[]){Animalaa[]=newAnimal[2];aa[0]=new

Dog("mike");aa[1]=new

Wolf();for(inti=0;i<2;i++)showInfo(aa[i]);}staticvoidshowInfo(Animala){System.out.println(a.legs);if(ainstanceofDog)System.out.println(((Dog)a).name);}}5.2非訪問控制符5.2.1static

1.類變量/靜態(tài)變量【例5-8】publicclassscope{staticinta;intb;publicstaticvoidmain(Stringargs[]){a++;scopes1=newscope();s1.a++;s1.b++;scopes2=newscope();s2.a++;s2.b++;scope.a++;}}1a1bs12a1bs23a4a【補(bǔ)充實(shí)例】publicclassPerson{privateintperson_No;//人員編號(hào)public

static

intnextperson_No=1000;//下一個(gè)編號(hào)publicPerson(){person_No=++nextperson_No;

}}【補(bǔ)充實(shí)例】

classTest{publicstaticvoidmain(Stringargs[]){Personc1=newPerson();Personc2=newPerson();}}【補(bǔ)充實(shí)例】publicclassPerson{privateintperson_No;publicstatic

intnextperson_No=1000;publicPerson(){person_No=++nextperson_No;

}publicintgetPerson_No(){returnperson_No;}}【補(bǔ)充實(shí)例】classTest{publicstaticvoidmain(Stringargs[]){Personc1=newPerson();Personc2=newPerson();System.out.println(“c1:nextperson_No”);System.out.println(c1.nextperson_No);System.out.println(“c1:person_No”);System.out.println(c1.

getPerson_No());…}}Person+nextperson_No:int=1000-person_No:intc1:Clerkperson_No=1001c2:Clerkperson_No=1002《實(shí)例》《實(shí)例》在這個(gè)示例中,為創(chuàng)建的每個(gè)對(duì)象分配了一個(gè)唯一的序列號(hào),從1000開始向上遞增。變量nextperson_No在所有實(shí)例間共享,因此當(dāng)一個(gè)對(duì)象的構(gòu)造器增加nextperson_No的值時(shí),下一個(gè)創(chuàng)建的對(duì)象就可接收到這個(gè)增加的值。類屬性說(shuō)明使用static來(lái)標(biāo)記的變量是共享于類的所有實(shí)例的變量。例如:可以使用該變量作為實(shí)例間通信的基礎(chǔ),或者跟蹤已創(chuàng)建的實(shí)例數(shù)。如果static變量未被標(biāo)記為private,那么可從類外訪問它。這樣,不需要類的實(shí)例,就可通過類名引用它。publicclassOtherClass{publicvoidincrementNumber(){Person.nextperson_No++;}}類屬性的使用API中:如Math.PI(不用創(chuàng)建Math類的對(duì)象就可以使用PI這個(gè)類屬性)作為全局變量,即只想用一個(gè)存儲(chǔ)區(qū)域來(lái)保存特定的數(shù)據(jù)。無(wú)論創(chuàng)建多少個(gè)對(duì)象,甚至不創(chuàng)建對(duì)象都可以使用。思考:1.銀行卡的年費(fèi)2.排隊(duì)機(jī)銀行卡舉例publicclassBankCard{privateStringCardNO;//卡號(hào)…

publicstaticdoubleannual_fee;//年費(fèi)}補(bǔ)充實(shí)例

classPerson{privateintperson_No;privatedoubleperson_salary;publicstaticintnextperson_No=1000;

publicstaticdoubleperson_lowsalary=280;//最低工資

publicPerson(doublesalary){person_No=++nextperson_No;person_salary=person_lowsalary+salary;}publicintgetPerson_No(){returnperson_No;}}2.類方法/靜態(tài)方法類方法示例

classPerson{privateintperson_No;

publicstaticintnextperson_No=1000;

publicPerson(){person_No=++nextperson_No;}publicintgetPerson_No(){returnperson_No;}

publicstaticintgetNextperson_No(){returnnextperson_No;}}使用類名訪問靜態(tài)方法publicclassTest{publicstaticvoidmain(Stringargs[]){System.out.println(“Numberofpersonis”+Person.getNextperson_No());

Personc1=newPerson();System.out.println(“Numberofpersonis”+Person.getNextperson_No());}}static方法說(shuō)明main()方法是static方法,因?yàn)閳?zhí)行main方法時(shí),JVM并不創(chuàng)建類的實(shí)例。因此如果有成員數(shù)據(jù),必須創(chuàng)建對(duì)象來(lái)訪問它。如:Math類的運(yùn)算方法都定義為static,可以直接通過Math.方法名()來(lái)訪問。static方法說(shuō)明除了局部變量、static屬性及其參數(shù)外,static方法不能訪問任何變量。如果試圖訪問非static屬性會(huì)引起編譯器錯(cuò)誤。非static屬性綁定到一個(gè)實(shí)例上并且只有通過實(shí)例引用才能訪問。錯(cuò)誤的例子

classPerson{privateintperson_No;publicstaticintnextperson_No=1000;publicPerson(){person_No=++nextperson_No;}publicintgetPerson_No(){returnperson_No;}

publicstaticintgetNextperson_No(){returnperson_No;//編譯錯(cuò)誤}}判斷哪些語(yǔ)句錯(cuò)誤?

classTest{staticintnum;intc;publicstaticvoidmain(Stringargs[]){num=100;c=100;}staticvoidss(){num=100;c=100;}voidtt(){num=100;c=100;}}正確的寫法classTest{staticintnum;intc;publicstaticvoidmain(Stringargs[]){num=100;

Testt=newTest();t.c=100;}}分析該例,找出錯(cuò)在哪兒?classInstanceTest{intVariable;staticpublicintmethod(){returnVariable;}staticpublicvoidmethod2(intvariable){this.Variable=variable;}}靜態(tài)初始化器靜態(tài)初始化一個(gè)類可以在“靜態(tài)塊”中(而非方法體內(nèi))包含代碼靜態(tài)塊代碼僅在加載類時(shí)執(zhí)行一次如果類中包含多個(gè)靜態(tài)塊,它們將被按照在類中出現(xiàn)的順序執(zhí)行示例1

classCount{publicstaticintcounter;static{counter=10;}}publicclassTest{publicstaticvoidmain(Stringargs[]){System.out.println(“counter=”+Count.counter);}}

示例2

classss{static{System.out.println(“hi”);}}publicclassTest{publicstaticvoidmain(Stringargs[]){sst1=newss();sst2=newss();sst3=newss();}}初始化實(shí)例變量的初始化——構(gòu)造函數(shù)類變量(static變量)的初始化——靜態(tài)初始化器作業(yè)編寫一個(gè)例子,實(shí)現(xiàn)多態(tài),內(nèi)容自選:如圖形類的例子、學(xué)生類的例子等等。5.2.2final1.最終類final類不能被子類化。如:類java.lang.String是final類,這樣做是出于安全的考慮。如果方法引用一個(gè)字符串,那么它就是一個(gè)String類的串,而不是String修改后的可能已經(jīng)改變的子類的串。final類不能有子類

finalclassVeryVeryGoodClass{}classGeneralextendsVeryVeryGoodClass{}編譯錯(cuò)誤2.最終方法標(biāo)記為final的方法不能被覆蓋。出于安全的考慮,如果方法的實(shí)現(xiàn)不應(yīng)改變,而且對(duì)對(duì)象的一致性狀態(tài)很重要,則可以創(chuàng)建一個(gè)final方法。final方法不能被覆蓋

classparent{publicfinalvoidtt(){}}classchildextendsparent{publicvoidtt(){}}編譯錯(cuò)誤3.最終變量final類型的變量代表常量,只能一次賦值。如:publicclasstest{publicstaticvoidmain(Stringargs[]){finalintx;x=100;x=200;//出錯(cuò)}}5.2.3abstract1.抽象類抽象類:只能被繼承,不能實(shí)例化的類。定義格式:abstractclass類名{}2.抽象方法abstract修飾的方法是抽象方法,也就是只定義了方法頭部,沒有方法體。定義格式為:

abstract返回值類型方法名([參數(shù)表]);改寫動(dòng)物例子1abstractclassAnimal{publicabstractvoideat();}classDogextendsAnimal{publicvoideat(){System.out.println("狗吃骨頭");}}classCatextendsAnimal{publicvoideat(){System.out.println("貓吃老鼠");}}classWolfextendsAnimal{publicvoideat(){System.out.println("吃喜羊羊");}}3.抽象類和抽象方法的關(guān)系抽象類不一定含有抽象方法,但含有抽象方法的類一定是抽象類。如下例:abstractclassfather{

abstractvoidtt();voidtt1(){System.out.println("father"); }}3.抽象類和抽象方法的關(guān)系如果子類沒有實(shí)現(xiàn)抽象類中所有的抽象方法,那么子類要定義為抽象類。如下例的son就應(yīng)該定義為抽象類。abstractclassfather{abstractvoidtt();

abstractvoidtt1();}classsonextendsfather{voidtt(){System.out.println("son"); }}5.3接口5.3.1說(shuō)明Java通過接口來(lái)彌補(bǔ)它單重繼承的不足接口之間是多重繼承一個(gè)接口可以有多個(gè)父接口一個(gè)類可以實(shí)現(xiàn)多個(gè)接口5.3.2接口的定義接口使用interface關(guān)鍵字聲明接口中只能包含:抽象方法:publicabstract常量:publicstaticfinal常量和方法的修飾符均可以省略【補(bǔ)充實(shí)例】假設(shè)一組對(duì)象有相同的能力:它們都能飛??梢詷?gòu)造一個(gè)公有接口,稱為Flyer,它支持三個(gè)操作:takeOff、land和fly?!督涌凇稦lyer+takeOff()+land()+fly()+takeOff()+land()+fly()AirplaneFlyer接口的定義publicinterfaceFlyer{publicvoidtakeOff();publicvoidland();publicvoidfly();}5.3.3接口的實(shí)現(xiàn)class類名implements接口名列表{類體}類實(shí)現(xiàn)接口——首先要繼承接口,然后再重寫方法體(必須實(shí)現(xiàn)接口中每個(gè)方法)如果一個(gè)類同時(shí)實(shí)現(xiàn)多個(gè)接口,接口名之間用逗號(hào)隔開【Airplane實(shí)現(xiàn)Flyer接口】publicclassAirplaneimplementsFlyer{publicvoidtakeOff(){...}publicvoidland(){...}publicvoidfly(){...}}Flyer接口的多重實(shí)現(xiàn)《接口》Flyer+takeOff()+land()+fly()+takeOff()+land()+fly()Airplane+takeOff()+land()+fly()+buildNest()+layEggs()Bird+takeOff()+land()+fly()+leapBuilding()+stopBullet()Superman【說(shuō)明1】接口支持多重繼承,一個(gè)子接口可以有多個(gè)父接口。如:interfacexx{publicvoidtt();publicvoidss();}interfaceyy{publicvoidmm();}interfacezzextendsxx,yy{}【說(shuō)明2】實(shí)現(xiàn)接口時(shí)必須將接口中的所有方法都加以實(shí)現(xiàn)。否則該類還是抽象類一個(gè)類可以實(shí)現(xiàn)多個(gè)接口擴(kuò)展子句(extends)必須在實(shí)現(xiàn)子句(implements)前示例

classaaimplementsxx,yy{publicvoidtt(){}publicvoidss(){}publicvoidmm(){}}《接口》Flyer+takeOff()+land()+fly()+takeOff()+land()+fly()Airplane+takeOff()+land()+fly()+buildNest()+layEggs()+eat()Bird+takeOff()+land()+fly()+leapBuilding()+stopBullet()+eat()Superman+eat()AnimalVehicle繼承和實(shí)現(xiàn)的混合Bird類publicclassBirdextendsAnimal

implementsFlyer{publicvoidtakeOff(){/*實(shí)現(xiàn)takeOff()方法*/}publicvoidland(){/*實(shí)現(xiàn)land()方法*/}publicvoidfly(){/*實(shí)現(xiàn)fly()方法*/}publicvoidbuildNest(){/*行為*/}publicvoidlayEggs(){/*行為*/}publicvoideat(){/*覆蓋eat()方法*/}}機(jī)場(chǎng)類

classAirport{voidgivePermissionToLand(Flyerf){f.land();}publicstaticvoidmain(Stringargs[]){

Flyers1=newAirplane();

Flyers2=newSuperman();Airportaa=newAirport();aa.givePermissionToLand(s1);aa.givePermissionToLand(s2);}}【說(shuō)明3】接口可以捕獲無(wú)關(guān)聯(lián)類之間的相似性,而無(wú)需強(qiáng)加類關(guān)系5.4訪問控制符訪問控制類中的成員(變量和方法)有四種訪問限制:public、protected、default和private類可以是public或default類中成員的四種訪問性準(zhǔn)則訪問控制例1——錯(cuò)誤

只能訪問同一個(gè)類中的private成員importjava.util.Date;classEmployee{

privateStringname;

privatedoublesalary;

privateDatebirthDate;

publicStringgetDetails(){returnname+salary;}}

publicclassTest1{publicstaticvoidmain

(Stringargs[]){Employeex=newEmployee();="Jack";x.salary=5000;System.out.println(x.getDetails());}}Test1.java訪問控制例2——

可以訪問其他包中的public成員packagexx;importjava.util.Date;publicclassEmployee{publicStringname;publicdoublesalary;publicDatebirthDate;

publicStringgetDetails(){returnname+salary;}}i

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論