实验6继承与接口_第1页
实验6继承与接口_第2页
实验6继承与接口_第3页
实验6继承与接口_第4页
实验6继承与接口_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、山西大学计算机与信息技术学院实 验 报 告姓 名学 号专业班级课程名称Java实验实验日期成 绩指导教师批改日期实验名称实验6继承与接口实验目的1、掌握java继承中父类及其子类的定义方法。2、掌握子类重写父类同名方法的方法。3、掌握接口的用法。学习如何定义接口 ;掌握接口的实现方式;使用实现了接口的类;理解接口与抽象类的区别。实验要求1、复习理论教学中所学的内容。2、认真进行实验预习,查阅参考书,书写源程序,书写实验预习报告。3、认真总结实验并书写实验报告。实验内容1、类的继承性练习(1)程序源代码如下。public class Studentprotected String xm; /姓名

2、,具有保护修饰符的成员变量protected int xh;/学号void setdata(String xm, int xh) /设置数据的方法 this.xm=xm;this.xh=xh;public void print() /输出数据的方法 System. out .println(xm+”, +xh);class TestStudent/测试类public static void main(String args) Student s = new Student();s.setdata(小红,2010242555);s.print();Cl C:TIBD0TSEysteB32cBd.

3、 exeE: jaua23 jauac Student.JauaE: jaua23jaua StudentException in thread main1 Jaua. lang.NoSuchMethodError: mainE: jaua23 jaua TestStudent 小红-2010242555|e =(2)编译源并运行程序。贴图如下XII习必图一创建将被继承的类(1)程序功能:通过Student类产生子类CollegeStudent,其不仅具有父类的成员变量xm(姓名)、 xh (学号),还定义了新成员变量xy (学院)、bj(bj)。在程序中调用了父类的print方法, 同时可以

4、看出子类也具有该方法。程序代码public class CollegeStudent extends Studentprotected String xy;protected int bj;void setdata(String xm, int xh,String xy, int bj)super.setdata(xm, xh);this.xy = xy;this.bj = bj;public void print() super.print();System. out.print(学院:+xy+班级:+bj);class TestCollegeStudentpublic static voi

5、d main(String args) CollegeStudent cs = new CollegeStudent();cs.setdata( 小蓝,2010242555, 计算机学院,1);cs.print();运行结果贴图:-Ini x|两 C : WlffD0T5sy5teB3ZcBd. exeE:java23Javac ColleseStudent. J-avaE:Xjaua23jaua TestCollegeStudent气蓝,2S1S242555阵院:计算机学院班级:1E: jaua23_I 山图二了解成员方法的覆盖方式(1)编写覆盖了Object类toString方法的一个类,

6、并用System.out.println()输出该类的一个 对象。程序代码:public class OverWriteToString private String str;public OverWriteToString()public OverWriteToString(String str) this. str = str;public String ToString()return super.toString()+n+str;public static void main(String args) OverWriteToString o = new OverWriteToStrin

7、g(This is a method+to overwrite ToString method!);System. out.println(o.ToString();运行结果贴图:图三(2)试着以Point类为例,尝试为Object类的clone()和equals()方法进行覆盖,Point类包含私有成员x,y,构造方法1 (包含两个参数a,b),构造方法2 (参数为Point p), clone方法,equals 方法,toString方法。用TestPoint类进行测试。程序代码:public class Point private int x;private int y;public P

8、oint()public Point(int a, int b)x = a;y = b;public Point(Point p)x = p.x;y = p.y;/重写equals()方法public boolean equals(Object o)if(o instanceof Point)return (x=(Point)o).x & y=(Point)o).y);elsereturn false;/重写toString()方法public String toString()return super.toString()+n该点的坐标为(+x+, +y+);/重写clone()方法publ

