版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
山西大学计算机与信息技术学院实验报告姓名学号专业班级课程名称Java实验实验日期成绩指导教师批改日期实验名称实验6继承与接口[实验目的]1、掌握java继承中父类及其子类的定义方法。2、掌握子类重写父类同名方法的方法。3、掌握接口的用法。(1)学习如何定义接口;(2)掌握接口的实现方式;(3)使用实现了接口的类;(4)理解接口与抽象类的区别。[实验要求]复习理论教学中所学的内容。认真进行实验预习,查阅参考书,书写源程序,书写实验预习报告。认真总结实验并书写实验报告。[实验内容]类的继承性练习(1)程序源代码如下。publicclassStudent{protectedStringxm;//姓名,具有保护修饰符的成员变量protectedintxh;//学号voidsetdata(Stringxm,intxh)//设置数据的方法{this.xm=xm; this.xh=xh;}publicvoidprint()//输出数据的方法{System.out.println(xm+","+xh);}}classTestStudent{//测试类publicstaticvoidmain(String[]args){Students=newStudent();s.setdata("小胖",2012242025);s.print();}}(2)编译源并运行程序。贴图如下(二)创建将被继承的类(1)程序功能:通过Student类产生子类CollegeStudent,其不仅具有父类的成员变量xm(姓名)、xh(学号),还定义了新成员变量xy(学院)、bj(bj)。在程序中调用了父类的print方法,同时可以看出子类也具有该方法。程序代码:publicclassCollegeStudentextendsStudent{protectedStringxy;protectedintbj;voidsetdata(Stringxm,intxh,Stringxy,intbj){super.setdata(xm,xh);this.xy=xy;this.bj=bj;}publicvoidprint(){super.print();System.out.print("学院:"+xy+"班级:"+bj);}}classTestCollegeStudent{publicstaticvoidmain(String[]args){CollegeStudentcs=newCollegeStudent();cs.setdata("小胖",2012242025,"计算机学院",1);cs.print();}}运行结果贴图:(三)了解成员方法的覆盖方式编写覆盖了Object类toString方法的一个类,并用System.out.println()输出该类的一个对象。程序代码:publicclassOverWriteToString{privateStringstr;publicOverWriteToString(){}publicOverWriteToString(Stringstr){this.str=str;}publicStringToString(){returnsuper.toString()+"\n"+str;}publicstaticvoidmain(String[]args){OverWriteToStringo=newOverWriteToString("Thisisamethod"+"tooverwriteToStringmethod!");System.out.println(o.ToString());}}运行结果贴图:试着以Point类为例,尝试为Object类的clone()和equals()方法进行覆盖,Point类包含私有成员x,y,构造方法1(包含两个参数a,b),构造方法2(参数为Pointp),clone方法,equals方法,toString方法。用TestPoint类进行测试。程序代码:publicclassPoint{privateintx;privateinty;publicPoint(){}publicPoint(inta,intb){x=a;y=b;}publicPoint(Pointp){x=p.x;y=p.y;}//重写equals()方法publicbooleanequals(Objecto){if(oinstanceofPoint){return(x==((Point)o).x&&y==((Point)o).y);}elsereturnfalse;}//重写toString()方法publicStringtoString(){returnsuper.toString()+"\n该点的坐标为("+x+","+y+")";}//重写clone()方法publicObjectclone()throwsCloneNotSupportedException{returnnewPoint(this);}}classTestPoint{publicstaticvoidmain(String[]args)throwsCloneNotSupportedException{Pointp=newPoint(2,3);Pointp1=newPoint(p);Pointp2=(Point)p.clone();System.out.println("p与p1相等吗?"+p.equals(p1));System.out.println("p与p2相等吗?"+p.equals(p2));System.out.println(p);System.out.println(p1);System.out.println(p2);}}运行结果贴图:(四)this、super和super()的使用程序功能:程序功能:说明this、super和super()的用法。程序首先定义Point(点)类,然后创建点的子类Line(线)。最后通过TestLine类输出线段的长度。程序中通过super(a,b)调用父类Point的构造方法为父类的x和y赋值。在子类Line的setLine方法中,因为参数名和成员变量名相同,为给成员变量赋值,使用this引用,告诉编译器是为当前类的成员变量赋值。在length和toString方法中使用父类成员变量时,使用super引用,告诉编译器使用的是父类的成员变量。程序代码:public
class
Line
extends
Point{
private
Point
p1;
private
Point
p2;
publicLine(){
super(5,5);
}
public
Line(int
x1,int
y1,int
x2,int
y2){
super(5,5);
p1
=
newPoint(x1,y1);
p2
=
new
Point(x2,y2);
}
public
Line(Point
p1,Point
p2){
super(5,5);
this.p1
=
p1;
this.p2
=
p2;
}
public
void
setLine(Point
p1,Point
p2){
this.p1
=
p1;
this.p2
=
p2;
}
public
double
legth(){
return
Math.sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
}
public
String
toString(){
return
super.toString()+"\n该线起点为:("+p1.x+","+p1.y+")"
+"终点为:("+p2.x+","+p2.y+")";
}
}
class
TestLine{
public
static
void
main(String[]
args)
{
Point
p1
=
new
Point();
Point
p2
=
new
Point(3,4);
Line
l
=
new
Line(p1,p2);
System.out.println("线l的长度为:"+l.legth());
System.out.println(l);
}
}运行结果贴图:(五)接口的实现与运用实验任务:本实验的任务是设计和实现一个Soundable接口,该接口具有发声功能,同时还能够调节声音大小。Soundable接口的这些功能将会由3种声音设备来具体实现,它们分别是收音机Radio、随身昕Walkman和手机Mobilephone。最后还要设计一个应用程序类来使用这些实现了Soundable接口的声音设备类。程序运行时,先询问用户想听哪种设备,然后程序就会按照该设备的工作方式来发出声音。实验步骤:(1)仔细阅读程序,并完成其中的代码1~代码3。//InterfaceTest.javaimportjava.util.Scanner;interfaceSoundable{publicvoidincreaseVolume();publicvoiddecreaseVolume();publicvoidstopSound();publicvoidplaySound();}classRadioimplementsSoundable{publicvoidincreaseVolume(){ System.out.println("增大收音机音量");}publicvoiddecreaseVolume(){ System.out.println("减小收音机音量");}publicvoidstopSound(){ System.out.println("关闭收音机");}publicvoidplaySound(){ System.out.println("收音机播放广播");}}classWalkmanimplementsSoundable{publicvoidincreaseVolume(){ System.out.println("增大随声听音量");}publicvoiddecreaseVolume(){ 代码1//输出减小随声听音量}publicvoidstopSound(){ System.out.println("关闭随声听");}publicvoidplaySound(){ System.out.println("随声听发出音乐");}}classMobilephoneimplementsSoundable{publicvoidincreaseVolume(){ System.out.println("增大手机音量");}publicvoiddecreaseVolume(){ System.out.println("减小手机音量");}publicvoidstopSound(){ System.out.println("关闭手机");}publicvoidplaySound(){ System.out.println("手机发出来电铃声");}}classPeople{privateStringname;privateintage;publicvoidlisten(Soundables){ s.playSound();}}publicclassInterfaceTest{publicstaticvoidmain(String[]args){ inti; Peoplesportsman=newPeople();Scannerscanner=newScanner(System.in); Soundable[]soundDevice=newSoundable[3];//往声音设备数组中放入能发声的设备 soundDevice[0]=newRadio(); soundDevice[1]=newWalkman(); 代码2//创建手机对象并赋值给soundDevice[2] System.out.println("你想听什么?请输入选择:0-收音机1-随声听2-手机");i=scanner.nextInt(); //开始听声音 sportsman.listen(soundDevice[i]); soundDevice[i].increaseVolume(); 代码3//调用stopSound()方法}}(2)打开文本编辑器编辑InterfaceTest.java并保存,然后在Eclipse环境中进行编译,编译的结果将会产生6个class文件,其中包括Soundable.class,虽然Soundable本身是一个接口,但编译之后也会产生class文件。 (3)编译之后运行这个程序,观察所得结果。 思考 (1)请问在InterfaceTest类中,SoundDevice[]数组是什么类型的,该数组为什么能存放3种不同的对象Radio、Walkman和Mobilephone呢?答SoundDevice[]数组是接口类型;因为类Radio、Walkman和Mobilephone都实现了接口SoundDevice,则接口SoundDevice就类似于这三个类的父类,而父类的引用可以指向一个子类的对象,所以该数组可以存放三个不同的对象。 (2)在程序中,Soundable是一个接口,那么该接口是否可以被实例化呢?请在InterfaceTest类的main()方法中加入以下语句试验一下,并分析结果。SoundableSound=newSoundable(),答不可以。因为接口和抽象类相似,可以声明引用类型的变量,但不可使用new操作符创建接口的实例对象。 (3)现在假定要为程序增加一个闹钟类Clock,该类也实现Soundable接口,能够发出滴答声,请将以下的Clock类加入到InterfaceTest.java程序中,并在InterfaceTest类的main()方法中加入SoundDevice[3]newClock();语句。classClockimplementsSoundable{ publicvoidStopsound(){ System.out.println("关闭闹钟");}publicvoidPlaysound(){ system.out.println("闹钟发出滴答声");}}修改之后,重新编译InterfaceTest.java并运行它,观察结果。(4)在第(3)小题中由于新加入的Clock类仅仅实现了Soundable接口的stopsound()和playsound()方法,而increaseVolume()和decreaseVolume()方法没有实现,因此它实质上是一个抽象类,而抽象类是不能实例化的,所以导致编译错误。但是按照常理,闹钟的滴答声确实是不可以增大或减小的,那么如何解决这个问题呢?现在请在Clock类中加入下面两个含{}空方法体的方法实现,再编译运行程序,看看会有什么变化。publicvoidincreaseVolume(){}publicvoiddecreaseVolume(){}答(5)现在请模仿本实验的程序设计出一个自己的接口程序,要求先设计一个moveable可移动接口,然后分别设计3个类,即汽车Car、轮船Ship、飞机Aircraft来实现该接口,最后设计一个应用程序来使用它们。程序代码:importjava.util.*;interfaceMoveable{publicabstractvoidmove();}classCarimplementsMoveable{publicvoidmove(){System.out.println("汽车行驶");}}classShipimplementsM
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024园林绿化工程土壤改良与植保服务合同
- 2024热量表购销合同范文
- 2024年度城市基础设施建设与运营合同
- 2024年二手房定金合同示范文本
- 2024年度物流运输合同运输方式与时间安排
- 师说课文课件教学课件
- 2024年冷鲜电商物流配送服务合同
- 2024年度研发技术转让合同
- 2024年度建筑工程安全生产管理合同
- 2024年度BIM模型数据共享与交换合同
- 肠梗阻护理和查房课件
- 苏教版数学二年级上册《观察物体》课件(合肥市公开课)
- 八年级历史上册材料题汇编
- 厂房压缩空气管道安装工程施工方案设计
- C#50个经典小程序(新手必备)
- 高分子物理chapter7粘弹性
- 通信工程专业英语论文
- 智能化系统安装调试测试验收的方案说明
- 工程数量控制管理办法
- 3,4-二氯苯胺的理化性质及危险特性表
- 港口危险货物版安全管理人员部分机考试题综述
评论
0/150
提交评论