第三講 Java面向?qū)ο缶幊蘝第1頁
第三講 Java面向?qū)ο缶幊蘝第2頁
第三講 Java面向?qū)ο缶幊蘝第3頁
第三講 Java面向?qū)ο缶幊蘝第4頁
第三講 Java面向?qū)ο缶幊蘝第5頁
已閱讀5頁,還剩100頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第三章JAVA面向?qū)ο缶幊?**溫故***Java程序數(shù)據(jù)類型運算符和表達式語句本講要點面向?qū)ο缶幊痰幕A(chǔ)類的定義對象的創(chuàng)建與使用創(chuàng)建對象使用對象訪問權(quán)限Static關(guān)鍵字一、面向?qū)ο缶幊痰幕A(chǔ)類和對象類是定義對象的模板,用來描述一類事物的共有屬性和功能。對象是一個具體的事物。例:汽車類—某輛汽車學(xué)生類—某個學(xué)生窗口類—某個具體的窗口汽車(類)品牌型號顏色----------加速與減速設(shè)計轉(zhuǎn)向設(shè)計剎車設(shè)計……這輛汽車(對象)品牌:保時捷型號:980顏色:灰色-------------------加速減速控制轉(zhuǎn)向控制剎車控制

類是Java語言中的一種復(fù)合數(shù)據(jù)類型,是組成Java程序的基本要素。Java的類具有兩種基本成分:數(shù)據(jù)和行為(狀態(tài)和方法)。類的這兩種成分被封裝在類體中,與外界隔開。1、類的結(jié)構(gòu)例:publicclassHelloWorld//類{

Stringstr=“Helloworld”;//狀態(tài),或叫成員變量publicstaticvoidmain(String[]args)//方法,或叫成員方法 { System.out.println(“Helloworld!!”); }}類的封裝2、類的定義類首:類的修飾符有:public、abstract、final……extends父類名:表示所定義的類由“父類”繼承而來。implements接口列表:該類對指定接口進行實現(xiàn)。{[類成員變量聲明] [類方法聲明]}類體:構(gòu)造方法成員方法[修飾符]class類名[extends父類名][implements接口列表]publicclassPerson{

floatheight,weight; Stringname,peoNumber,nationality

publicPerson(Stingnationality){this.nationality=nationality;}

voidsetName(Stringname){ =name;}

voidspeak(Strings){ System.out.println(s);}}(1)成員變量與局部變量成員變量:是類的數(shù)據(jù)成分,在類體中直接定義,定義格式為:[修飾符]變量類型成員變量名列表;修飾符:public、private、protected、final、static等,用來標識變量的使用范圍和性質(zhì)。局部變量:在方法體內(nèi)定義的變量和方法的參數(shù)是局部變量。局部變量名可以和成員變量名重名,此時局部變量會隱藏成員變量,如果想在該方法內(nèi)部使用成員變量,使用關(guān)鍵字this。(2)構(gòu)造方法的說明說明形式如下:

[構(gòu)造方法修飾符]方法名([形式參數(shù)列表])

{方法體}⑴構(gòu)造方法的名字與類的名字相同⑵構(gòu)造方法沒有返回類型(千萬不要將返回值類型聲明為void。也不能在方法內(nèi)部使用return返回一個值。)

⑶構(gòu)造方法是在創(chuàng)建對象時,系統(tǒng)自動為所創(chuàng)建的對象初始化化的方法。實際上Java語言為每一個類提供了一個默認的構(gòu)造方法,也就是說,每個類都有構(gòu)造方法。如果不定義一個構(gòu)造方法,Java語言將調(diào)用它提供的默認的構(gòu)造方法對一個新的對象進行初始化(3)成員方法成員方法是類的行為成分,聲明格式如下:[修飾符]返回值類型方法名([形參列表]){ [方法體] [return表達式;]}classTriangle{ floatsideA,sideB,sideC,lengthSum; voidsetSide(floatsideA,floatsideB,floatsideC){ this.sideA=sideA; this.sideB=sideB; this.sideC=sideC; }}1、修飾符:public、private、protected、static、final……2、如果方法沒有返回值,則使用void關(guān)鍵字。如果有返回值類型,則方法體中必須有return語句,并且表達式類型與方法類型一致。3、形式參數(shù)列表的形式如下: 類型名

形參名1,類型名形參名2,……類的定義--例1classPerson{

Stringname,sex; intage; voidsing() { System.out.println("Icansing!"); } voiddance() { System.out.println("Icandance!"); } voidout()//成員變量的操作只能放在方法中 { System.out.println("name:"+name); System.out.println("age:"+age); } }定義描述“人”的類:成員變量:姓名、性別、年齡;成員方法:唱歌,跳舞,輸出classPerson{

Stringname,sex;intage;

publicPerson(){ age=18; name="無名";} publicPerson(Stringname){ =name;}voidsing(){ System.out.println("Icansing!");} voiddance(){ System.out.println("Icandance!");} voidout(){ System.out.println("name:"+name); System.out.println("age:"+age);} }定義描述“人”的類:成員變量:姓名、性別、年齡;成員方法:唱歌,跳舞,輸出構(gòu)造方法:對成員變量賦初值類的定義--例2:梯形類classLadder{

floata,b,h;

Ladder(floata,floatb){this.a=a;this.b=b;}voidsetH(floath){ this.h=h;} floatcalculatArea(){ return(a+b)*h/2;}}定義描述梯形類:成員變量:上底、下底、高成員方法:設(shè)置高,計算面積構(gòu)造方法:對上下底賦初值2、創(chuàng)建和使用對象如何調(diào)用類中定義的成員變量和成員方法,在Java中類只有實例化為對象后才能被使用(注:main方法為特殊方法,由系統(tǒng)調(diào)用),對象的使用“分三步走”:(1)聲明對象:類名對象名;如:Personp(2)分配內(nèi)存(對象的實例化)

