【Java作业】接口与多态

一、实验名称

实验六 接口与多态

二、实验内容

1.实验内容1

本实验的任务是设计和实现一个Soundable接口,该接口具有发声功能,同时还能调节声音大小(playSound( )、decreaseVolume( )、stopSound( ))。Soundable接口的这些功能将会由3种声音设备来实现,它们分别是:Radio,Walkman和Mobilephone。最后还需设计一个应用程序类来使用这些实现了Soundable接口的声音设备。程序运行时,先询问用户想听哪知设备,然后程序按照该设备的工作方式来输出发音。程序运行效果如下:

2.实验内容2

货车要装载一批货物,货物由三种商品组成:电视、计算机、洗衣机。卡车需要计算出整批货物的重量。

  • 要求有一个ComputeWeight接口,该接口中有一个方法:
    public double computeWeight()
  • 有三个实现该接口的类:Television、Computer和WashMachine. 这三个类通过实现接口给出自重。
  • 有一个Truck类,该类用ComputeWeight接口类型的数组作为成员(Truck类面向接口),那么该数组的单元就可以存放Television对象的引用、Computer对象的引用或WashMachine对象的引用。
  • 程序要求:①Truck中这三种物品的总量范围为30~50,随机生成;②用对象数组来管理;③根据随机数生成Television、Computer和WashMachine三类对象;④输出Truck对象所装载的货物的总重量。

三、 实验目的

1.学习如何定义接口
2.掌握接口的实现方式
3.使用实现了接口的类
4.掌握接口回调
5.理解接口与抽象类的区别

四、类图/类关系图/交互图等

在这里插入图片描述

五、程序及思路算法分析

实验内容1

思路分析:

实验内容1是一个简单接口实现练习。思路就是定义一个接口Soundable,然后有三个类去实现这个接口,其中这三个自然要实现接口中的方法。同时,在测试类Test1中定义一个死循环来监听程序的输入,当输入0,1,2时会创建相应的对象并将这个对象引用赋值给开始声明的soundable。然后调用其方法。

Soundable接口类

package com.dreamchaser.work7;

/**
 * 具有发声功能的接口
 */
public interface Soundable {
    void playSound();
    void decreaseVolume();
    void stopSound();
}

Radio类

package com.dreamchaser.work7;

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("关闭收音机");
    }
}

Walkman类

package com.dreamchaser.work7;

public class Walkman implements Soundable{
    @Override
    public void playSound() {
        System.out.println("随身听发出音乐:1234567");
    }

    @Override
    public void decreaseVolume() {
        System.out.println("增大随身听音量");
    }

    @Override
    public void stopSound() {
        System.out.println("关闭随身听");
    }
}

Mobilephone类

package com.dreamchaser.work7;


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("关闭手机");
    }
}

Test1测试类

package com.dreamchaser.work7;

import java.util.Scanner;

/**
 * 测试类
 */
public class Test1 {
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        Soundable soundable=null;
        while(true){
            System.out.println("你想听什么?请输入选择:0-收音机 1-随声听 2-手机");
            int i=scanner.nextInt();
            if (i==0){
                soundable=new Radio();
            }else if (i==1){
                soundable=new Walkman();
            }else {
                soundable=new Mobilephone();
            }
            soundable.playSound();
            soundable.decreaseVolume();
            soundable.stopSound();
            System.out.println("----------------------------");
        }
    }
}

实验内容2

思路分析:

同实验内容2一样都是三个类实现一个接口,值得一提的是Truck类。这个类由题目可知,有一个ComputeWeight数组。而数组的内容,也就是其中的对象引用是随机的,只要保证总质量在30-50之间即可。此时我在这个类中写了一个initialize方法来初始化computeWeights数组,并返回其总质量,其思路将在算法分析中讲述。而测试类Test2中就是创建了Truck对象来。

算法分析:

Truck类外层已经创建了这三个类的对象,在initialize方法中,外层是个死循环,内部先对a,b,c三个数做0-10的随机,然后判断总质量是否在30-50之间,如果在这之间则利用clone方法克隆相应数量的相应对象放在数组中,并break出循环返回总质量total,否则继续循环。
PS:clone方法的实现:1.相应的类实现cloneable标记接口(其内部什么也没有,仅做标记使用,程序在运行过程中会检查这个类是否实现了这个接口,如果没有则会抛出CloneNotSupportedException异常)
2.重写Object类的clone方法,将访问修饰符改为public(其实Object类中已经帮我们实现了clone方法,但是其访问修饰符为protected,所以我们只需重写该方法,将访问修饰符改成public即可,当然这个浅克隆的做法)

ComputeWeight 接口类

package com.dreamchaser.work7;

public interface ComputeWeight {
    double computeWeight();
}

Computer 类

package com.dreamchaser.work7;

public class Computer implements ComputeWeight,Cloneable{
    @Override
    public double computeWeight() {
        return 1;
    }
    //覆盖Object类中clone方法,将其提升为public
    @Override
    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

Television类

package com.dreamchaser.work7;

public class Television implements ComputeWeight,Cloneable{
    @Override
    public double computeWeight() {
        return 2;
    }
    //覆盖Object类中clone方法,将其提升为public
    @Override
    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

WashMachine类

package com.dreamchaser.work7;

public class WashMachine implements ComputeWeight,Cloneable{
    @Override
    public double computeWeight() {
        return 3;
    }