9、ic Object clone() throws CloneNotSupportedException return new Point(this);class TestPointpublic static void main(String args) throws CloneNotSupportedException Point p = new Point(2,3);Point p1= new Point(p);Point p2 = (Point)p.clone();System. out.println(p与pl相等吗? +p.equals(pl);System. out.println(

10、p与p2相等吗? +p.equals(p2);System. out.println(p);System. out.println(pl);System. out.println(p2);运行结果贴图:画i命咨提示符制回H : jaua22jaudc Point-jauaH : jaua22jaud TestPoint b与Pl阳茬吗? true 卜金2湄等吗true Po intyicWecW 含点的里标为(2,3Po int(?ecb281 胃点的巫标为(2-3 Pu iiiieiLlj60u3 含点的坐标为A3H : jaua22-图四this、super和super ()的使用程序功能

11、:说明this、super和super()的用法。程序首先定义Point (点)类,然后创建点 的子类Line(线)。最后通过TestLine类输出线段的长度。程序中通过super(a,b)调用父类 Point的构造方法为父类的x和y赋值。在子类Line的setLine方法中,因为参数名和成员 变量名相同,为给成员变量赋值,使用this引用,告诉编译器是为当前类的成员变量赋值。 在length和toString方法中使用父类成员变量时,使用super引用,告诉编译器使用的是 父类的成员变量。程序代码:public class Line extends Pointprivate Point p1

12、;private Point p2;public Line()super (5,5);public Line(int x1, int y1, int x2, int y2)super (5,5);p1 = new Point(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()retur

13、n 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 TestLinepublic static void main(String args) Point p1 = new Point();Point p2 = new Point(3,4);Line l = new Line(p1,p2);System. out.println(

14、线l的长度为:+l.legth();System. out.println(l);运行结果贴图:图五接口的实现与运用实验任务:本实验的任务是设计和实现一个Soundable接口,该接口具有发声功能,同时还能够调节声 音大小。Soundable接口的这些功能将会由3种声音设备来具体实现,它们分别是收音机 Radio、随身昕Walkman和手机Mobilephone。最后还要设计一个应用程序类来使用这些实现了 Soundable接口的声音设备类。程序运行时,先询问用户想听哪种设备,然后程序就会按照该设备 的工作方式来发出声音。实验步骤:仔细阅读程序,并完成其中的代码广代码3。/ Interface

15、Test.javaimport java.util.*;interface Soundablepublic void increaseVolume();public void decreaseVolume();public void stopSound();public void playSound();class Radio implements Soundablepublic void increaseVolume() System. out.println(增大收音机音量);public void decreaseVolume() System. out.println(减小收音机音量)

16、;public void stopSound() System. out.println(关闭收音机);public void playSound() System. out.println(收音机播放广播);class Walkman implements Soundablepublic void increaseVolume() System. out.println(增大随声听音量);public void decreaseVolume() System. out.println(减小随声听音量);public void stopSound() System. out.println(关

17、闭随声听);public void playSound() System. out.println(随声听播放音乐);class MobilePhone implements Soundablepublic void increaseVolume() System. out.println(增大手机音量);public void decreaseVolume() System. out.println(减小手机音量);public void stopSound() System. out.println(关闭手机);public void playSound() System. out.pri

18、ntln(手机播放铃声);class Peopleprivate String name;private int age;public void Listen(Soundable s) s.playSound();public class InterfaceTest public static void main(String args) int i ;People sportsman = new People();Scanner input = new Scanner(System. in);Soundable soundDevice = new Soundable3;soundDevice

19、0 = new Radio();soundDevice1 = new Walkman();soundDevice2 = new MobilePhone();System. out.println(你想听什么?请输入选择(0收音机,1随声听,2手机):);i = input.nextInt();sportsman.Listen(soundDevicei);soundDevicei.increaseVolume();soundDevicei.stopSound();打开文本编辑器编辑InterfaceTest.java并保存,然后在Eclipse环境中进行编译, 编译的结果将会产生6个class文

20、件,其中包括Soundable.class,虽然Soundable本身是一 个接口,但编译之后也会产生class文件。编译之后运行这个程序,观察所得结果。画命令提示符【旧XjauaZZjaua InterfaceTest 想呻什么?请(0收音机,1随声听,2手机):乐量 音音 遗尸声 声大闭天图六思考请问在InterfaceTest类中,SoundDevice数组是什么类型的,该数组为什么能存放 3 种不同的对象 Radio、Walkman 和 Mobilephone 呢?答:SoundDevice数组是接口类型;因为类Radio、Walkman和Mobilephone都实现了接口 Sound

21、Device,则接口SoundDevice就类似于这三个类的父类,而父类的引用可以指向一个子类的对象, 所以该数组可以存放三个不同的对象。在程序中,Soundable是一个接口 ,那么该接口是否可以被实例化呢?请在InterfaceTest类的main()方法中加入以下语句试验一下,并分析结果。Soundable Sound=new Soundable(),图七答:不可以。因为接口和抽象类相似,可以声明引用类型的变量,但不可使用iew操作符创建接 口的实例对象。现在假定要为程序增加一个闹钟类Clock,该类也实现Soundable接口,能够发出滴答 声,请将以下的 Clock类加入到Inter

22、faceTest.java程序中,并在InterfaceTest类的 main()方法中加入 SoundDevice3 = new Clock();语句。class Clock implements Soundablepublic void stopSound() System. out.println(关闭闹钟);public void playSound() System. out.println(闹钟发出滴答声);修改之后,重新编译InterfaceTest.java并运行它,观察结果。图八在第(3)小题中由于新加入的Clock类仅仅实现了 Soundable接口的stopsound()

23、和 playsound()方法,而increaseVolume()和decreaseVolume()方法没有实现,因此它实质上 是一个抽象类,而抽象类是不能实例化的,所以导致编译错误。但是按照常理,闹钟的滴答声确 实是不可以增大或减小的,那么如何解决这个问题呢?现在请在Clock类中加入下面两个含空方法体的方法实现,再编译运行程序,看看会有什么变化。public void increaseVolume()public void decreaseVolume()图九现在请模仿本实验的程序设计出一个自己的接口程序,要求先设计一个moveable可移动 接口,然后分别设计3个类,即汽车Car、轮船S

24、hip、飞机Aircraft来实现该接口,最后 设计一个应用程序来使用它们。程序代码:import java.util.*;interface Moveablepublic abstract void move();class Car implements Moveablepublic void move() System. out.println(汽车行驶);class Ship implements Moveablepublic void move()System. out.println(轮船航行);class Aircraft implements Moveablepublic voi

25、d move()System. out.println(飞机飞行);public class TestMoveable public static void main(String args) Scanner input = new Scanner(System. in);Moveable moveDevice = new Moveable3;moveDevice0 = new Car();moveDevice1 = new Ship();moveDevice2 = new Aircraft();System. out.println(您想乘坐什么?请输入选择(0汽车,1轮船,2飞机):);i

26、nt i = input.nextInt();Moveable m = moveDevicei;m.move();input.close();运行结果贴图:Radi成为Listen(Soundable s)方法的形参时,任何实现了 Soundable接口的对象都能成为它的实 参,如果不用接口作形参,那就必须写3个不同的方法,即listenRadio(Radio r),listenWalkman(Walkman w),listenMobilephone(Mobilephone m)。课后作业题:图a的输出结果:体现了构造方法链需参数,且使用关键于super调用乂关方法;p题111class B

27、extends A public B(int x) super(x);public class C public static void main(String args) B b = new B(2);代码错误:1.构造方法初始化类数据域时,由于参数名与数据域名相同,故数据域在构造方法 中被隐藏,使用时应用关键字this来引用;父类的构造方法是不被子类继承的,只能在子类的构造方法中使用关键字super调 用;调用父类中被覆盖的方法应使用关键字super来应用。解决方法:public class Circle private double radius;public Circle(double

28、 radius)this.radius = radius;public double getRadius()return radius;public double getArea()return radius*radius*Math.PI;class B extends Circleprivate double length;B(double radius, double length)super (radius);this.length = length;public double getArea()return super.getArea()*length;class TestCircle

29、public static void main(String args) B b = new B(2,3);System. out.println(半径为:+b.getRadius();System. out.println(面积为:+b.getArea();题11.如题 11.7类调用被覆盖|=使用关键于super疤用。01父法B如果子类中的一个方法具有和它父类中的方法完全相同的方法头,且返回值类型也相同,那么这是 方法的覆盖。题11.9如果子类中的一个方法具有和它父类中的方法相同的名字,但参数类型不同,那么这是方法的重载。题 11.13true(2)false (3) true(4)true(5)false (6) true(7)true(8)false如果makeAppleCider()方法定义在Apple类中,fruit强制类型转换为Apple后可以调用这个方 法,orange不可调用。如果makeOrangeJuice()方法定义在Orange类中,orange可以直接调用这个方法,fruit强制 类型转换为Orange后可以调用。不合法 (12)不合法(13)合法题 11.15图a输出:class Circle_0 double radius;publ

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论