版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
項目六抽象類、接口和包
類的繼承是OPP(面向?qū)ο蟪绦蛟O(shè)計)的特點之一,但一個子類只能繼承自一個超類,還是存在局限性,可以使用接口解決。一個類可以實現(xiàn)多個接口,體現(xiàn)了OPP的多態(tài)性特點。項目描述
在繼承類或?qū)崿F(xiàn)接口的時候,超類或接口中的方法大多只有方法名,沒有方法體,稱為抽象方法,包含抽象方法的類稱為抽象類。為了管理方便,可以將一些功能相似的類放入包中,這也體現(xiàn)了OPP的封裝性,包中和類與方法可以用不同的關(guān)鍵詞修飾以獲得不同的訪問權(quán)限。任務(wù)一抽象類和抽象方法
【任務(wù)描述】任務(wù)6_1:創(chuàng)建一個有關(guān)于立體模型,名為Three_dimension的抽象類,屬性有“底面圓半徑”、“高”,抽象方法:1)計算此立體模型的表面積。2)計算此立體模型的體積。
任務(wù)6_2:分別創(chuàng)建一個圓柱體的子類Circular_cylinder和一個圓錐體的子類Circular_cone,覆蓋超類Three_dimension當(dāng)中的抽象方法。任務(wù)6_3:寫一個包含main()方法的測試類。在main()方法中產(chǎn)生兩個子類的實例對象。再求出底面圓半徑為2,高為10的兩個立體模型的表面積和體積。
【必備知識】
1.什么是抽象方法。(用abstract關(guān)鍵字去聲明的方法)
在前面的項目中我們學(xué)習(xí)了類的繼承,在超類中所定義的方法,有的時候沒有方法體,子類要繼承超類的時候才在方法中寫出方法體。這是因為多個子類在繼承同一超類的時候,方法體并不相同,比如超類“公司職員”,子類有“前臺秘書”、“銷售代表”和“董事長”,但他們的工資計算方法不同,“前臺秘書”是領(lǐng)月薪的,“銷售代表”是領(lǐng)月薪和提成的,而“董事長”是拿年薪和分紅的。這時候在超類中,工資計算方法就不能寫出方法體,而是要在各個子類當(dāng)中再寫出來。這種沒有方法體的方法稱為抽象方法。2.抽象方法的聲明
抽象方法的聲明格式為:
[格式6_1抽象方法的聲明]
權(quán)限修飾符abstract
返回值類型方法名(形式參數(shù)列表);
說明:
(1)修飾符abstract用于定義抽象方法及抽象類;
(2)abstract放在權(quán)限修飾符與返回值類型之間,如果有static,則放在static之后;
(3)方法名后的參數(shù)是形式參數(shù);
(4)抽象方法不能有方法體,也不能有{},因此要加上;表示此句結(jié)束。3.抽象類(1)一個類中如果定義了抽象方法,這個類必須定義為抽象類。(2)抽象類的定義,在class前使用修飾符abstract。在抽象類中可以沒有抽象方法,但抽象方法必須在抽象類中。(3)抽象類不能用new語句創(chuàng)建實例,如果想要創(chuàng)建實例,必須要用子類將抽象方法繼承后再用子類創(chuàng)建實例。子類必須覆蓋超類中的所有抽象方法,否則子類也必須定義為抽象類。4.抽象類的定義抽象類的定義格式如下:[格式6_2抽象類的定義]權(quán)限修飾符abstract抽象類名稱{數(shù)據(jù)類型成員變量1;//聲明成員變量1數(shù)據(jù)類型成員變量2;//聲明成員變量2
……權(quán)限修飾符abstract返回值類型方法名1(形式參數(shù)列表);
權(quán)限修飾符abstract返回值類型方法名2(形式參數(shù)列表);
……
}說明:(1)抽象類是類的一種,類名要遵循標(biāo)志符的命名規(guī)則,并且每個單詞首字母要大寫;(2)抽象類可以包含抽象方法,也可以包含普通的方法;(3)抽象類是不能直接創(chuàng)建實例,需要被子類繼承后再由子類創(chuàng)建實例。【解題思路】
任務(wù)6_1:
1.用abstract修飾符定義一個名為Three_dimension的抽象類;
2.往Three_dimension類中添加屬性:底邊圓半徑r和高h(yuǎn);
3.往Three_dimension類中添加構(gòu)造方法,讀入底邊圓半徑r和高h(yuǎn);
4.往Three_dimension類中添加superficial_area()和volume()兩個抽象方法,分別用于計算立體模型的表面積和體積。任務(wù)6_2:
5.定義一個圓柱體的子類Circular_cylinder和一個圓錐體的子類Circular_cone,覆蓋超類Three_dimension;
6.覆蓋超類的構(gòu)造方法和抽象方法;
任務(wù)6_3:在測試類中,創(chuàng)建對象,計算出底面圓半徑為2,高為10的兩個立體模型的表面積和體積。【任務(wù)透析】//Three_dimension.java
public
abstract
classThree_dimension {
doubler;//聲明底邊圓面積屬性
doubleh;//聲明高屬性
Three_dimension(doubleradius,doubleheight) { r=radius; h=height; }
public
abstract
doublesuperficial_area();
public
abstract
doublevolume();//Circular_cylinder.javapublic
classCircular_cylinderextendsThree_dimension{Circular_cylinder(doubler,doubleh){ super(r,h);}
public
doublesuperficial_area(){ returnr*r*Math.PI*2+r*h*Math.PI*2;//圓柱體的表面積}
public
doublevolume(){ returnr*r*Math.PI*h;//圓柱體的體積}}//Circular_cone.javapublic
classCircular_coneextendsThree_dimension{Circular_cone(doubler,doubleh){
super(r,h);}
public
doublesuperficial_area(){
returnMath.PI*r*Math.sqrt(r*r+h*h);//圓錐體的表面積
}
public
doublevolume(){
returnr*r*Math.PI*h/3;//圓錐體的體積
}}//Example6_1public
classExample6_1{
public
static
voidmain(String[]args){Circular_cylinderc1=newCircular_cylinder(2,10);//創(chuàng)建圓柱體實例c1Circular_conec2=newCircular_cone(2,10);//創(chuàng)建圓錐體實例c2System.out.println("圓柱體的表面積為"+c1.superficial_area());System.out.println("圓柱體的體積為"+c1.volume());System.out.println("圓錐體的表面積為"+c2.superficial_area());System.out.println("圓錐體的體積為"+c2.volume());}}圖6.1Example6_1.java的運(yùn)行結(jié)果【課堂提問】
★什么是抽象方法,什么是抽象類,它們應(yīng)如何定義或聲明?
★抽象類必須要包含抽象方法嗎?抽象方法必須要在抽象類中嗎?
★如果子類不能覆蓋超類中的全部抽象方法,子類必須是抽象類嗎?
★如果抽象類中有非抽象的方法,子類也可以覆蓋這個方法嗎?
【現(xiàn)場演練】
定義一個表示員工的Employee抽象類,包含的屬性有“姓名”、“性別”和“年齡”,還有表示工資計算的方法salary_count()。再定義兩個繼承自Employee的子類,一個為表示經(jīng)理的Manager,一個為表示秘書的Secretary,覆蓋salary_count()方法。任務(wù)二接口與接口的實現(xiàn)
【任務(wù)描述】任務(wù)6_3:定義一個表示控制器的接口Controller,成員變量有表示開關(guān)狀態(tài)的power、表示音量的volumn,成員方法有構(gòu)造方法、設(shè)置開關(guān)狀態(tài)的powerOnOff()方法、提高音量的volumnUp()方法、降低音量的volumnDown()方法。再定義一個它的子接口RemoteController表示遙控器。任務(wù)6_4:定義一個類Tv實現(xiàn)遙控器接口,覆蓋所有方法,創(chuàng)建Tv對象,并調(diào)用這些方法?!颈貍渲R】1.什么是接口與前面介紹的類相似,接口是另一種定義數(shù)據(jù)類型的方法。接口也可以定義自己的成員變量與成員方法,可以通過繼承產(chǎn)生子接口,而且接口只有被類實現(xiàn)后才可以創(chuàng)建對象。接口的命名方法與類命名一樣,而且與類不能重名。接口用public修飾后,.java文件必須以這個接口名命名。接口是體現(xiàn)OOP(面向?qū)ο蟪绦蛟O(shè)計)多態(tài)性的重要途徑,一個類只能繼承自一個超類(單繼承),但一個類可以實現(xiàn)多個接口(多繼承)。如在實際運(yùn)用中,正方形既繼承長方形,又繼承菱形的一些特征,如果把長方形和菱形定義為類,顯然正方形不可能同時繼承這兩個超類,這時可以把長方形和菱形定義為接口,由正方形實現(xiàn)這兩個接口,達(dá)到了多繼承的目的。接口中方法必須全部為抽象方法。與類的繼承相似,在實現(xiàn)接口的時候,類必須覆蓋接口中所有的方法。如果一個類同時實現(xiàn)了幾個接口,也必須覆蓋所有接口中的所有方法。2.接口如何定義接口的定義格式為:[格式6_3接口定義方法]interface接口名{
publicstaticfinal數(shù)據(jù)類型1變量1=值1;
publicstaticfinal數(shù)據(jù)類型2變量2=值2;
……publicabstract返回值類型1方法名1(形式參數(shù)列表);
publicabstract返回值類型2方法名2(形式參數(shù)列表);
……
}說明:(1)修飾符interface用于定義接口;(2)接口中的成員變量用publicstaticfinal修飾,說明接口中只能聲明常量,因此,成員變量在聲明后應(yīng)該立即賦值;(3)成員變量前的publicstaticfinal修飾符可以全部或部分省略;(4)接口中的成員方法用publicabstract修飾,說明接口中的方法必須都是抽象方法;(5)成員方法前的publicabstract可以省略,但省略后所代表的意義不變。3.接口怎樣繼承[格式6_4接口繼承方法]interface接口名1extends接口名2,接口名3,...{……
}說明:(1)接口的繼承格式與類的繼承格式相同;(2)一個接口可以繼承自多個接口;(3)子接口繼承超接口后,超接口中所有的屬性和方法也被子接口繼承。4.接口怎樣實現(xiàn)與抽象類相似,接口定義后不能直接創(chuàng)建對象,必須由類實現(xiàn)后再創(chuàng)建類的對象。每個類只能繼承自一個超類,但可以實現(xiàn)多個接口。實現(xiàn)方法如下:[格式6_5接口實現(xiàn)方法]class類名extends超類名implements接口1,接口2,...{
public返回值類型1方法名1(形式參數(shù)列表);//覆蓋方法1
public返回值類型2方法名2(形式參數(shù)列表);//覆蓋方法2
……
}
說明:
(1)一個類可以實現(xiàn)多個接口,用implements引導(dǎo),多個接口用,分隔;
(2)可以在實現(xiàn)接口的同時繼承超類;
(3)必須要覆蓋所有接口的所有方法;
(4)覆蓋這些方法時,public修飾符不能省略;
(5)接口中的變量可以被覆蓋,也可以不被覆蓋?!窘忸}思路】
任務(wù)6_4:1.定義一個名為Controller的接口;2.往Controller接口中添加方法:構(gòu)造方法、powerOnOff()表示設(shè)置開關(guān)、volumnUp()和volumnDown()方法提高或降低音量;3.在接口Controller中繼續(xù)添加一個抽象方法outPut();4.定義一個名為RemoteController的子接口。任務(wù)6_5:5.定義一個Tv的類,實現(xiàn)接口RemoteController,并添加成員變量:開關(guān)狀態(tài)power和音量volumn。6.覆蓋所實現(xiàn)接口所有的方法;7.創(chuàng)建對象,調(diào)用這些方法?!救蝿?wù)透析】//Controller.javapublic
interfaceController{
voidpowerOnOff();//設(shè)置開關(guān)狀態(tài)的抽象方法
voidvolumnUp(intincrement);//整型increment表示音量的步進(jìn)值
voidvolumnDown(intincrement);
voidoutPut();//輸出所有成員變量值; //以上所有抽象方法都省略了publicabstract}//RemoteController.javapublic
interfaceRemoteControllerextendsController{ //接口RemoteController繼承自接口Controller}//Tv.javapublic
classTvimplementsRemoteController{
booleanpower;//成員變量power表示開關(guān)的狀態(tài)
intvolumn;//成員變量volumn表示音量
intvolumnTemp;//成員變量volumTemp表示音量的暫存項
Tv(booleanpower,intvolumn)//定義構(gòu)造方法
{
this.power=power;
this.volumn=volumn; }
public
voidpowerOnOff(){ power=!power;
if(power) volumn=volumnTemp;
else { volumnTemp=volumn; volumn=0; } }public
voidvolumnUp(intincrement){ volumn=volumn+increment;}
public
voidvolumnDown(intincrement){ volumn=volumn-increment;}
public
voidoutPut(){ System.out.print("當(dāng)前電視機(jī)的狀態(tài)是"+power+","); System.out.println("當(dāng)前電視機(jī)的音量是"+volumn); }}//Example6_2.javapublic
classExample6_2{
public
static
voidmain(Stringargs[]){Tvt=newTv(true,10);//創(chuàng)建實例t并代入初始量
t.outPut();t.volumnUp(3);//將音量升高3;t.outPut();t.volumnDown(2);//將音量降低2;t.outPut();t.powerOnOff();t.outPut();t.powerOnOff();t.outPut();}}圖6.2Example6_2.java的運(yùn)行結(jié)果【課堂提問】★什么是接口,接口里都有什么?★接口的實現(xiàn)與類的繼承有什么異同之處?★接口如何繼承?★類實現(xiàn)接口時,如果這個類不是抽象類,是否必須覆蓋這個接口中所有的方法?如果這個類是抽象類,那么又如何?【現(xiàn)場演練】定義一個類Car實現(xiàn)上述例題中的RemoteControl接口表示遙控汽車,成員變量有boolean型的power表示開關(guān)狀態(tài)、int型的volumn表示速度,成員方法有構(gòu)造方法、powerOnOff()設(shè)置開關(guān)狀態(tài)、volumnUp()和volumnDown()表示提高或降低速度。創(chuàng)建Car對象,并調(diào)用這些方法。任務(wù)三包與訪問權(quán)限
【任務(wù)描述】任務(wù)6_3:定義一個類Example3,然后將這個類封裝在名為package1的包中,設(shè)置這個類只能在包內(nèi)是可見的。【必備知識】1.什么是包在Java中,為了方便管理類,可以將一些相關(guān)的類用包來組織。包不僅是一種管理與組織類的方式,而且可以避免類的命名沖突。在包中定義的類必須要通過包名來訪問。這樣,在不同的包中,就可以出現(xiàn)相同名稱的類,減少重名的發(fā)生率。除了方便管理與組織,包的另外一個用處是設(shè)定類的訪問機(jī)制。類可以設(shè)定為只能在包中訪問,也可以設(shè)定為在包外可以訪問,這樣也體現(xiàn)了OOP(面向?qū)ο蟪绦蛟O(shè)計)的封裝性。2.如何定義包包的定義方法如下:[格式6_6包的定義方法]package包名;class類名{……
}說明:(1)包的定義用package語句;(2)包的定義在類的頂部;(3)Java中所有的類都屬于某個包,如果沒有指定,則在默認(rèn)包中;3.怎樣設(shè)定權(quán)限其實從我們編寫第一個Java源程序開始,權(quán)限修飾符public就一直伴隨著我們。在Java中,有三個權(quán)限修飾符,分別是public、protected和private,這三個關(guān)鍵字都可以用于修飾方法和變量等,用來設(shè)置它們不同的訪問控制權(quán)限。除此之外,public還可以用來修飾接口和類。使用public修飾的公有類對所有類都是可見的,也就是說可以被同一個包中的類訪問,也可以被不同包中的類訪問。值得一提的是,在一個.java文件中只能有一個公有類,且這個類(即主類)的名字必須與.java文件的名字相同,如果在一個.java文件中有幾個類,但沒有公有類,則哪個類與.java文件的名字相同,哪個就是主類。三個修飾符public、protected、private形成了四種訪問權(quán)限。public修飾的成員能被所有類訪問;無修飾符時,成員只能在包內(nèi)被訪問;protected修飾的成員除了在包內(nèi)有可見性外,在其它包中,只有這個類的才能訪問這些成員;private修飾的成員只能在類的內(nèi)部被訪問。假設(shè)這些修飾符修飾的成員在類1中,如圖6.3所示,圖6.3權(quán)限修飾符的作用域【解題思路】
任務(wù)6_3:1.定義一個名為Example3的類;2.在類的頂部進(jìn)行封裝;3.類的權(quán)限設(shè)置為無修飾符;4.這個名為Example6.java的文件要放在根目錄下名為package1的目錄中?!救蝿?wù)透析】//Example6_3.javapackagepackage1;classExample6_3{
public
static
voidmain(Stringargs[]){ System.out.println("helloworld!");}}圖6.4Example6_3.java的運(yùn)行結(jié)果【課堂提問】★什么是包,定義包有什么作用?★用protected修飾的成員與無修飾符修飾的成員有何不同?★同一個.java文件可以有兩個類用public修飾嗎?為什么?【現(xiàn)場演練】定義兩個包a.b.c和x.y.z,在兩個包里分別有兩個類Class1和Class2,給Class2里的成員方法c2分別用public、protected、private權(quán)限修飾,或無權(quán)限修飾,試試Class1能否調(diào)用Class2里的成員方法?!局R鏈接】☆導(dǎo)入類類訪問同一個包中的其它類很容易實現(xiàn),但是如果要訪問其它包中的類,必須查找到被訪問到的類。有兩種方法可以完成。第一種方法是在每個類名前添加完成的包名,如:java.x.y.z.Class2c=newjava.x.y.z.Class2();很顯然,這種方法比較
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版城市軌道交通工程承包合同范本3篇
- 二零二五年度大豆產(chǎn)品電商平臺運(yùn)營合同4篇
- 2025年度商鋪物業(yè)管理與品牌形象塑造合同4篇
- 騰訊2025年度企業(yè)郵箱郵箱使用許可合同2篇
- 二零二五版城市綠化帶植被更新與養(yǎng)護(hù)合同4篇
- 濕地修復(fù)相關(guān)技術(shù)咨詢與服務(wù)2025年度合同
- 2025年度城鄉(xiāng)居民個人房屋買賣合同(綠色家居裝修升級協(xié)議)4篇
- 二零二五年度金屬儲罐租賃與加工定制合同4篇
- 2025年度民品典當(dāng)借款合同擔(dān)保條款規(guī)范4篇
- 臨沂市2025年度教師學(xué)術(shù)交流與合作合同4篇
- GB/T 16895.3-2024低壓電氣裝置第5-54部分:電氣設(shè)備的選擇和安裝接地配置和保護(hù)導(dǎo)體
- GJB9001C質(zhì)量管理體系要求-培訓(xùn)專題培訓(xùn)課件
- 二手車車主寄售協(xié)議書范文范本
- 窗簾采購?fù)稑?biāo)方案(技術(shù)方案)
- 基于學(xué)習(xí)任務(wù)群的小學(xué)語文單元整體教學(xué)設(shè)計策略的探究
- 人教版高中物理必修一同步課時作業(yè)(全冊)
- 食堂油鍋起火演練方案及流程
- 《呼吸衰竭的治療》
- 2024年度醫(yī)患溝通課件
- 2024年中考政治總復(fù)習(xí)初中道德與法治知識點總結(jié)(重點標(biāo)記版)
- 2024年手術(shù)室的應(yīng)急預(yù)案
評論
0/150
提交評論