對象名=new類構(gòu)造方法名([實參表]);如:p=newPerson();(3)使用對象(對象的成員變量及方法的訪問)

對象名.方法名、對象名.成員變量名如:p.agep.out()(1)聲明和(2)初始化可以合并:類名對象名=new類的構(gòu)造方法名([實參表]);如:Personp=newPerson();使用對象—例3方法一:在同一個類中使用對象classPerson{ . . . publicstaticvoidmain(String[]args) { Personp; p=newPerson(); ="zhangsan"; p.age=20; p.sing(); p.out(); } }棧內(nèi)存堆內(nèi)存p0x30000x30000age...newperson()產(chǎn)生的對象使用對象—例4方法二:在不同類中使用對象classPerson{ . . .}classPersonTest{ publicstaticvoidmain(String[]args) { Personp; p=newPerson(); ="zhangsan"; p.age=20; p.sing(); p.out(); }}使用對象—例5梯形classLadder{ . . .publicstaticvoidmain(String[]args){ floatarea; Ladderladder=newLadder(); ladder.a=10.0f; ladder.b=20.0f; ladder.setH(5f); area=ladder.calculatArea(); System.out.println("area="+area);}}Java程序classLadder{ floata,b,h; voidsetH(floath) { this.h=h; } floatcalculatArea() { return(a+b)*h/2; }}PublicclassLadderTest{publicstaticvoidmain(String[]args){ floatarea; Ladderladder=newLadder(); ladder.a=10.0f; ladder.b=20.0f; ladder.setH(5f); area=ladder.calculatArea(); System.out.println("area="+area);}}}對象變量的賦值classPersonTest{ publicstaticvoidmain(String[]args) { Personp1,p2,p3; p1=newPerson(); p2=newPerson("孫悟空"); p3=newPerson("豬八戒"); p1=p2; =“唐僧”;p1.age=50; p1.out();p2.out();p3.out(); } }結(jié)果如何?對象變量的賦值,是對象中保存的地址發(fā)生的變化如果一個對象沒有任何變量引用它,則它成為垃圾內(nèi)存。3、訪問權(quán)限用一個類創(chuàng)建一個對象后,通過對象可以訪問這個類的成員變量和成員方法,但這種訪問是有一定限制的。這種限制取決于在聲明變量和成員方法時使用的修飾符:public、private、protected、友好(未使用修飾符)。(1)private變量和方法訪問權(quán)限最小,只能在同一個類中被訪問。同一個類的方法中直接訪問。同一個類的對象也可以引用本類的私有成員。不能在另一個類中引用(2)友好變量和方法不使用修飾符:public、private、protected,即缺省這些修飾符的情況。比private權(quán)限級別高一級友好成員只能被同類或同包中的不同類引用。classPerson{ privateintage; privateStringname;Stringsex;

privatevoidout(){ System.out.println(name+“年齡:”+age+“歲");}

voidsetAge(intage){this.age=age;}publicstaticvoidmain(String[]args){Persontom=newPerson();="湯姆“; tom.age=20;//或tom.setAge(20); tom.out(); }}例6:classPersonTest{ publicstaticvoidmain(String[]args){ Personmarry=newPerson(); =“瑪麗”//非法使用變量namemarry.age=20;//非法引用變量age marry.out();//非法調(diào)用方法out()

marry.sex=“女”//合法使用變量sexmarry.setAge=20;//合法調(diào)用方法setAge

}}(3)protected變量和方法比友好成員高一級,比public低一級。不能在不同包的類中被引用。如果不同包中的類是本類的子類,則子類的對象可以引用本類的受保護成員。(4)public變量和方法訪問權(quán)限最大,可以在不同類、不同包的類中訪問。packageex1;publicclassArea{ privatefloatgetArea(floatr) { System.out.print("方法一:");

return3.14f*r*r; } doublegetArea(floatx,inty) { System.out.print("方法二:");

returnx*y; } protectedfloatgetArea(intx,floaty) { System.out.print("方法三:");

returnx*y; } publicdoublegetArea(floatx,floaty,floatz) { System.out.print("方法四:");

return(x+x+y*y+z*z)*2.0; }}例7(2)public變量和方法packageex2;importex1.Area;classAreaTest{ publicstaticvoidmain(String[]args){Areaa=newArea();System.out.println(a.getArea(2.0f));//不合法

System.out.println(a.getArea(2.7f,12));//不合法System.out.println(a.getArea(12,2.7f));//

合法System.out.println(a.getArea(2.0f,10,20));//合法}}(2)public變量和方法packageex2;importex1.Area;classAreaTestextendsArea{ publicstaticvoidmain(String[]args){AreaTesta=newAreaTest();System.out.println(a.getArea(2.0f));//合法

System.out.println(a.getArea(12,2.7f));//合法System.out.println(a.getArea(2.7f,12));//不合法System.out.println(a.getArea(2.0f,10,20));//不合法}}變量和方法的訪問控制(總結(jié))publicprotected友好private同類同包不同類不同包子類通用不同情形下對象訪問說明符4、static關(guān)鍵字靜態(tài)變量/靜態(tài)方法:對于成員變量/成員方法的聲明,可以在類型的前面加修飾符“static”,稱之為靜態(tài)變量/靜態(tài)方法。靜態(tài)變量/靜態(tài)方法屬于類而不屬于類的某個實例,可直接由類名來調(diào)用(類名·變量名/類名·方法名),因此也叫類變量/類方法;實例變量/實例方法:非靜態(tài)的成員變量/方法必須實例化后通過對象名來調(diào)用(對象名·變量名/對象名·方法),因此稱為實例變量/實例方法。說明:類變量和類方法也可以通過實例調(diào)用。類變量,它屬于類所有,且在所有的實例中都共享同一個內(nèi)存空間;實例變量,對于每一個實例,這個變量都擁有獨自的內(nèi)存空間。類方法,在類加載時分配方法入口地址,因此可被類直接調(diào)用。實例方法,只有創(chuàng)建類的對象,才會分配方法入口地址,并只能通過對象調(diào)用方法。(1)類變量/類方法、實例變量/實例方法classStaticDemo{staticintx;inty;publicstaticintgetX(){ returnx;}publicstaticvoidsetX(intnewX){ x=newX;}publicintgetY(){ returny;}publicvoidsetY(intnewY){ y=newY;}}0xStaticDemo入口地址getx()入口地址setx()publicclassShowDemo{publicstaticvoidmain(String[]args){System.out.println("靜態(tài)變量x="+StaticDemo.getX());

StaticDemoa=newStaticDemo();

StaticDemob=newStaticDemo();

a.setX(10);b.setX(30);

a.setY(20);b.setY(40);

System.out.println("靜態(tài)變量a.x="+a.getX());System.out.println("靜態(tài)變量b.x="+b.getX());System.out.println("靜態(tài)變量x="+StaticDemo.getX());System.out.println("實例變量a.y="+a.getY());System.out.println("實例變量b.y="+b.getY());

}}例8:內(nèi)存模型分析實例變量0a.y0xStaticDemo0b.y10x30x20a.y40b.y總結(jié)(靜態(tài)成員在使用時應(yīng)該注意):①靜態(tài)方法中只能直接調(diào)用同類中其他靜態(tài)成員,而不能調(diào)用非靜態(tài)成員。反之,則可以。②靜態(tài)成員的引用直接通過類名引用,也可以通過該類的對象來引用。③靜態(tài)方法中不能使用super和this變量。例9:classA{staticinti=10;Strings="helloworld!";publicstaticvoidmain(String[]args){ System.out.println("i="+i);// System.out.println("s="+s);}}(2)static應(yīng)用注意事項**總結(jié)**類的定義成員變量說明成員方法說明對象的創(chuàng)建和使用創(chuàng)建對象通過對象引用成員變量和成員方法構(gòu)造方法構(gòu)造方法與一般成員方法的區(qū)別構(gòu)造方法不是void型訪問權(quán)限

private,友好,protected,publicStatic關(guān)鍵字二、面向?qū)ο缶幊踢M階類的繼承多態(tài)抽象類和抽象方法接口包1、類的繼承動物貓狗哺乳動物鳥燕子麻雀類的定義可以是分層次的,低層的類具有高層類的屬性和方法,稱高層類為父類,低層類為子類。子類使用父類中定義的方法和變量時,就像它們屬于子類本身一樣??梢院喕幊痰倪^程,有利于代碼的復(fù)用。子類除了擁有父類的方法和變量之外,也可以定義自己方法和變量。哺乳動物:胎生,能用母乳喂養(yǎng)幼仔。貓:胎生,能用母乳喂養(yǎng)幼仔。會捉老鼠。1、類的繼承(續(xù))繼承:由已有類創(chuàng)建新類的機制。新類繼承已有類的成員,并可根據(jù)需要增加自己新的成員。已有類稱為父類,新類稱為已有類的子類。Java不支持多繼承,一個子類只能有一個父類,但一個父類可以派生出若干個子類。classPerson{Stringname;intage;Person(Stringname){ =name;}publicvoidsetAge(intage){ this.age=age;}voidout(){ System.out.println("姓名:"+name+"年齡:"+age+"歲");}}子類(例)publicclassStudentextendsPerson{intjava,flash;Student(Stringname,intjava,intflash){ super(name); this.java=java; this.flash=flash; setAge(5000);}voidout(){ super.out(); System.out.println("java:"+java+"\tflash:"+flash);

}voidlearn(){ System.out.println(name+"islearning");}publicstaticvoidmain(String[]args){ Students=newStudent("孫悟空",80,80); s.out(); s.learn();}}1、類的繼承性(續(xù))子類和父類在同一包中子類可繼承其父類中非私有成員(不是private的成員)子類和父類不在同一包中子類只能繼承受保護的和共有成員(public、protected)(1)成員變量的隱藏和方法的重寫成員變量的隱藏:如果在子類中定義了與父類中同名的變量,父類的這個變量將被隱藏。方法的重寫:如果子類中定義了與父類同名、同類型、相同參數(shù)的方法,則稱子類覆蓋了父類的方法。這是子類的一種“變異”,子類可以根據(jù)需要把從父類繼承來的方法進行改造。比如:在student類中重新聲明方法out()voidout(){super.out(); System.out.println("java:"+java+"\tflash:"+flash);}(2)super關(guān)鍵字特殊變量super,提供了對父類的訪問。1、可以使用super訪問父類被子類隱藏的變量或覆蓋的方法。如:在student類中改寫out方法時,可以使用super.out();來調(diào)用父類中對name和age的輸出。調(diào)用父類的變量。2、可能通過Super([參數(shù)表])來調(diào)用父類的構(gòu)造方法。每個子類構(gòu)造方法的第一條語句,都是隱含地調(diào)用super(),如果父類沒有這種形式的構(gòu)造函數(shù),那么在編譯的時候就會報錯。(3)this關(guān)鍵字this關(guān)鍵字只能用在實例方法或構(gòu)造方法中,提供了對當前對象的訪問。voidsetAge(intage){ this.age=age;}publicstaticvoidmain(String[]args){ Personp1,p2,p3; p1=newPerson(); p2=newPerson("孫悟空");

p3=newPerson("豬八戒",300,2.8f,380); p1.setAge(18);p2.setAge(19);p3.setAge(20); p1.out();p2.out();p3.out();} (4)final類和final成員final類:不能派生子類。final變量,其值不能在程序運行過程中改變,是常量。final方法,不能被子類方法重寫。如:publicfinalclassFather{}publicclassSonextendsFather?如:publicclassFather{finalintx=10;publicfinalvoidshow(){}}publicclassSonextendsFather{publicvoidshow(){}}(5)對象的上轉(zhuǎn)型對象父類的變量能否引用子類的對象?能。子類的變量能否引用父類的對象?不能。父類的變量稱為子類對象的上轉(zhuǎn)型對象。Personp;p=newStudent();Students;s=newStudent();p=s;新增變量新增方法從父類繼承或重寫的變量從父類繼承或重寫的方法

s的上轉(zhuǎn)型對象S對象psPersonp=newStudent("唐僧",100,100);p.out();//p.learn();Studentsp=(Student)p;sp.learn();

(5)上轉(zhuǎn)型對象操作說明上轉(zhuǎn)型對象不能操作子類新增成員上轉(zhuǎn)型對象可以操作從父類繼承的成員,或在子類中重寫的父類成員。上轉(zhuǎn)型對象在被改寫的成員時,調(diào)用子類成員,而非父類成員。上轉(zhuǎn)型對象通過強制類型轉(zhuǎn)換成為子類對象。2、多態(tài)性在程序中同一符號或名字在不同情況下具有不同解釋的現(xiàn)象稱為多態(tài)性。表現(xiàn)在兩方面:方法的重載。方法的覆蓋。(1)方法的重載在一個類中可以定義同名的方法,但是參數(shù)的類型和個數(shù)不能完全相同,同名的方法可以有不同的方法體從而完成不同的任務(wù),當調(diào)用方法時,系統(tǒng)會自動調(diào)用與實際參數(shù)類型和個數(shù)相匹配的的那一個方法,這就是方法的重載。在面向?qū)ο缶幊讨校@種同一個名字可以有不同解釋的現(xiàn)象稱為多態(tài)。(1)方法的重載(續(xù))在一個類中可以有多個方法具有相同的名字,但這些方法的參數(shù)必須不同,即或者是參數(shù)的個數(shù)不同,或者是參數(shù)的類型不同。同名的方法可以有不同的方法體從而完成不同的任務(wù),當調(diào)用方法時,系統(tǒng)會根據(jù)調(diào)用方法的實際參數(shù)類型和個數(shù)自動調(diào)用相應(yīng)的方法,這就是方法的重載。classHeshang{ voiddashui(Strings) { System.out.println(s+"挑水喝"); }

voiddashui(Strings1,Strings2) { System.out.println(s1+"和"+s2+"抬水喝"); }

voiddashui(Strings1,Strings2,Strings3) { System.out.println(s1+""+s2+""+s3+"沒水喝"); }

publicstaticvoidmain(String[]args){ Heshangh=newHeshang(); h.dashui("孫悟空");

h.dashui("孫悟空","豬八戒");

h.dashui("孫悟空","豬八戒","沙和尚");}}(1)構(gòu)造方法的重載classPerson{ Stringname;intage;floatheight,weight; publicPerson() { age=18; name="無名"; }

publicPerson(Stringname) { =name; } publicPerson(Stringname,intage,floatheight,floatweight) { =name; this.age=age; this.height=height; this.weight=weight; } voidout()//成員變量的操作只能放在方法中 {

System.out.println(“姓名:”+name+“年齡:”+age+“歲”+ "身高:" +height+"米"+"體重:"+weight+"斤");

System.out.println(); }

}classPersonTest{ publicstaticvoidmain(String[]args) { Personp1,p2,p3; p1=newPerson(); p2=newPerson("孫悟空");

p3=newPerson("豬八戒",300,2.8f,380); p1.out();p2.out();p3.out(); } }(1)構(gòu)造方法的重載(續(xù))(2)子類成員方法的覆蓋publicclassPerson{Stringname;intage;publicvoidsetAge(intage){ this.age=age;}publicvoidout(){ System.out.println("姓名:"+name+"年齡:"+age+"歲"); }}publicclassStudentextendsPerson{intjava,flash;voidlearn(){System.out.println(name+"islearning!");}voidout(){ System.out.println("姓名:"+name+"年齡:"+age+"歲"+"java:"+java+ "\tflash:"+flash);}作業(yè)與上機訓(xùn)練要求1、創(chuàng)建父類Animal和子類Dog要求如下:(1)Animal(父類)中定義至少兩個成員變量,一個帶參數(shù)的構(gòu)造方法,一個成員方法。(2)Dog(子類)中定義兩個以上成員變量,隱藏父類中的一個成員變量,重寫父類中的一個成員方法。(3)對子類進行實例化,輸出對象的成員變量值(包括從父類繼承而來的變量),調(diào)用對象的各成員方法(包括從父類繼承來的方法)。2、按要求補充代碼(附下頁)classZuoye2{ privatefloatr;//r為圓的半徑

/*補充代碼段1 */ publicfloatcircle()//計算圓的面積 { return3.14f*r*r; }}classTest{ publicstaticvoidmain(String[]args) { Zuoye2z=newZuoye2();

/*補充代碼段2,計算輸出半徑為10的圓的面積 */

} }技能訓(xùn)練2類的繼承訓(xùn)練目的使學(xué)生了解類成員的訪問權(quán)限設(shè)置與應(yīng)用使用學(xué)生掌握子類的創(chuàng)建,理解子類的繼承,成員變量的隱藏與成員方法的重寫。相關(guān)知識點子類的構(gòu)造方法與父類構(gòu)造方法之間的關(guān)系:子類構(gòu)造方法的第一條語句隱含調(diào)用父類的構(gòu)造方法—super();子類繼承父類中的非private成員(在同一個包中)子類繼承父類中的非private與非友好成員(不同的包中)子類中的成員與父類中成員相同,則隱藏父類成員父類的對象變量(對象的上轉(zhuǎn)型對象)可以引用子類的對象技能訓(xùn)練3方法的重載、類變量/類方法實驗?zāi)康淖寣W(xué)生掌握方法的重載讓學(xué)生掌握類變量與實例變量,以及類方法與實例方法的區(qū)別。讓學(xué)生掌握包的使用實驗要求與內(nèi)容3、抽象方法與抽象類用關(guān)鍵字abstract修飾的類就是抽象類。沒有方法體的方法,且首部用關(guān)鍵字abstract修飾,就是抽象方法。聲明抽象方法的格式:[修飾符…]abstract返回值類型方法名([形參列表]);publicabstractclassAAnimal { publicStringname; publicintage; publicvoidprint() { System.out.println("名字:"+name); System.out.println("大小:"+age); } publicabstractvoidrun(); publicabstractvoidcry();}(1)抽象方法與抽象類使用說明含有抽象方法的類必須定義為抽象類。publicclassAAnimal //錯誤{

