版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、抽象類(lèi)、接口與包5.5.1 抽象類(lèi) 假設(shè)我們要編寫(xiě)一個(gè)計(jì)算矩形、三角形和圓的面積與周長(zhǎng)的程序,若按前面所學(xué)的方式編程,我們必須定義四個(gè)類(lèi):圓類(lèi)、三角形類(lèi)、矩形類(lèi)和使用前三個(gè)類(lèi)的公共類(lèi),它們之間沒(méi)有繼承關(guān)系,如圖5.4所示。程序?qū)懞煤箅m然能執(zhí)行,但從程序的整體結(jié)構(gòu)上看,三個(gè)類(lèi)之間的許多共同屬性和操作在程序中沒(méi)有很好地被利用,致使重復(fù)編寫(xiě)代碼,降低了程序的開(kāi)發(fā)效率,且使出現(xiàn)錯(cuò)誤的機(jī)會(huì)增加。圓類(lèi)圓心座標(biāo)半徑計(jì)算面積計(jì)算周長(zhǎng)三角形類(lèi)底邊長(zhǎng)高計(jì)算面積計(jì)算周長(zhǎng)矩形類(lèi)長(zhǎng)寬計(jì)算面積計(jì)算周長(zhǎng)圖5.4 具有相同特征卻彼此獨(dú)立的幾個(gè)類(lèi)仔細(xì)分析上面例子中的三個(gè)類(lèi),可以看到這三個(gè)類(lèi)都要計(jì)算面積與周長(zhǎng),雖然公式不同但目標(biāo)
2、相同。因此,我們可以為這三個(gè)類(lèi)抽象出一個(gè)父類(lèi),在父類(lèi)里定義圓、三角形和矩形三個(gè)類(lèi)共同的數(shù)據(jù)成員及成員方法。把計(jì)算面積與周長(zhǎng)的成員方法名放在父類(lèi)給予說(shuō)明,而具體的計(jì)算公式再在子類(lèi)中實(shí)現(xiàn)。如圖5.5所示。這樣,我們通過(guò)父類(lèi)就大概知道子類(lèi)所要完成的任務(wù),而且,這些方法還可以應(yīng)用于求解平行四邊形、梯形等圖形的周長(zhǎng)與面積。這種結(jié)構(gòu)就是抽象類(lèi)的概念。圓類(lèi)圓心座標(biāo)半徑三角形類(lèi)底邊長(zhǎng)高計(jì)算面積計(jì)算周長(zhǎng)長(zhǎng)寬抽象類(lèi)梯形類(lèi)計(jì)算面積計(jì)算周長(zhǎng)抽象方法計(jì)算面積計(jì)算周長(zhǎng)矩形類(lèi)計(jì)算面積計(jì)算周長(zhǎng)上、下底邊長(zhǎng)高圖5.5 抽象類(lèi)及其應(yīng)用抽象類(lèi)是它的所有子類(lèi)的公共屬性的集合,是包含一個(gè)或多個(gè)抽象方法的類(lèi)。使用抽象類(lèi)的一大優(yōu)點(diǎn)就是可以
3、充分利用這些公共屬性來(lái)提高開(kāi)發(fā)和維護(hù)程序的效率。對(duì)于抽象類(lèi)與抽象方法的限制如下: (1) 凡是用abstract 修飾符修飾的類(lèi)被稱(chēng)為抽象類(lèi)。凡是用abstract修飾符修飾的成員方法被稱(chēng)為抽象方法。 (2) 抽象類(lèi)中可以有零個(gè)或多個(gè)抽象方法,也可以包含非抽象的方法。(3) 抽象類(lèi)中可以沒(méi)有抽象方法,但是,有抽象方法的類(lèi)必須是抽象類(lèi)。 (4) 對(duì)于抽象方法來(lái)說(shuō),在抽象類(lèi)中只指定其方法名及其類(lèi)型,而不書(shū)寫(xiě)其實(shí)現(xiàn)代碼。 (5) 抽象類(lèi)可以派生子類(lèi),在抽象類(lèi)派生的子類(lèi)中必須實(shí)現(xiàn)抽象類(lèi)中定義的所有抽象方法。 (6) 抽象類(lèi)不能創(chuàng)建對(duì)象,創(chuàng)建對(duì)象的工作由抽象類(lèi)派生的子類(lèi)來(lái)實(shí)現(xiàn)。(7) 如果父類(lèi)中已有同名
4、的abstract方法,則子類(lèi)中就不能再有同名的抽象方法。 (8) abstract不能與final并列修飾同一個(gè)類(lèi)。 (9) abstract 不能與private ,static,final或native并列修飾同一個(gè)方法。 (10) abstract 類(lèi)中不能有private的數(shù)據(jù)成員或成員方法。【示例程序c5_18.java】 抽象類(lèi)應(yīng)用。import java.awt.*;import java.applet. *;abstract class Shapes /定義一個(gè)抽象類(lèi)Shapes public int x,y; /x、y為畫(huà)圖的坐標(biāo) public int width,heig
5、ht; public Shapes(int x,int y,int width,int height) this.x=x; this.y=y; this.width=width; this.height=height; abstract double getArea( ); /求圖形面積的抽象方法 abstract double getPerimeter( ); /求圖形周長(zhǎng)的抽象方法class Square extends Shapes /由抽象類(lèi)Shapes派生的子類(lèi)矩形類(lèi) public double getArea( )return(width*height); public doubl
6、e getPerimeter( )return(2*width+2*height); public Square(int x,int y,int width,int height) super(x,y,width,height); class Triangle extends Shapes /由抽象類(lèi)Shapes派生的子類(lèi)三角形類(lèi)public double c; /斜邊 public double getArea( )return(0.5*width*height); public double getPerimeter( )return(width+height+c); public Tri
7、angle(int x,int y,int base,int height) super(x,y,base,height); c=Math.sqrt(width*width+height*height); class Circle extends Shapes /由抽象類(lèi)Shapes派生的子類(lèi)圓類(lèi)public double r; /半徑 public double getArea( )return(r*r*Math.PI); public double getPerimeter( )return(2*Math.PI*r); public Circle(int x,int y,int width
8、,int height) super(x,y,width,height); r=(double)width/2.0; public class c5_18 extends AppletSquare Box=new Square(5,15,25,25); Triangle tri=new Triangle(5,50,8,4); Circle Oval=new Circle(5,90,25,25); public void paint(Graphics g) /畫(huà)正方形 g.drawRect(Box.x,Box.y,Box.width,Box.height); g.drawString("
9、;Box Area:"+Box.getArea( ),50,35); g.drawString("Box Perimeter:"+Box.getPerimeter( ),50,55); g.drawString("tri Area:"+tri.getArea( ),50,75);g.drawString("tri Perimeter:"+tri.getPerimeter( ),50,95); g.drawOval(Oval.x,Oval.y,Oval.width,Oval.height); /畫(huà)圓 g.drawString(
10、"oval Area:"+Oval.getArea( ),50,115); 圖5.6 程序c5_18的運(yùn)行結(jié)果5.5.2 接口 多重繼承是指一個(gè)子類(lèi)可以有多個(gè)直接父類(lèi),該子類(lèi)可以全部或部分繼承所有直接父類(lèi)的數(shù)據(jù)成員及成員方法。例如,冷藏車(chē)既是一種汽車(chē),也是一種制冷設(shè)備,所以它是汽車(chē)的子類(lèi)也是制冷設(shè)備的子類(lèi)。自然界中這種多繼承結(jié)構(gòu)到處可見(jiàn)。1聲明接口聲明接口的格式如下:修飾符 interface接口名extends 父接口名列表常量數(shù)據(jù)成員聲明抽象方法聲明2定義接口注意事項(xiàng) 定義接口要注意以下幾點(diǎn): (1) 接口定義用關(guān)鍵字interface,而不是用class。 (2) 接
11、口中定義的數(shù)據(jù)成員全是final static,即常量。 (3) 接口中沒(méi)有自身的構(gòu)造方法,所有成員方法都是抽象方法。 (4) 接口也具有繼承性,可以通過(guò)extends關(guān)鍵字聲明該接口的父接口。3. 類(lèi)實(shí)現(xiàn)接口的注意事項(xiàng) 一個(gè)類(lèi)要實(shí)現(xiàn)接口,即一個(gè)類(lèi)要調(diào)用多個(gè)接口時(shí),要注意以下幾點(diǎn): (1) 在類(lèi)中,用implements關(guān)鍵字就可以調(diào)用接口。一個(gè)類(lèi)若要調(diào)用多個(gè)接口時(shí),可在implements后用逗號(hào)隔開(kāi)多個(gè)接口的名字。 (2) 如果實(shí)現(xiàn)某接口的類(lèi)不是abstract的抽象類(lèi),則在類(lèi)的定義部分必須實(shí)現(xiàn)指定接口的所有抽象方法,即為所有抽象方法定義方法體,而且方法頭部分應(yīng)該與接口中的定義完全一致,即
12、有完全相同的返回值和參數(shù)列表。(3) 如果實(shí)現(xiàn)某接口的類(lèi)是abstract的抽象類(lèi),則它可以不實(shí)現(xiàn)該接口所有的方法。(4) 接口的抽象方法的訪問(wèn)限制符都己指定為public,所以類(lèi)在實(shí)現(xiàn)方法時(shí),必須顯式地使用public修飾符,否則將被系統(tǒng)警告為縮小了接口中定義的方法的訪問(wèn)控制范圍?!臼纠绦騝5_19.java】 將例c5_18.java改寫(xiě)為接口程序。import java.awt.*;import java.applet.*;interface Shapes/定義一個(gè)接口 abstract double getArea( ); abstract double getPerimeter(
13、);class Square implements Shapes /類(lèi)要實(shí)現(xiàn)接口public int x,y; public int width,height; public double getArea( )return(width*height); public double getPerimeter( )return(2*width+2*height); public Square(int x,int y,int width,int height) this.x=x; this.y=y; this.width=width; this.height=height; class Triang
14、le implements Shapes /類(lèi)要實(shí)現(xiàn)接口 public int x,y; public int width,height; public double c; public double getArea( )return(0.5*width*height); public double getPerimeter( )return(width+height+c); public Triangle(int x,int y,int base,int height) this.x=x; this.y=y; width=base; this.height=height; c=Math.sq
15、rt(width*width+height*height); class Circle implements Shapes /類(lèi)要實(shí)現(xiàn)接口public int x,y; public int width,height; public double r; public double getArea( )return(r*r*Math.PI); public double getPerimeter( )return(2*Math.PI*r); public Circle(int x,int y,int width,int height) this.x=x; this.y=y; this.width
16、=width; this.height=height; r=(double)width/2.0; public class c5_19 extends Applet Square Box=new Square(5,15,25,25); Triangle tri=new Triangle(5,50,8,4); Circle Oval=new Circle(5,90,25,25); public void paint(Graphics g) g.drawRect(Box.x,Box.y,Box.width,Box.height); g.drawString("Box Area:"
17、;+Box.getArea( ),50,35); g.drawString("Box Perimeter:"+Box.getPerimeter( ),50,55); g.drawString("tri Area:"+tri.getArea( ),50,75); g.drawString("tri Perimeter:"+tri.getPerimeter( ),50,95); g.drawOval(Oval.x,Oval.y,Oval.width,Oval.height); g.drawString("oval Area:&q
18、uot;+Oval.getArea( ),50,115); 圖5.7 程序c5_19的運(yùn)行結(jié)果【示例程序c5_20.java】 將例c5_19.java改寫(xiě)為既有繼承類(lèi)又有接口的程序。import java.awt.*;import java.applet.*;interface Shapes abstract double getArea( ); abstract double getPerimeter( );class Coordinates int x,y; public Coordinates(int x,int y) this.x=x; this.y=y; /Square Coord
19、inates Shapesclass Square extends Coordinates implements Shapes public int width,height; public double getArea( )return(width*height); public double getPerimeter( )return(2*width+2*height); public Square(int x,int y,int width,int height) super(x,y); this.width=width; this.height=height; class Triang
20、le extends Coordinates implements Shapes public int width,height; public double c; public double getArea( )return(0.5*width*height); public double getPerimeter( )return(width+height+c); public Triangle(int x,int y,int base,int height) super(x,y); width=base; this.height=height; c=Math.sqrt(width*wid
21、th+height*height); class Circle extends Coordinates implements Shapes public int width,height; public double r; public double getArea( )return(r*r*Math.PI); public double getPerimeter( )return(2*Math.PI*r); public Circle(int x,int y,int width,int height) super(x,y); this.width=width; this.height=hei
22、ght; r=(double)width/2.0; public class c5_20 extends Applet Square Box=new Square(5,15,25,25); Triangle tri=new Triangle(5,50,8,4); Circle Oval=new Circle(5,90,25,25); public void paint(Graphics g) g.drawRect(Box.x,Box.y,Box.width,Box.height); g.drawString("Box Area:"+Box.getArea( ),50,35)
23、; g.drawString("Box Perimeter:"+Box.getPerimeter( ),50,55); g.drawString("tri Area:"+tri.getArea( ),50,75); g.drawString("tri Perimeter:"+tri.getPerimeter( ),50,95); g.drawOval(Oval.x,Oval.y,Oval.width,Oval.height); g.drawString("oval Area:"+Oval.getArea( ),50
24、,115); 運(yùn)行結(jié)果與示例程序c5_19.java的相同。5.5.3 包與程序復(fù)用在許多場(chǎng)合反復(fù)使用那些早已編寫(xiě)好的,且經(jīng)過(guò)嚴(yán)格測(cè)試的程序的技術(shù)被稱(chēng)為軟件復(fù)用,在面向?qū)ο蟮某绦蛟O(shè)計(jì)中稱(chēng)為對(duì)象復(fù)用。對(duì)象復(fù)用是面向?qū)ο缶幊痰闹饕獌?yōu)點(diǎn)之一,它是指同一對(duì)象在多個(gè)場(chǎng)合被反復(fù)使用。在Java語(yǔ)言中,對(duì)象是類(lèi)的實(shí)例,類(lèi)是創(chuàng)建對(duì)象的模板,對(duì)象是以類(lèi)的形式體現(xiàn)的。因此,對(duì)象復(fù)用也就體現(xiàn)在類(lèi)的重用上。包的作用有兩個(gè):一是劃分類(lèi)名空間,二是控制類(lèi)之間的訪問(wèn)。這就需要我們注意下述兩點(diǎn)。首先,既然包是一個(gè)類(lèi)名空間,所以,同一個(gè)包中的類(lèi)(包括接口)不能重名,不同包中的類(lèi)可以重名。第二,類(lèi)之間的訪問(wèn)控制是通過(guò)類(lèi)修飾符來(lái)實(shí)
25、現(xiàn)的,若類(lèi)聲明修飾符為public,則表明該類(lèi)不僅可供同一包中的類(lèi)訪問(wèn),也可以被其他包中的類(lèi)訪問(wèn)。若類(lèi)聲明無(wú)修飾符,則表明該類(lèi)僅供同一包中的類(lèi)訪問(wèn)。1. 創(chuàng)建包 包的創(chuàng)建就是將源程序文件中的接口和類(lèi)納入指定的包。在一般情況下Java源程序的構(gòu)成由四部分組成: (1) 一個(gè)包(package)說(shuō)明語(yǔ)句(可選項(xiàng))。其作用是將本源文件中的接口和類(lèi)納入指定包。源文件中若有包說(shuō)明語(yǔ)句,必須是第一個(gè)語(yǔ)句。 (2) 若干個(gè)(import)語(yǔ)句(可選項(xiàng))。其作用是引入本源文件中需要使用的包。 (3) 一個(gè)public的類(lèi)聲明。在一個(gè)源文件中只能有一個(gè)public類(lèi)。(4) 若干個(gè)屬于本包的類(lèi)聲明(可選)。包的
26、聲明語(yǔ)句格式: package 包名;利用這個(gè)語(yǔ)句就可以創(chuàng)建一個(gè)具有指定名字的包,當(dāng)前.java文件中的所有類(lèi)都被放在這個(gè)包中。例如下面的語(yǔ)句是合法的創(chuàng)建包的語(yǔ)句:package shape;package shape.shapeCircle;創(chuàng)建包就是在當(dāng)前文件夾下創(chuàng)建一個(gè)子文件夾,存放這個(gè)包中包含的所有類(lèi)的.class文件。package shape.shapeCircle;語(yǔ)句中的符號(hào)“”代表了目錄分隔符,說(shuō)明這個(gè)語(yǔ)句創(chuàng)建了兩個(gè)文件夾:第一個(gè)是當(dāng)前文件夾下的子文件夾shape;第二個(gè)是shape下的子文件夾shapeCircle,當(dāng)前包中的所有類(lèi)就存放在這個(gè)文件夾里。 若源文件中未使用p
27、ackage,則該源文件中的接口和類(lèi)位于Java的無(wú)名包中(無(wú)名包又稱(chēng)缺省包),它們之間可以相互引用非private的數(shù)據(jù)成員或成員方法。無(wú)名包中的類(lèi)不能被其他包中的類(lèi)引用和復(fù)用。【示例程序c5_21.java】 改寫(xiě)示例程序c5_20.java,將接口與類(lèi)納入包。第一步,建立5個(gè)源文件,文件的接口與類(lèi)都屬于包shape。設(shè)這些文件都存入當(dāng)前文件夾d:myjava中。(1) 名為Shapes.java的文件(2) 名為Coordinates.java的文件(3) 名為Square.java的文件(4) 名為T(mén)riangle.java的文件第二步,對(duì)上面的5個(gè)文件進(jìn)行編譯。第三步,shape包的引用。使用下述命令編譯該程序: d:myjava>javac -d d:myjava c5_21.java 對(duì)其編譯時(shí),javac從環(huán)境變量CLASSPATH(類(lèi)似于DOS操作系統(tǒng)中的PATH,它指明所有缺省的類(lèi)字節(jié)碼文件路徑)提供的路徑去搜索名為shape的子目
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年財(cái)產(chǎn)擔(dān)保合同模板3篇
- 二零二五年度idc機(jī)房租賃與數(shù)據(jù)中心安全防護(hù)合同3篇
- 微型計(jì)算機(jī)商品買(mǎi)賣(mài)合同
- 一次性投資1萬(wàn)元每月抽取利潤(rùn)的合同范本
- 二手房購(gòu)房合同范本2024
- 個(gè)人二手房購(gòu)房合同模板
- 機(jī)加工創(chuàng)收實(shí)施方案樣本(2篇)
- 學(xué)校消防安全演練方案模版(三篇)
- 運(yùn)輸區(qū)煤質(zhì)管理制度(2篇)
- 井下供配電工安全生產(chǎn)應(yīng)急管理責(zé)任制模版(3篇)
- 2023年鞍山市海城市教育局畢業(yè)生招聘筆試真題
- 北京2025年首都醫(yī)科大學(xué)附屬北京友誼醫(yī)院招聘140人歷年參考題庫(kù)(頻考版)含答案解析
- 遼寧省撫順縣2024-2025學(xué)年九年級(jí)上學(xué)期期末物理試卷(含答案)
- 2024-2025學(xué)年安徽省合肥市巢湖市三年級(jí)數(shù)學(xué)第一學(xué)期期末達(dá)標(biāo)測(cè)試試題含解析
- 浙江省寧波市九校2023-2024學(xué)年高一上期末聯(lián)考生物試題
- 《工商管理專(zhuān)業(yè)畢業(yè)實(shí)習(xí)》課程教學(xué)大綱
- 乳腺中心建設(shè)方案
- 國(guó)開(kāi)電大本科《西方經(jīng)濟(jì)學(xué)(本)》網(wǎng)上形考(作業(yè)一至六)試題及答案
- 提高有風(fēng)險(xiǎn)患者預(yù)防跌倒墜床護(hù)理措施落實(shí)率品管圈PDCA案例匯報(bào)
- 安環(huán)部2025年度工作計(jì)劃
- 2024年行政執(zhí)法人員執(zhí)法資格知識(shí)考試題庫(kù)(附含答案)
評(píng)論
0/150
提交評(píng)論