版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、抽象類、接口與包5.5.1 抽象類 假設(shè)我們要編寫一個(gè)計(jì)算矩形、三角形和圓的面積與周長(zhǎng)的程序,若按前面所學(xué)的方式編程,我們必須定義四個(gè)類:圓類、三角形類、矩形類和使用前三個(gè)類的公共類,它們之間沒有繼承關(guān)系,如圖5.4所示。程序?qū)懞煤箅m然能執(zhí)行,但從程序的整體結(jié)構(gòu)上看,三個(gè)類之間的許多共同屬性和操作在程序中沒有很好地被利用,致使重復(fù)編寫代碼,降低了程序的開發(fā)效率,且使出現(xiàn)錯(cuò)誤的機(jī)會(huì)增加。圓類圓心座標(biāo)半徑計(jì)算面積計(jì)算周長(zhǎng)三角形類底邊長(zhǎng)高計(jì)算面積計(jì)算周長(zhǎng)矩形類長(zhǎng)寬計(jì)算面積計(jì)算周長(zhǎng)圖5.4 具有相同特征卻彼此獨(dú)立的幾個(gè)類仔細(xì)分析上面例子中的三個(gè)類,可以看到這三個(gè)類都要計(jì)算面積與周長(zhǎng),雖然公式不同但目標(biāo)
2、相同。因此,我們可以為這三個(gè)類抽象出一個(gè)父類,在父類里定義圓、三角形和矩形三個(gè)類共同的數(shù)據(jù)成員及成員方法。把計(jì)算面積與周長(zhǎng)的成員方法名放在父類給予說明,而具體的計(jì)算公式再在子類中實(shí)現(xiàn)。如圖5.5所示。這樣,我們通過父類就大概知道子類所要完成的任務(wù),而且,這些方法還可以應(yīng)用于求解平行四邊形、梯形等圖形的周長(zhǎng)與面積。這種結(jié)構(gòu)就是抽象類的概念。圓類圓心座標(biāo)半徑三角形類底邊長(zhǎng)高計(jì)算面積計(jì)算周長(zhǎng)長(zhǎng)寬抽象類梯形類計(jì)算面積計(jì)算周長(zhǎng)抽象方法計(jì)算面積計(jì)算周長(zhǎng)矩形類計(jì)算面積計(jì)算周長(zhǎng)上、下底邊長(zhǎng)高圖5.5 抽象類及其應(yīng)用抽象類是它的所有子類的公共屬性的集合,是包含一個(gè)或多個(gè)抽象方法的類。使用抽象類的一大優(yōu)點(diǎn)就是可以
3、充分利用這些公共屬性來(lái)提高開發(fā)和維護(hù)程序的效率。對(duì)于抽象類與抽象方法的限制如下: (1) 凡是用abstract 修飾符修飾的類被稱為抽象類。凡是用abstract修飾符修飾的成員方法被稱為抽象方法。 (2) 抽象類中可以有零個(gè)或多個(gè)抽象方法,也可以包含非抽象的方法。(3) 抽象類中可以沒有抽象方法,但是,有抽象方法的類必須是抽象類。 (4) 對(duì)于抽象方法來(lái)說,在抽象類中只指定其方法名及其類型,而不書寫其實(shí)現(xiàn)代碼。 (5) 抽象類可以派生子類,在抽象類派生的子類中必須實(shí)現(xiàn)抽象類中定義的所有抽象方法。 (6) 抽象類不能創(chuàng)建對(duì)象,創(chuàng)建對(duì)象的工作由抽象類派生的子類來(lái)實(shí)現(xiàn)。(7) 如果父類中已有同名
4、的abstract方法,則子類中就不能再有同名的抽象方法。 (8) abstract不能與final并列修飾同一個(gè)類。 (9) abstract 不能與private ,static,final或native并列修飾同一個(gè)方法。 (10) abstract 類中不能有private的數(shù)據(jù)成員或成員方法?!臼纠绦騝5_18.java】 抽象類應(yīng)用。import java.awt.*;import java.applet. *;abstract class Shapes /定義一個(gè)抽象類Shapes public int x,y; /x、y為畫圖的坐標(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 /由抽象類Shapes派生的子類矩形類 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 /由抽象類Shapes派生的子類三角形類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 /由抽象類Shapes派生的子類圓類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) /畫正方形 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); /畫圓 g.drawString(
10、"oval Area:"+Oval.getArea( ),50,115); 圖5.6 程序c5_18的運(yùn)行結(jié)果5.5.2 接口 多重繼承是指一個(gè)子類可以有多個(gè)直接父類,該子類可以全部或部分繼承所有直接父類的數(shù)據(jù)成員及成員方法。例如,冷藏車既是一種汽車,也是一種制冷設(shè)備,所以它是汽車的子類也是制冷設(shè)備的子類。自然界中這種多繼承結(jié)構(gòu)到處可見。1聲明接口聲明接口的格式如下:修飾符 interface接口名extends 父接口名列表常量數(shù)據(jù)成員聲明抽象方法聲明2定義接口注意事項(xiàng) 定義接口要注意以下幾點(diǎn): (1) 接口定義用關(guān)鍵字interface,而不是用class。 (2) 接
11、口中定義的數(shù)據(jù)成員全是final static,即常量。 (3) 接口中沒有自身的構(gòu)造方法,所有成員方法都是抽象方法。 (4) 接口也具有繼承性,可以通過extends關(guān)鍵字聲明該接口的父接口。3. 類實(shí)現(xiàn)接口的注意事項(xiàng) 一個(gè)類要實(shí)現(xiàn)接口,即一個(gè)類要調(diào)用多個(gè)接口時(shí),要注意以下幾點(diǎn): (1) 在類中,用implements關(guān)鍵字就可以調(diào)用接口。一個(gè)類若要調(diào)用多個(gè)接口時(shí),可在implements后用逗號(hào)隔開多個(gè)接口的名字。 (2) 如果實(shí)現(xiàn)某接口的類不是abstract的抽象類,則在類的定義部分必須實(shí)現(xiàn)指定接口的所有抽象方法,即為所有抽象方法定義方法體,而且方法頭部分應(yīng)該與接口中的定義完全一致,即
12、有完全相同的返回值和參數(shù)列表。(3) 如果實(shí)現(xiàn)某接口的類是abstract的抽象類,則它可以不實(shí)現(xiàn)該接口所有的方法。(4) 接口的抽象方法的訪問限制符都己指定為public,所以類在實(shí)現(xiàn)方法時(shí),必須顯式地使用public修飾符,否則將被系統(tǒng)警告為縮小了接口中定義的方法的訪問控制范圍?!臼纠绦騝5_19.java】 將例c5_18.java改寫為接口程序。import java.awt.*;import java.applet.*;interface Shapes/定義一個(gè)接口 abstract double getArea( ); abstract double getPerimeter(
13、);class Square implements Shapes /類要實(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 /類要實(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 /類要實(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改寫為既有繼承類又有接口的程序。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ù)使用那些早已編寫好的,且經(jīng)過嚴(yán)格測(cè)試的程序的技術(shù)被稱為軟件復(fù)用,在面向?qū)ο蟮某绦蛟O(shè)計(jì)中稱為對(duì)象復(fù)用。對(duì)象復(fù)用是面向?qū)ο缶幊痰闹饕獌?yōu)點(diǎn)之一,它是指同一對(duì)象在多個(gè)場(chǎng)合被反復(fù)使用。在Java語(yǔ)言中,對(duì)象是類的實(shí)例,類是創(chuàng)建對(duì)象的模板,對(duì)象是以類的形式體現(xiàn)的。因此,對(duì)象復(fù)用也就體現(xiàn)在類的重用上。包的作用有兩個(gè):一是劃分類名空間,二是控制類之間的訪問。這就需要我們注意下述兩點(diǎn)。首先,既然包是一個(gè)類名空間,所以,同一個(gè)包中的類(包括接口)不能重名,不同包中的類可以重名。第二,類之間的訪問控制是通過類修飾符來(lái)實(shí)
25、現(xiàn)的,若類聲明修飾符為public,則表明該類不僅可供同一包中的類訪問,也可以被其他包中的類訪問。若類聲明無(wú)修飾符,則表明該類僅供同一包中的類訪問。1. 創(chuàng)建包 包的創(chuàng)建就是將源程序文件中的接口和類納入指定的包。在一般情況下Java源程序的構(gòu)成由四部分組成: (1) 一個(gè)包(package)說明語(yǔ)句(可選項(xiàng))。其作用是將本源文件中的接口和類納入指定包。源文件中若有包說明語(yǔ)句,必須是第一個(gè)語(yǔ)句。 (2) 若干個(gè)(import)語(yǔ)句(可選項(xiàng))。其作用是引入本源文件中需要使用的包。 (3) 一個(gè)public的類聲明。在一個(gè)源文件中只能有一個(gè)public類。(4) 若干個(gè)屬于本包的類聲明(可選)。包的
26、聲明語(yǔ)句格式: package 包名;利用這個(gè)語(yǔ)句就可以創(chuàng)建一個(gè)具有指定名字的包,當(dāng)前.java文件中的所有類都被放在這個(gè)包中。例如下面的語(yǔ)句是合法的創(chuàng)建包的語(yǔ)句:package shape;package shape.shapeCircle;創(chuàng)建包就是在當(dāng)前文件夾下創(chuàng)建一個(gè)子文件夾,存放這個(gè)包中包含的所有類的.class文件。package shape.shapeCircle;語(yǔ)句中的符號(hào)“”代表了目錄分隔符,說明這個(gè)語(yǔ)句創(chuàng)建了兩個(gè)文件夾:第一個(gè)是當(dāng)前文件夾下的子文件夾shape;第二個(gè)是shape下的子文件夾shapeCircle,當(dāng)前包中的所有類就存放在這個(gè)文件夾里。 若源文件中未使用p
27、ackage,則該源文件中的接口和類位于Java的無(wú)名包中(無(wú)名包又稱缺省包),它們之間可以相互引用非private的數(shù)據(jù)成員或成員方法。無(wú)名包中的類不能被其他包中的類引用和復(fù)用?!臼纠绦騝5_21.java】 改寫示例程序c5_20.java,將接口與類納入包。第一步,建立5個(gè)源文件,文件的接口與類都屬于包shape。設(shè)這些文件都存入當(dāng)前文件夾d:myjava中。(1) 名為Shapes.java的文件(2) 名為Coordinates.java的文件(3) 名為Square.java的文件(4) 名為Triangle.java的文件第二步,對(duì)上面的5個(gè)文件進(jìn)行編譯。第三步,shape包的引用。使用下述命令編譯該程序: d:myjava>javac -d d:myjava c5_21.java 對(duì)其編譯時(shí),javac從環(huán)境變量CLASSPATH(類似于DOS操作系統(tǒng)中的PATH,它指明所有缺省的類字節(jié)碼文件路徑)提供的路徑去搜索名為shape的子目
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 物業(yè)財(cái)務(wù)工作總結(jié)與計(jì)劃怎么寫
- 2025學(xué)生會(huì)文藝部部長(zhǎng)工作計(jì)劃書例文
- 高中英語(yǔ)教師校本研修計(jì)劃
- 2025年四年級(jí)音樂教學(xué)計(jì)劃
- 校園環(huán)保協(xié)會(huì)工作計(jì)劃
- 工廠每天工作計(jì)劃
- 培優(yōu)輔差工作計(jì)劃總結(jié) 培優(yōu)輔差工作總結(jié)
- 2025中學(xué)工作計(jì)劃范本怎么寫
- 《復(fù)雜控制策略》課件
- 合同背書模版
- 部編小語(yǔ)必讀整本書《西游記》主要情節(jié)賞析
- 工程保修方案和措施三篇
- 新探索研究生英語(yǔ)(基礎(chǔ)級(jí))讀寫教程參考答案Language-focus
- 辦公室工作手冊(cè)
- 質(zhì)量管理體系成熟度評(píng)估表
- 污水處理廠臭氣治理方案范本
- 大型中央空調(diào)系統(tǒng)設(shè)計(jì)方案
- 血透室對(duì)深靜脈導(dǎo)管感染率高要因分析品管圈魚骨圖對(duì)策擬定
- PHP編程基礎(chǔ)與實(shí)例教程第3版PPT完整全套教學(xué)課件
- 教師跟崗培訓(xùn)個(gè)人總結(jié)匯報(bào)
- 房山項(xiàng)目物業(yè)服務(wù)費(fèi)用評(píng)估報(bào)告終板
評(píng)論
0/150
提交評(píng)論