publicStringname; publicintage; publicvoidprint() { System.out.println("名字:"+name); System.out.println("大小:"+age); } publicabstractvoidrun(); publicabstractvoidcry();}(1)抽象方法與抽象類使用說明(續(xù))不能由抽象類直接創(chuàng)建對象。它只能做為父類使用,由它派生的子類必須實現(xiàn)抽象類中所有的抽象方法,才能創(chuàng)建對象。抽象方法的實現(xiàn):子類重寫父類的抽象方法,增加方法體,使之成為一個非抽象方法??梢钥諏崿F(xiàn)。classTest{ publicstaticvoidmain(String[]args){ AAnimala; a=newAAnimal(); //錯誤}}classDogextendsAAnimal{ Stringtype; publicDog() { type="寵物狗"; }

publicvoidrun(){ } publicvoidcry() { System.out.println("汪汪叫"); }}classTest{ publicstaticvoidmain(String[]args){ Doga; a=newDog(); ="歡歡";a.age=2; a.print(); a.cry(); System.out.println("這是一只"+a.type);}}續(xù)(1)抽象方法與抽象類使用說明(續(xù))如果子類沒有實現(xiàn)抽象基類(父類)中所有的抽象方法,則子類也必須定義成一個抽象類。即:抽象的子類也必須使用修飾符:abstract可以將沒有任何抽象方法的類聲明為abstract,避免由這個類直接創(chuàng)建任何的對象。abstractclassDogextendsAAnimal{ Stringtype; publicDog() { type="寵物狗"; }

//publicvoidrun(){ } publicvoidcry() { System.out.println("汪汪叫"); }}classBirdextendsAAnimal//定義鳥類繼承動物類{

publicBird()//構(gòu)造方法初始化 {

name="麻雀";

age=3; } publicvoidrun()//實現(xiàn)父類的抽象方法 {

System.out.println("會飛"); }

