实验任务

  • 任务一:设计实现发声接口
  • 任务二:动物乐园

实验内容

任务一:设计实现发声接口

任务目的:

  1. 理解并掌握如何定义接口
  2. 掌握接口的实现方式

任务描述:

  设计和实现一个Soundable接口,该接口具有发声功能,同时还能调节声音大小

Soundable接口的这些功能将由有3种声音设备来实现他们分别是Radio、Walkman、

Mobilephone。最后还需设计一个应用程序类来使用这些实现Soundable接口的声音

设备。程序运行时,先询问用户想听那个设备,然后程序按照该设备的工作方式来输

出发音。

实施步骤:

1. 定义 Soundable接口

public interface Soundable {

    // 发出声音
public void playSound() ; // 降低声音
public void decreaseVolume(); // 停止声音
public void stopSound();
}

2. 设计Radio类

public class Radio implements Soundable{

    @Override
public void playSound() {
System.out.println("收音机播放广播:中央人民广播电视台。");
} @Override
public void decreaseVolume() {
System.out.println("降低收音机音量。");
} @Override
public void stopSound() {
System.out.println("关闭收音机。");
}
}

3. 设计Walkman类

public class Walkman implements Soundable{

    @Override
public void playSound() {
System.out.println("随身听发出音乐");
} @Override
public void decreaseVolume() {
System.out.println("降低随身听音量");
} @Override
public void stopSound() {
System.out.println("关闭随身听");
} }

4. 设计MobilePhone类

public class MobilePhone implements Soundable{

    @Override
public void playSound() {
System.out.println("手机发出来电铃声:叮当 、 叮当");
} @Override
public void decreaseVolume() {
System.out.println("降低手机音量");
} @Override
public void stopSound() {
System.out.println("关闭手机");
} }

5. 设计SampleDisplay类

class SampleDisplay {
public void display(Soundable soundable) {
soundable.playSound();
soundable.decreaseVolume();
soundable.stopSound();
}
}

6. 测试类

import java.util.Scanner;

public class TestDemo {

    public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("你想听什么?请输入:");
System.out.println("0-收音机 1-随身听 2-手机");
int choice;
choice = in.nextInt();
SampleDisplay sampledisplay = new SampleDisplay();
if (choice == )
sampledisplay.display(new Radio());
else if(choice == )
sampledisplay.display(new Walkman());
else if(choice == )
sampledisplay.display(new MobilePhone());
else
System.out.println("瓜娃,你输错了!");
in.close();
} }

任务二:动物乐园

任务目的

  能够灵活运用接口解决多继承问题

任务描述

  编写程序模拟动物园里饲养员给各种动物喂养各种不同食物的过程。当饲养员

给动物喂食时,动物发出欢快的叫声。

实施步骤

  在这个动物园里,涉及的对象有饲养员,各种不同动物以及各种不同的食物。这样

很容易抽象出3个类Feeder、Animal和Food。假设只考虑猫科和狗类动物,则由Animal

类派生出Cat类、Dog类、同样由Food类可以进一步派生出其子类Bone、Fish。因为他

们之间存在这明显的is-a关系。

  同样鱼是一种食物,但实际上,鱼也是一种动物,Cat类和Dog类继承了Animal的很多

属性和方法,如果将Animal定义为接口,Animal中是不能定义成员变量和成员方法的,Food

类中虽然也有变量但是数量比Animal少,所以我们考虑将Food定义为接口,此时可以说“鱼

是一种动物,同时也是一种食物”。

代码实现:

定义Animal类

public abstract class Animal {

    private String name;

    public Animal(String name) {
this.name = name;
} public abstract void shout();
public abstract void eat(Food food); public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} }

Animal的子类Cat类

public class Cat extends Animal{

    public Cat(String name) {
super(name);
} public void shout() {
System.out.println("喵呜.....");
} public void eat(Food food) {
System.out.println(getName() + "正在吃着香喷喷的" + food.getName());
} }

Animal的子类Dog类

public class Dog extends Animal {

    public Dog(String name) {
super(name);
} @Override
public void shout() {
System.out.println("汪汪汪.....");
} @Override
public void eat(Food food) {
System.out.println(getName() + "正在啃着香喷喷的" + food.getName());
} }

定义Food类

public interface Food {
public abstract String getName();
}

Fish类

public class Fish extends Animal implements Food{

    public Fish(String name) {
super(name);
} @Override
public void shout() { } @Override
public void eat(Food food) { } }

Bone类

public class Bone implements Food{

    @Override
public String getName() {
return "bone";
} }

Feeder类

public class Feeder {

    private String name;
public Feeder(String name) {
this.name = name;
} public void speak() {
System.out.println("欢迎来到动物园!");
System.out.println("我是饲养员 "+getName());
} public void feed(Animal a, Food food) {
a.eat(food);
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} }

