实验项目二 抽象类、接口的定义与使用
Tips:"分享是快乐的源泉💧,在我的博客里,不仅有知识的海洋🌊,还有满满的正能量加持💪,快来和我一起分享这份快乐吧😊!
喜欢我的博客的话,记得点个红心❤️和小关小注哦!您的支持是我创作的动力!
一、实验目的
(1) 学会使用类的静态方法 ;
(2) 学习如何定义接口 ;
(3) 掌握接口的实现及其使用方式;
(4) 理解接口与抽象类的区别。
二、实验内容
- 定义传播媒体类Media为抽象类,其属性包括:id即书号或刊号,title即名称。方法包括:
抽象方法showInformation(),显示当前对象的属性值;
静态方法showType(),显示当前对象的类型,如“Book”或“Newspaper”。
类Book、类Newspaper都是Media的子类,Book类特有的属性包括:press即出版社,authors即作者。
在测试类中创建Book和Newspaper的对象,显示每个对象的类型,并显示每个对象的信息。
2. 设计和实现一个 Soundable 接口 , 该接口具有发声功能 , 同时还能够调节声音大小。 Soundable 接口的这些功能将会由 3 种声音设备来具体实现 , 它们分别是收音机 Radio 、随身昕 Walkman 和手机Mobilephone 。最后还要设计一个应用程序类来使用这些实现了 Soundable 接口的声音设备类。程序运行时 , 先询问用户想听哪种设备 , 然后程序就会按照该设备的工作方式来发出声音。
三、实验原理
1、类的静态方法;
2、抽象类与接口的定义与使用。
四、实验环境
电脑主机酷睿i5、内存4G以上,操作系统Windows 7以上,开发工具eclipse。
五、实验步骤
1、
2、
3、
六、实验结果
七、实验分析
1、定义传播媒体类Media为抽象类,其属性包括:id即书号或刊号,title即名称。方法包括:
抽象方法showInformation(),显示当前对象的属性值;
静态方法showType(),显示当前对象的类型,如“Book”或“Newspaper”。
类Book、类Newspaper都是Media的子类,Book类特有的属性包括:press即出版社,authors即作者。
在测试类中创建Book和Newspaper的对象,显示每个对象的类型,并显示每个对象的信息。
第1题解答如下:
创建包并分类完毕:Media为抽象类,Book与Newspaper为子类,test03为测试类:
抽象类Media代码:
子类Book代码:
子类Newspaper代码:
测试类test03代码
测试结果显示:
2、设计和实现一个 Soundable 接口 , 该接口具有发声功能 , 同时还能够调节声音大小。 Soundable 接口的这些功能将会由 3 种声音设备来具体实现 , 它们分别是收音机 Radio 、随身昕 Walkman 和手机Mobilephone 。最后还要设计一个应用程序类来使用这些实现了 Soundable 接口的声音设备类。程序运行时 , 先询问用户想听哪种设备 , 然后程序就会按照该设备的工作方式来发出声音。
第2题解答如下:
创建包并分类完毕:Soundable为接口,Radio,Walkman与Mobilephone为实现类,People为普通类,InterfaceTest为测试类:
接口Soundable的代码:
实现类Radio代码:
实现类Walkman代码:
实现类Mobilephone代码:
普通类People代码:
测试类InterfaceTest代码:
运行结果显示:
思考
- 请问在 InterfaceTest 类中 ,SoundDevice[] 数组是什么类型的 , 该数组为什么能存放 3 种不同的对象 Radio、Walkman 和 Mobilephone 呢 ?
答:SoundDevice[] 数组是接口类型,因为三个对象都实现了这个接口,因而可以调用实现了接口的实现类。
(2) 在程序中Soundable 是一个接口 , 那么该接口是否可以被实例化呢 ? 请在InterfaceTest 类的 main() 方法中加入以下语句试验一下 , 并分析结果。
Soundable Sound=new Soundable(),
答:不能被实例化,因为Soundable不是一个类,只是一个接口。
(3) 现在假定要为程序增加一个闹钟类 Clock, 该类也实现 Soundable 接口 , 能够发出滴答声 , 请将以下的 Clock 类加入到 InterfaceTest.java 程序中 , 并在 InterfaceTest 类的 main() 方法中加入 SoundDevice[3]= new Clock(); 语句。
class Clock implements Soundable{
public void Stopsound(){
System.out.println(" 关闭闹钟 ");
}
public void Playsound(){
system.out.println(" 闹钟发出滴答声 ");
}
}
修改之后 , 重新编译 InterfaceTest.java 并运行它 , 观察结果。
答:报错了,普通类需要实现所有接口的方法。
(4) 在第 (3) 小题中由于新加入的 Clock 类仅仅实现了 Soundable 接口的stopsound() 和 playsound() 方法 , 而 increaseVolume() 和 decreaseVolume() 方法没有实现 , 因此它实质上是一个抽象类 , 而抽象类是不能实例化的 , 所以导致编译错误。但是按照常理 , 闹钟的滴答声确实是不可以增大或减小的 , 那么如何解决这个问题呢 ? 现在请在 Clock 类中加入下面两个含 {} 空方法体的方法实现 , 再编译运行程序 , 看看会有什么变化。
public void increaseVolume(){}
public void decreaseVolume(){}
答:正确了,不会报错。
- 现在请模仿本实验的程序设计出一个自己的接口程序 , 要求先设计一个 moveable 可移动接口 , 然后分别设计 3 个类 , 即汽车 Car 、轮船 Ship 、飞机 Aircraft 来实现该接口 , 最后设计一个应用程序来使用它们。
解答如下:
1.创建包并分类完毕:Moveable为接口,Car,Ship与Aircraft为实现类,People为普通类,Test为测试类:
2.接口Moveable的代码:
3.实现类Car代码:
4.实现类Ship代码:
5.实现类Aircraft代码:
6.普通类People代码:
7.测试类Test代码:
8.运行结果显示:
点评 接口的特点在于只定义能做什么 , 而不定义怎么去做。在本实验中 , 收音机 Radio, 随身听 Walkman 和手机 Mobilephone 分别以自己的方式实现了 Soundable 接口 , 当接口成为 Listen(Soundable s) 方法的形参时 , 任何实现了 Soundable 接口的对象都能成为它的实参 , 如果不用接口作形参 , 那就必须写 3 个不同的方法 , 即
listenRadio(Radio r),
listenWalkman(Walkman w) ,
listenMobilephone(Mobilephone m)。