publicvoidcry() { System.out.println("嘰嘰喳喳"); }}創(chuàng)建鳥類對象:練習(xí)(例)鳥類抽象類:圖形,抽象方法—求面積(指出:圖形必須有求面積的方法,但因為不同圖形求面積的方法不一樣,因此將此方法聲明為抽象方法)子類:梯形類,實現(xiàn)了抽象類中求面積的抽象方法。子類:圓,實現(xiàn)了抽象類中求面積的抽象方法。類:堆,求體積。應(yīng)用程序類:創(chuàng)建梯形、圓、堆對象,分別進行計算。(2)小結(jié)用abstract關(guān)鍵字來修飾一個類時,這個類叫做抽象類;用abstract來修飾一個方法時,該方法叫做抽象方法。abstract類必須被繼承,abstract方法必須被重寫。抽象類不能被實例化(直接創(chuàng)建對象)。抽象方法只需聲明,而不需實現(xiàn)(無方法體)。作業(yè)(三)作業(yè)二:按以下要求編寫程序創(chuàng)建一個抽象的車類,包括各種車輛。至少包含一個抽象方法。成員變量:品牌、可載人數(shù)、輪子個數(shù)、能源等。抽象方法如:跑、加速、剎車等。通過繼承車類重新聲明公共汽車類和普通自行車類。在子類中實現(xiàn)父類中抽象方法構(gòu)造方法對應(yīng)區(qū)分為公共汽車和普通自行車。子類的構(gòu)造方法中根據(jù)不同的類設(shè)置不同的默認值,如汽車類可以默認輪子個數(shù)是4個,可載人數(shù)50個,能源為汽油。技能訓(xùn)練4訓(xùn)練目的掌握抽象類與抽象方法的應(yīng)該技巧實驗要求:創(chuàng)建一個抽象的車類,包括各種車輛。至少包含一個抽象方法。成員變量:品牌、可載人數(shù)、輪子個數(shù)、能源等。抽象方法如:跑、加速、剎車等。通過繼承車類重新聲明公共汽車類和普通自行車類。在子類中實現(xiàn)父類中抽象方法構(gòu)造方法對應(yīng)區(qū)分為公共汽車和普通自行車。子類的構(gòu)造方法中根據(jù)不同的類設(shè)置不同的默認值,如汽車類可以默認輪子個數(shù)是4個,可載人數(shù)50個,能源為汽油。實驗中應(yīng)解決的問題:含有抽象方法的類一定是抽象類嗎?抽象類中一定要有抽象方法嗎?如何實現(xiàn)抽象方法?4、接口及應(yīng)用***溫故***抽象方法abstract方法,并且沒有方法體。抽象類abstract類,一般含有抽象方法。抽象類的一般用法只能做為父類被繼承,不能直接實例化。只有通過子類實現(xiàn)抽象方法后,才能實例化。一般對于不同的子類可以有不同的實現(xiàn)過程。本講要點接口的基本概念接口定義接口實現(xiàn)接口應(yīng)用舉例理解接口Jar文件(略)(1)接口的概念在《ThinkinginJava》一書中,作者對接口有這樣的描述:“接口(interface)比抽象(abstract)的概念更進了一步。你可以把一個接口看成是一個純的抽象類。”為什么使用接口?1、Java中不允許類的多繼承,但在解決實際問題過程中,僅僅依靠單一繼承在很多情況下都不能將問題的復(fù)雜性表述完整。通過接口可以實現(xiàn)多繼承。如:Father類有playFootball(),Mother類有sing(),如果采用類的繼承來產(chǎn)生一個Son類,則它只能從一個類中繼承。要么繼承Father,要么繼承Mother。2、接口在面向?qū)ο蟮脑O(shè)計與編程中應(yīng)用非常廣泛,特別是實現(xiàn)軟件模塊間的連接方面有著巨大的優(yōu)勢。(2)接口的聲明及注意事項如果一個抽象類中所有的方法都是抽象的,就可以將這個類用另外一種方式來定義,也就是接口定義。[public]interface接口名[extends父接口名列表]{ 數(shù)據(jù)類型常量名=常數(shù);

返回值方法名([參數(shù)列表]);}幾點說明:1、interface是接口的關(guān)鍵字,定義接口和定義類相似。并被編譯為class文件。2、接口的訪問控制符只有public,如果使用public修飾符,則可以被所有類和接口使用,且接口名與文件名相同。如果不使用public,則接口只能被同一個包中的類和接口使用。3、接口中所有的方法都是publicabstract即公共的抽象方法。4、接口中可以有數(shù)據(jù)成員,這些數(shù)據(jù)成員默認都是publicstaticfinal即公共類常量。(3)接口聲明實例//Father.java文件名publicinterfaceFather//父親會踢球{ publicabstractvoidplayFootball();}//Mother.java文件名publicinterfaceMother//母親愛唱歌{ publicabstractvoidsing();}//Flyable.java能飛的動物publicinterfaceFlyable{ publicabstractvoidfly();}//Talkable.java能說話的動物publicinterfaceTalkable{ publicabstractvoidtalk();}(4)接口的實現(xiàn)與多繼承接口的實現(xiàn)通過類來完成,在定義類時使用“implements接口名列表”短語,并在類體中實現(xiàn)接口中的抽象方法。接口和實現(xiàn)類之間的關(guān)系實質(zhì)上是繼承的關(guān)系1、一個類可以實現(xiàn)多個接口,從而實現(xiàn)多繼承。publicclassSmartChild