测试类:

public class TestDemo {

    public static void main(String[] args) {
Feeder feeder = new Feeder("花花");
feeder.speak(); Dog dog = new Dog("小布丁");
Food food = new Bone();
feeder.feed(dog, food); Cat cat = new Cat("小猫崽");
food = new Fish("黄花鱼");
feeder.feed(cat, food);
} }

Java实验案例(接口)的更多相关文章

  1. Java 实验案例(多态)

    实验任务 任务一:图形面积周长计算小程序 任务二:饲养员喂养动物程序 实验内容: 任务一: 图形面积周长计算 任务目的: 掌握多态的含义及应用场合 掌握上转型对象和多态的实现 掌握abstract关键 ...

  2. Java 实验案例(类和对象篇)

    实验任务 任务一:手机类的封装 任务二:基于控制台的购书系统 任务三:简单的投票程序 实验内容 任务一:手机类的封装 任务目的 理解和掌握面向对象的设计过程 掌握类的结构和定义过程 掌握构造方法及其重 ...

  3. Java常用函数式接口--Consumer接口andThen()方法使用案例(二)

    Java常用函数式接口--Consumer接口使用案例

  4. Java常用函数式接口--Predicate接口使用案例

    Java常用函数式接口--Predicate接口使用案例 该方法可以使用and来优化: 调用:

  5. Java实验二20135104

    课程:Java程序设计          班级: 1351 姓名:刘帅                学号:20135104 成绩:             指导教师:娄嘉鹏       实验日期:2 ...

  6. Java实验报告二:Java面向对象程序设计

    Java实验报告二:Java面向对象程序设计                                                                               ...

  7. 20175212童皓桢 Java实验二-面向对象程序设计实验报告

    20175212童皓桢 Java实验二-面向对象程序设计实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设 ...

  8. Java实验报告(实验二)

    课程:Java程序设计          班级: 1351 姓名:王玮怡                学号:20135116 成绩:             指导教师:娄嘉鹏       实验日期: ...

  9. java实现Comparable接口和Comparator接口,并重写compareTo方法和compare方法

    原文地址https://segmentfault.com/a/1190000005738975 实体类:java.lang.Comparable(接口) + comareTo(重写方法),业务排序类 ...

随机推荐

  1. CentOS7搭建FastDFS V5.11分布式文件系统-第一篇

    1.绪论 最近要用到fastDFS,所以自己研究了一下,在搭建FastDFS的过程中遇到过很多的问题,为了能帮忙到以后搭建FastDFS的同学,少走弯路,与大家分享一下.FastDFS的作者淘宝资深架 ...

  2. mysql主从同步详细教程

    1.安装好主数据库和从数据库,这个大家肯定都会,如果不是很明白,可以参考我前面的安装教程. 例子: 假如我需要同步test1.test2数据库 系统:centos7 主库主机:192.168.1.25 ...

  3. OS之进程管理---孤儿进程和僵尸进程

    僵尸进程 当一个进程终止时,操作系统会释放其资源,不过它位于进程表中的条目还是在的,直到它的父进程调用wait():这是因为进程表中包含了进程的退出状态.当进程已经终止,但是其父进尚未调用wait() ...

  4. (转)python 之路,200行Python代码写了个打飞机游戏!

    原文:https://www.cnblogs.com/alex3714/p/7966656.html

  5. (转)Python科学计算之Pandas详解,pythonpandas

    https://www.cnblogs.com/linux-wangkun/p/5903380.html-------pandas 学习(1): pandas 数据结构之Series https:// ...

  6. Java之集合(二十四)ConcurrentLinkedDeque

    转载请注明源出处:http://www.cnblogs.com/lighten/p/7517454.html 1.前言 本章介绍并发队列ConcurrentLinkedDeque,这是一个非阻塞,无锁 ...

  7. 【数组】Set Matrix Zeroes

    题目: Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place. cl ...

  8. 解决LNMP环境下WordPress后台缺少”WP-ADMIN”路径

    LNMP一键安装包也是老左比较喜欢使用的环境之一,昨天帮助一个网友搭建LNMP环境后发现登陆WP后台之后点击左侧的菜单发现直接跳转404错误,开始还以为数据库问题,视线朝上一看原来在地址栏中的路径缺少 ...

  9. golang闭包实现递归

    func main() { for i := 1; i < 30; i++ { fmt.Println(Fibonacci(i)) } } func Fibonacci(n int) int { ...

  10. 数据库报错com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'ua' at row 1

    记一次报错记录,成长路上的点滴 明明使用浏览器或者微信开发工具调试接口没有问题,但是在真机测试时候就出问题了.(((¬_¬)) 500服务器内部错误,要死的节奏啊 登陆tomcat服务器 使用命令ta ...