




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、抽象类、接口与包5.5.1 抽象类 假设我们要编写一个计算矩形、三角形和圆的面积与周长的程序,若按前面所学的方式编程,我们必须定义四个类:圆类、三角形类、矩形类和使用前三个类的公共类,它们之间没有继承关系,如图5.4所示。程序写好后虽然能执行,但从程序的整体结构上看,三个类之间的许多共同属性和操作在程序中没有很好地被利用,致使重复编写代码,降低了程序的开发效率,且使出现错误的机会增加。圆类圆心座标半径计算面积计算周长三角形类底边长高计算面积计算周长矩形类长宽计算面积计算周长图5.4 具有相同特征却彼此独立的几个类仔细分析上面例子中的三个类,可以看到这三个类都要计算面积与周长,虽然公式不同但目标
2、相同。因此,我们可以为这三个类抽象出一个父类,在父类里定义圆、三角形和矩形三个类共同的数据成员及成员方法。把计算面积与周长的成员方法名放在父类给予说明,而具体的计算公式再在子类中实现。如图5.5所示。这样,我们通过父类就大概知道子类所要完成的任务,而且,这些方法还可以应用于求解平行四边形、梯形等图形的周长与面积。这种结构就是抽象类的概念。圆类圆心座标半径三角形类底边长高计算面积计算周长长宽抽象类梯形类计算面积计算周长抽象方法计算面积计算周长矩形类计算面积计算周长上、下底边长高图5.5 抽象类及其应用抽象类是它的所有子类的公共属性的集合,是包含一个或多个抽象方法的类。使用抽象类的一大优点就是可以
3、充分利用这些公共属性来提高开发和维护程序的效率。对于抽象类与抽象方法的限制如下: (1) 凡是用abstract 修饰符修饰的类被称为抽象类。凡是用abstract修饰符修饰的成员方法被称为抽象方法。 (2) 抽象类中可以有零个或多个抽象方法,也可以包含非抽象的方法。(3) 抽象类中可以没有抽象方法,但是,有抽象方法的类必须是抽象类。 (4) 对于抽象方法来说,在抽象类中只指定其方法名及其类型,而不书写其实现代码。 (5) 抽象类可以派生子类,在抽象类派生的子类中必须实现抽象类中定义的所有抽象方法。 (6) 抽象类不能创建对象,创建对象的工作由抽象类派生的子类来实现。(7) 如果父类中已有同名
4、的abstract方法,则子类中就不能再有同名的抽象方法。 (8) abstract不能与final并列修饰同一个类。 (9) abstract 不能与private ,static,final或native并列修饰同一个方法。 (10) abstract 类中不能有private的数据成员或成员方法。【示例程序c5_18.java】 抽象类应用。import java.awt.*;import java.applet. *;abstract class Shapes /定义一个抽象类Shapes public int x,y; /x、y为画图的坐标 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( ); /求图形周长的抽象方法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的运行结果5.5.2 接口 多重继承是指一个子类可以有多个直接父类,该子类可以全部或部分继承所有直接父类的数据成员及成员方法。例如,冷藏车既是一种汽车,也是一种制冷设备,所以它是汽车的子类也是制冷设备的子类。自然界中这种多继承结构到处可见。1声明接口声明接口的格式如下:修饰符 interface接口名extends 父接口名列表常量数据成员声明抽象方法声明2定义接口注意事项 定义接口要注意以下几点: (1) 接口定义用关键字interface,而不是用class。 (2) 接
11、口中定义的数据成员全是final static,即常量。 (3) 接口中没有自身的构造方法,所有成员方法都是抽象方法。 (4) 接口也具有继承性,可以通过extends关键字声明该接口的父接口。3. 类实现接口的注意事项 一个类要实现接口,即一个类要调用多个接口时,要注意以下几点: (1) 在类中,用implements关键字就可以调用接口。一个类若要调用多个接口时,可在implements后用逗号隔开多个接口的名字。 (2) 如果实现某接口的类不是abstract的抽象类,则在类的定义部分必须实现指定接口的所有抽象方法,即为所有抽象方法定义方法体,而且方法头部分应该与接口中的定义完全一致,即
12、有完全相同的返回值和参数列表。(3) 如果实现某接口的类是abstract的抽象类,则它可以不实现该接口所有的方法。(4) 接口的抽象方法的访问限制符都己指定为public,所以类在实现方法时,必须显式地使用public修饰符,否则将被系统警告为缩小了接口中定义的方法的访问控制范围。【示例程序c5_19.java】 将例c5_18.java改写为接口程序。import java.awt.*;import java.applet.*;interface Shapes/定义一个接口 abstract double getArea( ); abstract double getPerimeter(
13、);class Square implements Shapes /类要实现接口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 /类要实现接口 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 /类要实现接口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的运行结果【示例程序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); 运行结果与示例程序c5_19.java的相同。5.5.3 包与程序复用在许多场合反复使用那些早已编写好的,且经过严格测试的程序的技术被称为软件复用,在面向对象的程序设计中称为对象复用。对象复用是面向对象编程的主要优点之一,它是指同一对象在多个场合被反复使用。在Java语言中,对象是类的实例,类是创建对象的模板,对象是以类的形式体现的。因此,对象复用也就体现在类的重用上。包的作用有两个:一是划分类名空间,二是控制类之间的访问。这就需要我们注意下述两点。首先,既然包是一个类名空间,所以,同一个包中的类(包括接口)不能重名,不同包中的类可以重名。第二,类之间的访问控制是通过类修饰符来实
25、现的,若类声明修饰符为public,则表明该类不仅可供同一包中的类访问,也可以被其他包中的类访问。若类声明无修饰符,则表明该类仅供同一包中的类访问。1. 创建包 包的创建就是将源程序文件中的接口和类纳入指定的包。在一般情况下Java源程序的构成由四部分组成: (1) 一个包(package)说明语句(可选项)。其作用是将本源文件中的接口和类纳入指定包。源文件中若有包说明语句,必须是第一个语句。 (2) 若干个(import)语句(可选项)。其作用是引入本源文件中需要使用的包。 (3) 一个public的类声明。在一个源文件中只能有一个public类。(4) 若干个属于本包的类声明(可选)。包的
26、声明语句格式: package 包名;利用这个语句就可以创建一个具有指定名字的包,当前.java文件中的所有类都被放在这个包中。例如下面的语句是合法的创建包的语句:package shape;package shape.shapeCircle;创建包就是在当前文件夹下创建一个子文件夹,存放这个包中包含的所有类的.class文件。package shape.shapeCircle;语句中的符号“”代表了目录分隔符,说明这个语句创建了两个文件夹:第一个是当前文件夹下的子文件夹shape;第二个是shape下的子文件夹shapeCircle,当前包中的所有类就存放在这个文件夹里。 若源文件中未使用p
27、ackage,则该源文件中的接口和类位于Java的无名包中(无名包又称缺省包),它们之间可以相互引用非private的数据成员或成员方法。无名包中的类不能被其他包中的类引用和复用。【示例程序c5_21.java】 改写示例程序c5_20.java,将接口与类纳入包。第一步,建立5个源文件,文件的接口与类都属于包shape。设这些文件都存入当前文件夹d:myjava中。(1) 名为Shapes.java的文件(2) 名为Coordinates.java的文件(3) 名为Square.java的文件(4) 名为Triangle.java的文件第二步,对上面的5个文件进行编译。第三步,shape包的引用。使用下述命令编译该程序: d:myjava>javac -d d:myjava c5_21.java 对其编译时,javac从环境变量CLASSPATH(类似于DOS操作系统中的PATH,它指明所有缺省的类字节码文件路径)提供的路径去搜索名为shape的子目
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 山西省大同市浑源县第七中学校2024-2025学年高一下学期第三次月考 数学试题(含解析)
- 小学语文试题及答案
- 艺术课程试题及答案
- 政策变革中的利益相关者试题及答案
- 西方民主制度的短期与长期影响试题及答案
- 机电工程自动化设备识别试题及答案
- 西方政治制度与地方治理的案例研究试题及答案
- 时事热点对软件设计师的影响试题及答案
- 社区参与在政策制定中的作用试题及答案
- 机电工程综合能力提升策略及试题与答案
- 安徽省合肥市(2024年-2025年小学五年级语文)统编版质量测试(下学期)试卷及答案
- 《公路桥涵养护规范》(5120-2021)
- 新生儿重症监护室母乳使用专家共识(2024版)解读2
- DB12T 534-2014 从业人员健康检查 血清甲肝及戊肝IgM抗体阳性者复查处置规范
- 2024高考化学二轮复习不定项选择题专练2含解析
- 户外双语课程设计
- 2024渗透检测工艺规程
- 重庆市2024年中考生物试卷
- 初中生物教学课例2.3.1《植物细胞的结构和功能》课程思政核心素养教学设计及总结反思
- 2024年广州市中考语文试卷真题(含官方答案及解析)
- 2024年湖南省中考道德与法治试题卷(含答案解析)
评论
0/150
提交评论