implementsFather,Mother{ publicvoidplayFootball() { System.out.println("我會踢足球!"); }

publicvoidsing() { System.out.println("我會唱歌!"); }

publicstaticvoidmain(String[]args) { SmartChildchild=newSmartChild(); child.playFootball(); child.sing(); }}類實現(xiàn)接口時的注意事項注意:在類聲明部分,用implements關(guān)鍵字指明該類將要實現(xiàn)哪些接口。實現(xiàn)接口的類必須在類體中給出所有方法的實現(xiàn),否則該類應(yīng)該聲明為抽象類。接口中的方法都是public的,所以實現(xiàn)方法時也必須加上public,否則編譯報錯??偨Y(jié):一個接口可以繼承另一個接口Java中不允許類的多繼承,但允許接口的多繼承在java中一個類可以實現(xiàn)多個接口一個類在繼承另一個類的同時,可以實現(xiàn)多個接口。例interfaceComputable{ finalintMAX=100; voidspeak(Strings); intf(intx); floatg(floatx,floaty);}classChinaimplementsComputable{ intxuehao; publicintf(intx) { intsum=0; for(inti=1;i<=x;i++) { sum+=i; } returnsum; } publicfloatg(floatx,floaty) { return6; } publicvoidspeak(Strings) { }}classJapanimplementsComputable{ intxuehao; publicintf(intx) { return68; } publicfloatg(floatx,floaty) { returnx+y; } publicvoidspeak(Strings) { }}publicclassExample4_26{ publicstaticvoidmain(String[]args){ Chinach; Japanja; ch=newChina();ja=newJapan(); ch.xuehao=991898;ja.xuehao=941448; System.out.println("xuehao:"+ch.MAX+ch.xuehao+ "1+2+...+100="+ch.f(100)); System.out.println("xuehao:"+ch.MAX+ja.xuehao+ "兩數(shù)之和:"+ja.g(12,23));}}接口應(yīng)用實例—程序模塊間的連接//PCI接口,可看成一種標準interfacePCI{ voidsetName(Strings); voidrun(); }//符合PCI接口標準的網(wǎng)卡,即實現(xiàn)了PCIclassNetworkCardimplementsPCI{ Stringname; publicNetworkCard() { name="D-Link"; } publicvoidsetName(Strings)//實現(xiàn)接口中的抽象方法 {

