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

下载本文档

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

文档简介

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

2、ent protected String xm; /姓名,具有保护修饰符的成员变量 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("小

3、红", 2010242555);s.print(); (2) 编译源并运行程序。贴图如下图一(二)创建将被继承的类(1) 程序功能:通过Student类产生子类CollegeStudent,其不仅具有父类的成员变量xm(姓名)、xh(学号),还定义了新成员变量xy(学院)、bj(bj)。在程序中调用了父类的print 方法,同时可以看出子类也具有该方法。程序代码:public class CollegeStudent extends Student protected String xy; protected int bj; void setdata(String xm,int xh

4、,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 TestCollegeStudent public static void main(String args) CollegeStudent cs = new CollegeStudent();cs.setdata("小蓝", 201024255

5、5, "计算机学院", 1);cs.print(); 运行结果贴图:图二(三)了解成员方法的覆盖方式(1) 编写覆盖了Object 类toString方法的一个类,并用System.out.println()输出该类的一个对象。程序代码:public class OverWriteToString private String str; public OverWriteToString() public OverWriteToString(String str)this.str = str; public String ToString() return super.toS

6、tring()+"n"+str; public static void main(String args) OverWriteToString o = new OverWriteToString("This is a method " +"to overwrite ToString method!");System.out.println(o.ToString(); 运行结果贴图:图三(2) 试着以Point类为例,尝试为Object类的clone()和equals()方法进行覆盖,Point类包含私有成员x,y,构造方法1(包含两个

7、参数a,b),构造方法2(参数为Point p),clone方法,equals方法,toString方法。用TestPoint类进行测试。程序代码:public class Point private int x; private int y; public Point() 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)

8、o).x && y=(Point)o).y); else return false; /重写toString()方法 public String toString() return super.toString()+"n该点的坐标为("+x+","+y+")" /重写clone()方法 public Object clone() throws CloneNotSupportedException return new Point(this); class TestPointpublic static void main

9、(String args) throws CloneNotSupportedException Point p = new Point(2,3); Point p1= new Point(p); Point p2 = (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

10、(p2); 运行结果贴图:图四(四)this、super和super()的使用(1) 程序功能:说明this、super 和super()的用法。程序首先定义Point(点)类,然后创建点的子类Line(线)。最后通过TestLine类输出线段的长度。程序中通过super(a,b)调用父类Point 的构造方法为父类的x 和y 赋值。在子类Line 的setLine方法中,因为参数名和成员变量名相同,为给成员变量赋值,使用this 引用,告诉编译器是为当前类的成员变量赋值。在length 和toString 方法中使用父类成员变量时,使用super 引用,告诉编译器使用的是父类的成员变量。程序

11、代码:public class Line extends Point private Point p1; 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

12、) 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 publi

13、c 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 种声音设备来具体实现 , 它

14、们分别是收音机 Radio 、随身昕 Walkman 和手机 Mobilephone 。最后还要设计一个应用程序类来使用这些实现了 Soundable 接口的声音设备类。程序运行时 , 先询问用户想听哪种设备 , 然后程序就会按照该设备的工作方式来发出声音。实验步骤 :(1) 仔细阅读程序, 并完成其中的代码1代码3。/ InterfaceTest.javaimport java.util.*;interface Soundablepublic void increaseVolume();public void decreaseVolume();public void stopSound();

