实验5 组分接口和异常处理练习.docx

上传人:b****5 文档编号:7676205 上传时间:2023-01-25 格式:DOCX 页数:27 大小:53.90KB
下载 相关 举报
实验5 组分接口和异常处理练习.docx_第1页
第1页 / 共27页
实验5 组分接口和异常处理练习.docx_第2页
第2页 / 共27页
实验5 组分接口和异常处理练习.docx_第3页
第3页 / 共27页
实验5 组分接口和异常处理练习.docx_第4页
第4页 / 共27页
实验5 组分接口和异常处理练习.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

实验5 组分接口和异常处理练习.docx

《实验5 组分接口和异常处理练习.docx》由会员分享,可在线阅读,更多相关《实验5 组分接口和异常处理练习.docx(27页珍藏版)》请在冰豆网上搜索。

实验5 组分接口和异常处理练习.docx

实验5组分接口和异常处理练习

实验5组分、接口和异常处理练习

一.实验目的

1.通过阅读本课件的知识点和例题,理解组分、接口和异常处理的概念和用途。

2.在理解组分和接口的基础之上,试编程将实验3、4的学生成绩统计问题从以单个Student对象为单位,拓宽到以多个Student对象数组为单位,并增加按总评成绩排序功能。

3.在实验4的作业——求解一元方程根的基础上增加异常处理的功能,练习异常处理的编程方法。

二.知识点和例题

1.组分

⑴对象作为类的属性

一个类的属性除了可以是基本数据类型的变量之外,也可以是对象。

如“两点成一线”,如果点和线都是类的话,则后者应包含前者两个对象作为它的属性:

classPoint{

privateintx,y;

}

classLine{

privatePointp1,p2;

}

⑵类与类之间的关系

当一个类的属性中有一个类的对象时,我们说两个类具有has-a关系(AnobjectofLinehasanobjectofPoint),它是与继承中的is-a完全不同的一种类与类之间的关系,这点不难理解,如狗类是从犬类继承来的,因此狗类也是犬类;而牙齿是狗类身体的一个部分,因此狗类的属性应包含牙齿类的对象作为它的“组分”,由此看来,在上例中,Point类是作为Line的组分(composition)出现的。

⑶属性对象的创建

如果一个类的属性中含有对象的声明,则这些对象应当在该类的构造方法中用new进行创建,创建时可以用参数表中的参数为这些对象赋初值,例如:

classLine{

privatePointp1,p2;

Line(Pointp1,Pointp2){

this.p1=newPoint(p1);

this.p2=newPoint(p2);

}

}

⑷属性数组的创建

一个类的属性也可以是一个基本数据类型变量或一个类对象的数组,无论哪种情况,该数组都必须在定义属性时声明、在构造方法中创建,如果是对象数组的话,还需在创建数组后创建每个数组元素,例如:

classCurve{

privatePoint[]pa;//声明对象数组

Curve(Point[]pa,intn){

this.pa=newPoint[n];//创建对象数组

for(inti=0;i

this.pa[i]=newPoint(pa[i]);//创建数组元素

}

}

⑸组分实例

classPoint{//定义点类

privateintx,y;

Point(intx,inty){

this.x=x;

this.y=y;

}

Point(Pointp){

this.x=p.x;

this.y=p.y;

}

Point(){}

voidsetPoint(intx,inty){

this.x=x;

this.y=y;

}

intgetX(){returnx;}

intgetY(){returny;}

PointgetPoint(){returnthis;}

}

classLine{//定义直线类

privatePointp1,p2;

Line(Pointp1,Pointp2){

this.p1=newPoint(p1);

this.p2=newPoint(p2);

}

Line(){

this.p1=newPoint();

this.p2=newPoint();

}

voidSetLine(Pointp1,Pointp2){

this.p1=p1;

this.p2=p2;

}

PointgetP1(){returnp1;}

PointgetP2(){returnp2;}

LinegetLine(){returnthis;}

}

classCurve{//定义曲线类

privatePoint[]pa;

intn;

Curve(Point[]pa,intn){

this.pa=newPoint[n];

for(inti=0;i

this.pa[i]=newPoint(pa[i]);

this.n=n;

}

Curve(intn){

this.pa=newPoint[n];

for(inti=0;i

this.pa[i]=newPoint();

this.n=n;

}

voidSetCurve(Point[]pa,intn){

for(inti=0;i

this.pa[i].setPoint(pa[i].getX(),pa[i].getY());

this.n=n;

}

Point[]getCurve(){returnpa;}

intgetN(){returnn;}

}

publicclassUsePLC{//测试程序

publicstaticvoidmain(String[]args){

Pointp1,p2;

p1=newPoint(1,2);

System.out.print("point1=("+p1.getX()+","+p1.getY()+")\n");

p2=newPoint(3,4);

System.out.print("point2=("+p2.getX()+","+p2.getY()+")\n");

Linel=newLine(p1,p2);

System.out.print("line1=("+l.getP1().getX()+","+l.getP1().getY()+")to("

+l.getP2().getX()+","+l.getP2().getY()+")\n");

intn=4;

Point[]pa=newPoint[n];

pa[0]=newPoint(p1);

pa[1]=newPoint(p2);

pa[2]=newPoint(5,6);

pa[3]=newPoint(7,8);

Curvec=newCurve(pa,n);

System.out.print("curve=");

for(inti=0;i

System.out.print("("+c.getCurve()[i].getX()+","+c.getCurve()[i].getY()+")to");

System.out.print("("+c.getCurve()[n-1].getX()+","+c.getCurve()[n-1].getY()+")\n");

}

}

2.接口

⑴接口的概念和用途

当硬件厂商要在外设与主机之间建立一种新的接口时,必须首先定义该接口的规范(如形状、引脚数、各引脚的功能、电压、信号交换方式等)并进行文字说明,例如USB接口,无论鼠标、打印机还是优盘,当且仅当其满足了所定义的接口规范时,才能够将自己连接到计算机上。

面向对象的“接口”(interface)意义也在于此。

只不过定义的是方法的接口规范,程序员需按照该规范去实现和调用相应的方法。

⑵接口的定义和实现

接口定义与类定义相似,不同点如下:

a.接口是以关键字interface代替class来声明;

b.接口中的属性默认有publicfinalstatic修饰符,即接口中的属性全都是常量;

c.接口中的方法默认有publicabstract修饰符,即全都为公有,且为抽象,即只有声明、没有实现,主要作用是用来定义其实现和调用的规范。

接口定义的语法为:

访问权限interface接口名{

属性和方法声明

}

既然接口中的方法默认为abstract,则它们必须被其它类的方法来实现,实现接口的类在类名之后必须有“implements接口名”:

访问权限class类名implements接口名{

属性和方法定义

}

并且实现接口的方法必须为public,例如:

interfacesortable{//定义接口

booleanlessThan(sortables);

}

classPointimplementssortable{//实现接口

publicbooleanlessThan(sortables){

returnthis.x<((Point)s).x;

}

}

接口不可以被类继承,但可以被接口继承,从而当父接口中方法的实现和调用规范需要更新时,可直接在父接口之上继承一个子接口,保留原接口规范、定义新的接口规范即可,而不必从头定义一个接口,例如:

interfaceUSB1{

属性和方法声明

}

interfaceUSB2extendsUSB1{

增加的属性和方法声明

}

虽然Java不支持多继承(即一个类继承多个类),但支持一个类实现多个接口,例如:

interfaceSortable0{//比较两对象大小的方法接口

booleanlessThan(Sortable0s);

}

interfaceSortable1{//交换两对象数据的方法接口

voidswap(Sortable1s);

}

classPointimemplentsSortable0,Sortable1{//一个类实现两个接口

publicbooleanlessThan(Sortable0s){

returnthis.x<((Point)s).x;

}

publicvoidswap(Sortable1s){

inttmpX=this.x;

inttmpY=this.y;

this.x=((Point)s).x;

this.y=((Point)s).y;

((Point)s).x=tmpX;

((Point)s).y=tmpY;

}

}

⑶接口实例

//以下接口定义了2个方法的规范,它有助于实现对任意类型节点数组的排序操作

interfaceSortable{

booleanlessThan(Sortables);

voidswap(Sortables);

}

//整型节点类对Sortable的实现

classIntimplementsSortable{

privateinti;

Int(inti){

this.i=i;

}

Int(){}

voidsetInt(inti){

this.i=i;

}

intgetInt(){

returni;

}

publicbooleanlessThan(Sortables){

returnthis.i<((Int)s).i;

}

publicvoidswap(Sortables){

inttmp=this.i;

this.i=((Int)s).i;

((Int)s).i=tmp;

}

}

//双精度节点类对Sortable的实现

classDblimplementsSortable{

privatedoubled;

Dbl(doubled){

this.d=d;

}

Dbl(){}

voidsetDbl(doubled){

this.d=d;

}

doublegetDbl(){

returnd;

}

publicbooleanlessThan(Sortables){

returnthis.d<((Dbl)s).d;

}

publicvoidswap(Sortables){

doubletmp=this.d;

this.d=((Dbl)s).d;

((Dbl)s).d=tmp;

}

}

//平面坐标节点类对Sortable的实现

classPointimplementsSortable{

privateintx,y;

Point(intx,inty){

this.x=x;

this.y=y;

}

Point(Pointp){

this.x=p.x;

this.y=p.y;

}

Point(){}

voidsetPoint(intx,inty){

this.x=x;

this.y=y;

}

intgetX(){returnx;}

intgetY(){returny;}

PointgetPoint(){returnthis;}

publicbooleanlessThan(Sortables){

returnthis.x<((Point)s).x;

}

publicvoidswap(Sortables){

inttmpX=this.x;

inttmpY=this.y;

this.x=((Point)s).x;

this.y=((Point)s).y;

((Point)s).x=tmpX;

((Point)s).y=tmpY;

}

}

//对整型数组元素排序

classInts{

privateInt[]a;

intn;

Ints(Int[]a,intn){

this.a=newInt[n];

for(inti=0;i

this.a[i]=newInt(a[i].getInt());

}

this.n=n;

}

Ints(intn){

this.a=newInt[n];

for(inti=0;i

this.a[i]=newInt();

}

this.n=n;

}

voidSetInts(Int[]a,intn){

for(inti=0;i

this.a[i].setInt(a[i].getInt());

this.n=n;

}

Int[]getInts(){

returna;

}

intgetN(){

returnn;

}

voidbubbleSort(){

for(inti=n;i>1;i--){

for(intj=1;j

if(a[j-1].lessThan(a[j])){

a[j-1].swap(a[j]);

}

}

}

}

}

//对双精度数组元素排序

classDbls{

privateDbl[]a;

intn;

Dbls(Dbl[]a,intn){

this.a=newDbl[n];

for(inti=0;i

this.a[i]=newDbl(a[i].getDbl());

}

this.n=n;

}

Dbls(intn){

this.a=newDbl[n];

for(inti=0;i

this.a[i]=newDbl();

}

this.n=n;

}

voidSetDbls(Dbl[]a,intn){

for(inti=0;i

this.a[i].setDbl(a[i].getDbl());

this.n=n;

}

Dbl[]getDbls(){

returna;

}

intgetN(){

returnn;

}

voidbubbleSort(){

for(inti=n;i>1;i--){

for(intj=1;j

if(a[j-1].lessThan(a[j])){

a[j-1].swap(a[j]);

}

}

}

}

}

//对平面坐标数组元素排序

classPoints{

privatePoint[]a;

intn;

Points(Point[]a,intn){

this.a=newPoint[n];

for(inti=0;i

this.a[i]=newPoint(a[i]);

this.n=n;

}

Points(intn){

this.a=newPoint[n];

for(inti=0;i

this.a[i]=newPoint();

this.n=n;

}

voidSetPoints(Point[]a,intn){

for(inti=0;i

this.a[i].setPoint(a[i].getX(),a[i].getY());

this.n=n;

}

Point[]getPoints(){returna;}

intgetN(){returnn;}

publicvoidbubbleSort(){

for(inti=n;i>1;i--){

for(intj=1;j

if(a[j-1].lessThan(a[j]))

a[j-1].swap(a[j]);

}

}

}

}

//测试程序

publicclassUseInterface{

publicstaticvoidmain(String[]args){

intn=10;

Int[]I=newInt[n];

for(inti=0;i

I[i]=newInt(i);

}

Intsis=newInts(I,n);

for(inti=0;i

System.out.println(is.getInts()[i].getInt());

}

is.bubbleSort();

for(inti=0;i

System.out.println(is.getInts()[i].getInt());

}

Dbl[]D=newDbl[n];

for(inti=0;i

D[i]=newDbl(i);

}

Dblsds=newDbls(D,n);

for(inti=0;i

System.out.println(ds.getDbls()[i].getDbl());

}

ds.bubbleSort();

for(inti=0;i

System.out.println(ds.getDbls()[i].getDbl());

}

Point[]P=newPoint[n];

for(inti=0;i

P[i]=newPoint(i,i);

}

Pointsps=newPoints(P,n);

for(inti=0;i

System.out.println(ps.getPoints()[i].getX()+""+ps.getPoints()[i].getY());

}

ps.bubbleSort();

for(inti=0;i

System.out.println(ps.getPoints()[i].getX()+""+ps.getPoints()[i].getY());

}

ps.SetPoints(P,n);

for(inti=0;i

System.out.println(ps.getPoints()[i].getX()+""+ps.getPoints()[i].getY());

}

}

}

3.异常处理

⑴异常处理的概念

异常是指那些编程时可以预测、程序运行时可以处理的错误,例如除数为零、对负数取对数等。

C语言处理异常的办法往往是让被调函数返回一个特殊值(例如-1)、让主调函数打印错误信息并进行适当处理(退出或恢复),因此C语言的系统函数通常都是有返值函数(如printf)。

在本来就是有返值函数的情况下,则只能人为设置一些特殊值(如整数-9999、浮点数-1.e38等等)让主调函数来识别。

这种机制显然十分牵强,如下例:

#includ

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 国外设计风格

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1