name=s; } publicvoidrun()//實現(xiàn)接口中的抽象方法 {

System.out.println(name+"網(wǎng)卡已開始工作!"); }}例:組裝電腦,通過PCI接口將主板模塊與網(wǎng)卡模塊和聲卡模塊連接。(接口回調(diào))//符合PCI標準的聲卡,即實現(xiàn)了PCI接口classSoundCardimplementsPCI{ Stringname="SoundMax"; publicvoidsetName(Strings)//實現(xiàn)接口中的方法 {

name=s; } publicvoidrun()//實現(xiàn)接口中的方法 {

System.out.println(name+"聲卡已開始工作!"); }}//集成PCI接口的主板classMainboard{ //usePCICard方法用來向主板插入一塊PCI卡

publicvoidusePCICard(PCIp)//參數(shù)p就是一個PCI卡 {

p.run(); } publicvoidrun() { System.out.println("主板已開始工作!"); } }接口實例(續(xù)1)//組裝一臺電腦classComputer{ publicstaticvoidmain(String[]args) { Mainboardmb=newMainboard();//選一塊主板

NetworkCardnc=newNetworkCard();//買一塊網(wǎng)卡

nc.setName(“NEC”);//這是一塊NEC牌的網(wǎng)卡

SoundCardsc=newSoundCard();//買了一塊聲卡