    //覆盖Object类中clone方法,将其提升为public
    @Override
    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

Truck类

package com.dreamchaser.work7;

public class Truck {
    ComputeWeight[] computeWeights;
    Computer computer=new Computer();
    Television television=new Television();
    WashMachine washMachine=new WashMachine();

    /**
     * 初始化货车上的货物,返回总重量
     * @return
     */
    public double initialize(){
        double total=0;
        while (true){
            int a= (int) (Math.random()*10);
            int b= (int) (Math.random()*10);
            int c= (int) (Math.random()*10);
            total=a*computer.computeWeight()+b*television.computeWeight()+c*washMachine.computeWeight();
            if (total>30 && total<50){
                computeWeights =new ComputeWeight[a+b+c];
                for (int i=0;i<a;i++){
                    try {
                        computeWeights[i]= (ComputeWeight) computer.clone();
                    } catch (CloneNotSupportedException e) {
                        e.printStackTrace();
                    }
                }
                for (int i=a;i<a+b;i++){
                    try {
                        computeWeights[i]= (ComputeWeight) television.clone();
                    } catch (CloneNotSupportedException e) {
                        e.printStackTrace();
                    }
                }
                for (int i=a+b;i<a+b+c;i++){
                    try {
                        computeWeights[i]= (ComputeWeight) washMachine.clone();
                    } catch (CloneNotSupportedException e) {
                        e.printStackTrace();
                    }
                }
                break;
            }
        }
        return total;
    }
}

Test2测试类

package com.dreamchaser.work7;

public class Test2 {
    public static void main(String[] args) {
        Truck truck=new Truck();
        //初始化truck的货物
        double total=truck.initialize();
        System.out.println("货车上总质量为"+total+"kg");
    }
}

六、测试

实验内容1测试结果

在这里插入图片描述

实验内容2测试结果

在这里插入图片描述

七、实验心得

对于接口和clone机制的理解更加深刻了。
Java的interface中,成员变量的默认修饰符为:public static final;方法的默认修饰符是:public abstract。
接口只是对一类事物属性和行为的更高次抽象;对修改关闭,对扩展开放,可以说是java中开闭原则的一种体现。
其它:本章相关知识点程序与测试
注:实验心得可结合大纲规定相关任务

实验1 Java语言基础 4 一、实验目的 4 二、实验要求 4 三、实验内容 4 (一) 声明不同数据类型的变量 4 (二) 了解变量的使用范围 5 (三) 使用关系运算符和逻辑运算符 5 (四) 使用表达式语句与复合语句 6 (五) 使用选择语句 6 (六) 使用循环语句 8 实验2 面向对象编程 11 一、实验目的 11 二、实验要求 11 三、实验内容 11 (一)创建 Applet 应用小程序 11 (二)创建对象并使用对象 12 (三)编写显示当前日期和时间的程序 13 (四)使用修饰符 14 (五)方法中参数传递 15 (六)类的继承性 16 (七)类的多态性 18 实验3 包、接口与异常处理 22 一、实验目的 22 二、实验要求 22 三、实验内容 22 (一)了解并使用 Java 的系统包 22 (二)创建并使用自定义包 22 (三)使用接口技术 24 (四)了解异常处理机制 25 实验4 常用系统类的使用 27 一、实验目的 27 二、实验要求 27 三、实验内容 27 (一)了解 Applet 的生命周期 27 (二)使用数学函数类 28 (三)使用日期类 29 实验5 建立图形用户界面 32 一、实验目的 32 二、实验要求 32 三、实验内容 32 (一)创建图形用户界面 32 (二)了解事件处理机制 34 (三)建立独立运行的窗口界面并使用匿名类 36 (四)使用 Swing 组件 39 (五)使用自定义对话框与内部类 41 实验6 图形处理 44 一、实验目的 44 二、实验要求 44 三、实验内容 44 (一)使用图形类 Graphics 44 实验7图形处理(二) 47 一、实验目的 47 二、实验要求 47 三、实验内容 47 (一)幻灯机效果——连续显示多幅图像 47 (二)使用滚动条改变背景颜色 48 (三)Applet 与 Application 合并运行 49 (四)创建电闪雷鸣的动画 50 实验8 流与文件 53 一、实验目的 53 二、实验要求 53 三、实验内容 53 (一)使用标准数据流的应用程序 53 (二)使用文件输入输出流的应用程序 54 (三)使用随机文件类的应用程序 54 (四)使用数据输入输出流与文件输入输出流类的应用程序 55 (五)使用对象输入输出流的应用程序 56 实验9 线程 58 一、实验目的 58 二、实验要求 58 三、实验内容 58 (一)Thread子类的方法实现多线程 58 (二)实现Runnable接口的方法实现多线程 59 实验10 数据库的连接:JDBC 61 一、实验目的 61 二、实验要求 61 三、实验内容 61 (一)配置ODBC数据源 61 (二)编写程序,按照下表的结构建立"student"表 61 (三)编写程序,完成填写功能 62 (四)编写程序,完成查询功能 62
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

枕石 入梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值