一、实验目的
★专题:继承基础和面向抽象编程★
1、掌握继承的使用。
2、掌握Object类的基本用法。
3、理解和掌握抽象类的用法。
4、理解final关键字。
5、掌握和理解多态的运用。
★专题:接口基础和面向接口编程★
1、掌握接口的使用。
2、掌握和理解接口实现多态的运用。
3、理解和掌握匿名类的用法。
4、初步了解JDK8新特性和lambda表达式。
二、实验内容和主要步骤
★专题:继承基础和面向抽象编程★
- 继承基础实验
- Object类使用
- 抽象类和抽象方法
- 继承机制实现的多态
★专题:接口基础和面向接口编程★
- 接口基础
- 接口机制的多态基础
- 面向接口编程
- 匿名类
- [选做]函数式接口和lambda表达式
三、实验结论和思考
1、问题:开发一个应用,模拟计算机对移动存储设备的读写,即移动存储设备有U盘、手机卡、移动硬盘、闪卡等设备。
作答要求:
(1)概要描述你采用何种方法来模拟该应用。采用该方案的理由是什么?
答:采用面向接口编程来模拟,通过编写接口去抽象设计数据的读与写方法,再编写不同设备的实现类去重写接口方法,节省代码。最后设计和编写计算机类,模拟调用具有数据交换的外部设备:u盘、手机卡等,当需要再增添设备时,只需添加实现类去重写接口的读写方法,再在计算机类中调用即可,减少代码冗杂度,使得代码的实现更加灵活。
(2)在下面粘贴实现的各代码文件内容。注意标示和用文字描述清楚。
答:
import static java.lang.System.out;
interface IExtDevice{//读写设备接口
void read();//读取数据
void write();//写入数据
}
class UDisk implements IExtDevice{//U盘
@Override
public void read() {
out.println("读U盘...End");
}
@Override
public void write() {
out.println("写入U盘...End");
}
}
class SIMCard implements IExtDevice{//手机卡
@Override
public void read() {
out.println("读手机卡...End");
}
@Override
public void write() {
out.println("写入手机卡...End");
}
}
class MobileHDD implements IExtDevice{//移动硬盘
@Override
public void read() {
out.println("读移动硬盘...End");
}
@Override
public void write() {
out.println("写入移动硬盘...End");
}
}
class FlashCard implements IExtDevice{//闪卡
@Override
public void read() {
out.println("读闪卡...End");
}
@Override
public void write() {
out.println("写入闪卡...End");
}
}
class Mycomputer{//计算机
private IExtDevice extDev;//插入的读写设备
IExtDevice getExtDev() {
return extDev;
}
public void setExtDev(IExtDevice extDev) {
this.extDev=extDev;
}
//调用所插设备的读写方法来完成实际的读写数据
public void readDate() {
extDev.read();
}
public void writeDate() {
extDev.write();
}
}
public class APPTest {
public static void main(String[] arg) {
Mycomputer computer=new Mycomputer();
IExtDevice UDisk=new UDisk();//一个U盘
IExtDevice SIMCard=new SIMCard();//一张手机卡
IExtDevice MobileHDD=new MobileHDD();//一块移动硬盘
IExtDevice FalshCard=new FlashCard();//一张闪卡
out.println("***接入u盘");
computer.setExtDev(UDisk);
computer.readDate();
computer.writeDate();
out.println("==========");
out.println("***接入手机卡");
computer.setExtDev(SIMCard);
computer.readDate();
computer.writeDate();
out.println("==========");
out.println("***接入移动硬盘");
computer.setExtDev(MobileHDD);
computer.readDate();
computer.writeDate();
out.println("==========");
out.println("***接入闪卡");
computer.setExtDev(FalshCard);
computer.readDate();
computer.writeDate();
out.println("==========");
}
}
(3)给出部分模拟执行的截图(至少2张)。
答:
2、程序评价和改进。
问题背景:编程模拟和表达老虎Tiger和猫咪Cat等具体种类的生物都是一种动物。即它们都具有共同的名字属性name和运动行为run,只不过具体的名字叫法不同,运动行为的具体方式也不同。比如Tiger可以叫“一只东北虎”等,它是“在森林里猎物”,Cat可以叫“一只宠物猫”,它是“在沙发上卖萌”。为简单起见,模拟程序系统暂时只考虑运动行为run,将来该模拟程序系统可能还要扩展支持更多动物的特征。
版本0.9:下面是一个实现,暂且称为v0.9。
问题:请用面向对象思想和技术简单评价该版本的程序实现,并给出一个你认为更好的实现。
作答要求:
(1)用面向对象思想和技术简单评价版本0.9的程序实现,指出其不足。
答:通过建立两个类Tiger和Cat,各自定义了局部变量name和run()方法,后编写公有测试类AnimalTest去新建Tiger对象和Cat对象去调用run()方法,实现功能。不足:当添加的动物对象够多时,就得再新建很多个类,新建多个构造方法去标示name,以及多个run()方法,提高了代码的冗杂度。
(2)把你的改进版本实现的代码有条理的粘贴到下面。
答:
import static java.lang.System.*;
abstract class Animal {
public abstract String run();
}
class Cat extends Animal{
public String run(){
return ("一只猫在沙发上卖萌");
}
}
class Tiger extends Animal{
public String run(){
return ("一只东北虎在森林里猎食\n" );
}
}
public class AnimalTest {
public static void main(String[] args) {
Animal animal1=new Cat();
out.println(animal1.run());
Animal animal2=new Tiger();
out.println(animal2.run());
}
}
(3)简述改进版本的合理性。
答:通过构建一个抽象类Animal,抽象类里构造了一个抽象方法run(),供子类Cat,Tiger去继承重写其抽象方法,若是还需要添加多个动物,直接新建个子类去继承父类Animal去重写其抽象方法即可,降低了代码量,降低了代码的冗杂度。
四、实验心得(必须填写)
在模拟计算机对移动存储设备的读写实现代码的过程中,我仔细思考了很多方法去想怎么实现功能,最后我联想到了面向接口的方法来模拟,因为通过编写接口去抽象设计数据的读与写方法,再编写不同设备的实现类去重写接口方法,节省代码。最后设计和编写计算机类,模拟调用具有数据交换的外部设备:u盘、手机卡等,当需要再增添设备时,只需添加实现类去重写接口的读写方法,再在计算机类中调用即可,减少代码冗杂度,使得代码的实现更加灵活。最终代码的设计和完美实现让我欢欣雀跃,获益良多。