mb.usePCICard(nc);//將網(wǎng)卡插到主板上

mb.usePCICard(sc);//將聲卡插到主板上

mb.run();//主板運行 }}接口實例(續(xù)2)紅字部分注解:無論是網(wǎng)卡還是聲卡,都是PCI接口的子類,所以,他們的對象能直接傳遞給usePCICard方法中的PCI接口的引用變量p,在參數(shù)傳遞過程中發(fā)生接口回調(diào)。理解接口接口只關(guān)心功能,不關(guān)心功能的具體實現(xiàn)收費接口與不同交通工具類具體收費情況項目主管、部門開發(fā)、speakLove方法教務(wù)管理系統(tǒng)中,教務(wù)處模塊、各系部,如果教務(wù)處想調(diào)用各系的教學(xué)計劃并打印,此時使用接口是必要的。教學(xué)計劃(年號)小結(jié)1、接口的概念:如果一個方法中的所有方法都是抽象的,則可以以接口的形式進行定義。2、接口定義:使用interface關(guān)鍵字進行定義,數(shù)據(jù)成員隱含修飾符:publicstaticfinal,方法隱含修飾符:publicabstract3、接口實現(xiàn):通過類來實現(xiàn),使用implements短語。4、接口應(yīng)用。作業(yè)(四)二、編程1、編寫Animal接口,接口中聲明run()方法2、編寫Plant接口,接口中聲明eatable()方法3、定義Bird類和Fish類實現(xiàn)Animal接口4、定義Grass類和Tomato類實現(xiàn)Plant接口三、上機訓(xùn)練1、編程序驗證:一個類在繼承另一個類的同時實現(xiàn)一個接口。2、在調(diào)試程序過程中總結(jié)接口定義、接口實現(xiàn)時應(yīng)注意的問題。5、包的概念為了便于管理大型軟件系統(tǒng)中數(shù)目眾多的類,解決類命名沖突的問題,java引入了包。Java中的包與文件系統(tǒng)的目錄層次結(jié)構(gòu)是一一對應(yīng)的。一個包中可以包含子包,包名與子包名間用“·”分隔。Java提供的類和接口是按不同的用途分別放在不同的包中。java.appletjava.awtjava.langjava.iojava.util(1)package語句功能:創(chuàng)建包格式:package包名[.子包名[…]];要求:此語句必須放在整個源程序第一條語句例:packagep;//(在當前目錄下創(chuàng)建一個p包)packagea.b;//(在當前目錄下創(chuàng)建a,在a下再創(chuàng)建b)注意:嵌套的包名之間以圓點分隔(“.”)。如果源文件中省略了package語句,則文件中定義的類隱含在一個無名包中,這個無名包就是源文件所在的位置。引入java包中的類和接口import語句一般情況下import語句緊跟在package語句之后功能:將其他包中的類引入到當前程序中。格式:import帶包層次結(jié)構(gòu)的類名;說明:1、引入包時,類名可以使用通配符“*”,表示包模塊中某個層次的類全引入進來。例: importjava.io.*; importjava.awt.Graphics;2、java會自動引入lang包下的所有類和接口。3、前綴包名法:不用import語句也可以引入其他包中的類和接口。classArea//作業(yè)1{floatgetArea(floatr){ System.out.print("方法一:");

