实验5 组分接口和异常处理练习.docx
- 文档编号:7676205
- 上传时间:2023-01-25
- 格式:DOCX
- 页数:27
- 大小:53.90KB
实验5 组分接口和异常处理练习.docx
《实验5 组分接口和异常处理练习.docx》由会员分享,可在线阅读,更多相关《实验5 组分接口和异常处理练习.docx(27页珍藏版)》请在冰豆网上搜索。
实验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文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验5 组分接口和异常处理练习 实验 组分 接口 异常 处理 练习