第5章面向?qū)ο蟾呒壧匦訽第1頁
第5章面向?qū)ο蟾呒壧匦訽第2頁
第5章面向?qū)ο蟾呒壧匦訽第3頁
第5章面向?qū)ο蟾呒壧匦訽第4頁
第5章面向?qū)ο蟾呒壧匦訽第5頁
已閱讀5頁,還剩91頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

測驗(20151012)classTest{publicstaticvoidmain(Stringargs[]){

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

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

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

System.out.println(

p1.getName()+"比"+

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

}}請寫出Person類的定義。第五章

面向?qū)ο蟾呒壧匦?015-10-135.1變量多態(tài)1.變量多態(tài)類型為X的參考變量,其指向的對象類型既可以是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é)號:"+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","張三","計算機");System.out.println("姓名:"+);System.out.println("專業(yè):"+s2.major);s2.showInfo();}}【分析例5-1的問題】出錯的語句:

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

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

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

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

Stringname(){return“baby";}}

(2.1)——實例方法能夠被覆蓋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)方法在編譯時根據(jù)調(diào)用該方法的類或?qū)ο笏鶎俚念悰Q定實例方法在運行時根據(jù)對象所屬的類決定例如:Supers=newSub();編譯時s是Super類的對象,而運行時s指向Sub類的對象(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);}}輸出什么?原因:編譯時根據(jù)類或?qū)ο箢愋蜎Q定總結(jié)父類的實例方法被子類的同名實例方法覆蓋父類的靜態(tài)方法被子類的同名靜態(tài)方法隱藏父類的實例變量和類變量(static)可以被子類的實例變量和類變量隱藏(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ū)別將子類對象轉(zhuǎn)換為父類對象(直接賦值)后,可以訪問被隱藏的變量和方法(編譯時根據(jù)類型決定),但是不能訪問被覆蓋的變量和方法(運行時根據(jù)類型決定)。3.instanceof操作符

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

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;}編譯出錯publicstaticvoidmain(String[]args){Basess=newSubclass();if(ssinstanceofSubclass){System.out.print(ss.z);}}解決方法——對象類型轉(zhuǎn)換publicstaticvoidmain(String[]args){Basess=newSubclass();if(ssinstanceofSubclass){System.out.print(((Subclass)ss).z);}}對象類型轉(zhuǎn)換

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

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

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

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

((Subclass)s).y);}}對(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【補充實例】publicclassPerson{privateintperson_No;//人員編號public

static

intnextperson_No=1000;//下一個編號publicPerson(){person_No=++nextperson_No;

}}【補充實例】

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

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

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

publicstaticdoubleannual_fee;//年費}補充實例

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方法說明main()方法是static方法,因為執(zhí)行main方法時,JVM并不創(chuàng)建類的實例。因此如果有成員數(shù)據(jù),必須創(chuàng)建對象來訪問它。如:Math類的運算方法都定義為static,可以直接通過Math.方法名()來訪問。static方法說明除了局部變量、static屬性及其參數(shù)外,static方法不能訪問任何變量。如果試圖訪問非static屬性會引起編譯器錯誤。非static屬性綁定到一個實例上并且只有通過實例引用才能訪問。錯誤的例子

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

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

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;}}分析該例,找出錯在哪兒?classInstanceTest{intVariable;staticpublicintmethod(){returnVariable;}staticpublicvoidmethod2(intvariable){this.Variable=variable;}}靜態(tài)初始化器靜態(tài)初始化一個類可以在“靜態(tài)塊”中(而非方法體內(nèi))包含代碼靜態(tài)塊代碼僅在加載類時執(zhí)行一次如果類中包含多個靜態(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();}}初始化實例變量的初始化——構(gòu)造函數(shù)類變量(static變量)的初始化——靜態(tài)初始化器作業(yè)編寫一個例子,實現(xiàn)多態(tài),內(nèi)容自選:如圖形類的例子、學(xué)生類的例子等等。5.2.2final1.最終類final類不能被子類化。如:類java.lang.String是final類,這樣做是出于安全的考慮。如果方法引用一個字符串,那么它就是一個String類的串,而不是String修改后的可能已經(jīng)改變的子類的串。final類不能有子類

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

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

abstract返回值類型方法名([參數(shù)表]);改寫動物例子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)系如果子類沒有實現(xiàn)抽象類中所有的抽象方法,那么子類要定義為抽象類。如下例的son就應(yīng)該定義為抽象類。abstractclassfather{abstractvoidtt();

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

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

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

Flyers1=newAirplane();

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

只能訪問同一個類中的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. 本站所有資源如無特殊說明,都需要本地電腦安裝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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論