return3.14f*r*r;}doublegetArea(floatx,inty){ System.out.print("方法二:");

returnx*y;}floatgetArea(intx,floaty){ System.out.print("方法三:");

returnx*y;}doublegetArea(floatx,floaty,floatz){System.out.print("方法四:");return(x+x+y*y+z*z)*2.0;}}作業(yè)(五)1、將Area類補充為如右所示的程序。定義新類AreaTest,并創(chuàng)建Area類的對象調(diào)用每一個成員方法,觀察不同的參數(shù)與調(diào)用方法的之間的關(guān)系。2、將作業(yè)1中Area與AreaTest類分別放在不同的包中重新編譯運行。3、按程序模板(Test.java)要求編寫源文件,將[代碼x]按其后的要求替換為java程序代碼。分析程序輸出結(jié)果。作業(yè)3程序模板classA{ [代碼1]//聲明一個float型的實例變量a [代碼2]//聲明一個float型的類變量b voidsetA(floata) { [代碼3]//將參數(shù)a賦值給成員變量a } voidsetB(floatb) { [代碼4]//將參數(shù)b賦值給成員變量b } floatgetA() { returna; } staticfloatgetB() { returnb; } voidoutA() { System.out.println(a); } [代碼5]//定義方法outB(),輸出變量b}publicclassTest{ [代碼6]//通過類名引用變量b,給b賦值為100 [代碼7]//通過類名調(diào)用方法outB() Acat=newA(); Adog=newA(); [代碼8]//通過cat調(diào)用方法setA(),將cat的成員變量a設(shè)置為200 [代碼9]//通過cat調(diào)用方法setB(),將cat的成員變量b設(shè)置為300 [代碼10]//通過dog調(diào)用方法setA(),將dog的成員變量a設(shè)置為400 [代碼11]//通過dog調(diào)用方法setB(),將dog的成員變量b設(shè)置為500 [代碼12]//通過cat調(diào)用outA() [代碼13]//通過cat調(diào)用outB() [代碼14]//通過dog調(diào)用outA() [代碼15]//通過dog調(diào)用outB()}6、常用包和類常用包Java.langObjectMathSystem字符串StringStringBufferJava.ioJava.utilJava.awtJava.applet1Math類(數(shù)學(xué)類)

數(shù)學(xué)類包含了許多數(shù)學(xué)函數(shù)如sin、cos、exp、abs等。Math類是一個工具類,它在解決與數(shù)學(xué)有關(guān)的一些問題是有著非常重要的作用。1Math類(數(shù)學(xué)類)方法(均為靜態(tài)方法)public

static

int

abs(

int

a

)public

static

long

abs(

long

a

)public

static

float

abs(

float

a

)public

static

double

abs(

double

a

)

求a的絕對值public

static

double

exp(

double

a

)exp求e的a次冪。1Math類(數(shù)學(xué)類)方法(均為靜態(tài)方法)public

static

double

floor(

double

a

)floor返回

最大的

小于a的整數(shù)。public

static

double

pow(

double

a,

double

b

)pow求a的b次冪。public

static

double

sqrt(

double

a

)sqrt求a的開平方。publicstaticdoublerandom()random產(chǎn)生0~1之間偽隨機數(shù)。

Publicstaticdoubleround(doublea)round四舍五入。例

Math類的使用publicclassmathInstance{publicstaticvoidmain(Stringargs[]){System.out.println(Math.E);System.out.println(Math.PI);System.out.println(Math.exp(5.7));System.out.println(Math.random());System.out.println(Math.sqrt(9.08));System.out.println(Math.pow(2,3));Syst

溫馨提示

  • 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)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論