15、public void playSound();class Radio implements Soundablepublic void increaseVolume() System.out.println("增大收音机音量");public void decreaseVolume() System.out.println("减小收音机音量");public void stopSound() System.out.println("关闭收音机");public void playSound() System.out.println(&

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

17、ot;随声听播放音乐");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.println(&quo

18、t;手机播放铃声");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;soundDevi

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

20、中进行编译 , 编译的结果将会产生 6 个 class 文件 , 其中包括 Soundable.class, 虽然 Soundable 本身是一个接口 , 但编译之后也会产生 class 文件。(3) 编译之后运行这个程序 , 观察所得结果。图六思考(1) 请问在 InterfaceTest 类中 ,SoundDevice 数组是什么类型的 , 该数组为什么能存放 3 种不同的对象 Radio、Walkman 和 Mobilephone 呢 ? 答 :SoundDevice数组是接口类型;因为类Radio、Walkman和Mobilephone都实现了接口SoundDevice,则接口Soun

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

22、 类加入到 InterfaceTest.java 程序中 , 并在 InterfaceTest 类的 main() 方法中加入 SoundDevice3 = new Clock(); 语句。class Clock implements Soundablepublic void stopSound() System.out.println("关闭闹钟");public void playSound() System.out.println("闹钟发出滴答声");修改之后 , 重新编译 InterfaceTest.java 并运行它 , 观察结果。图八(4)

23、 在第 (3) 小题中由于新加入的 Clock 类仅仅实现了 Soundable 接口的stopsound() 和 playsound() 方法 , 而 increaseVolume() 和 decreaseVolume() 方法没有实现 , 因此它实质上是一个抽象类 , 而抽象类是不能实例化的 , 所以导致编译错误。但是按照常理 , 闹钟的滴答声确实是不可以增大或减小的 , 那么如何解决这个问题呢 ? 现在请在 Clock 类中加入下面两个含 空方法体的方法实现 , 再编译运行程序 , 看看会有什么变化。public void increaseVolume()public void decr

24、easeVolume()图九(5) 现在请模仿本实验的程序设计出一个自己的接口程序 , 要求先设计一个 moveable 可移动接口 , 然后分别设计 3 个类 , 即汽车 Car 、轮船 Ship 、飞机 Aircraft 来实现该接口 , 最后设计一个应用程序来使用它们。程序代码:import java.util.*;interface Moveablepublic abstract void move();class Car implements Moveablepublic void move() System.out.println("汽车行驶");class S

25、hip implements Moveablepublic void move() System.out.println("轮船航行");class Aircraft implements Moveable public void move()System.out.println("飞机飞行"); public class TestMoveable public static void main(String args) Scanner input = new Scanner(System.in);Moveable moveDevice = new Mo

26、veable3;moveDevice0 = new Car();moveDevice1 = new Ship();moveDevice2 = new Aircraft(); System.out.println("您想乘坐什么?请输入选择(0汽车,1轮船,2飞机):");int i = input.nextInt();Moveable m = moveDevicei;m.move();input.close();运行结果贴图:图十实验分析:接口的特点在于只定义能做什么 , 而不定义怎么去做。在本实验中 , 收音机 Radio, 随身听 Walkman 和手机 Mobilep

27、hone 分别以自己的方式实现了 Soundable 接口 , 当接口成为 Listen(Soundable s) 方法的形参时 , 任何实现了 Soundable 接口的对象都能成为它的实参 , 如果不用接口作形参 , 那就必须写 3 个不同的方法 , 即listenRadio(Radio r),listenWalkman(Walkman w) ,listenMobilephone(Mobilephone m)。课后作业题:题11.1 图a的输出结果: 体现了构造方法链图十一图b编译问题: 父类构造方法并未被子类继承,当父类构造方法带形参时,在子类构造方法中应显示传递父类构造方法所需参数,且

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

29、应用。解决方法:public class Circle private double radius; public Circle(double radius)this.radius = radius; public double getRadius()return radius; public double getArea()return radius*radius*Math.PI; class B extends Circle private double length; B(double radius,double length) super(radius); this.length =

30、length; public double getArea() return super.getArea()*length; class TestCirclepublic static void main(String args) B b = new B(2,3);System.out.println("半径为:"+b.getRadius();System.out.println("面积为:"+b.getArea();图十三题11.5如何在子类调用被覆盖的父类方法: 使用关键字super调用。题11.7 如果子类中的一个方法具有和它父类中的方法完全相同的

31、方法头,且返回值类型也相同,那么这是方法的覆盖。题11.9 如果子类中的一个方法具有和它父类中的方法相同的名字,但参数类型不同,那么这是方法的重载。题11.13 (1)true (2)false (3)true (4)true (5)false (6)true (7)true (8)false (9)如果makeAppleCider()方法定义在Apple类中,fruit强制类型转换为Apple后可以调用这个方法,orange不可调用。 (10)如果makeOrangeJuice()方法定义在Orange类中,orange可以直接调用这个方法,fruit强制类型转换为Orange后可以调用。 (11)不合法 (12)不合法 (13)合法题11.15图a输出:class Circle_0 double radius; public boolean equals(Circle

温馨提示

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

评论

0/150

提交评论