【Java作业】接口与多态

简介: 【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.理解接口与抽象类的区别


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


q1.png

五、程序及思路算法分析

实验内容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测试结果

q2.png


实验内容2测试结果

q1.png


七、实验心得

对于接口和clone机制的理解更加深刻了。

Java的interface中,成员变量的默认修饰符为:public static final;方法的默认修饰符是:public abstract。

接口只是对一类事物属性和行为的更高次抽象;对修改关闭,对扩展开放,可以说是java中开闭原则的一种体现。

其它:本章相关知识点程序与测试

注:实验心得可结合大纲规定相关任务


文章知识点与官方知识档案匹配,可进一步学习相关知识

Java技能树类和接口接

目录
打赏
0
0
0
0
4
分享
相关文章
|
18天前
|
Java 抽象类与接口在 Java17 + 开发中的现代应用实践解析
《Java抽象类与接口核心技术解析》 摘要:本文全面剖析Java抽象类与接口的核心概念与技术差异。抽象类通过模板设计实现代码复用,支持具体方法与状态管理;接口则定义行为规范,实现多态支持。文章详细对比了两者在实例化、方法实现、继承机制等方面的区别,并提供了模板方法模式(抽象类)和策略模式(接口)的典型应用示例。特别指出Java8+新特性为接口带来的灵活性提升,包括默认方法和静态方法。最后给出最佳实践建议:优先使用接口定义行为规范,通过抽象类实现代码复用,合理组合两者构建灵活架构。
32 2
JAVA接入DeepSeek大模型接口开发---阿里云的百炼模型
随着大模型的越来越盛行,现在很多企业开始接入大模型的接口,今天我从java开发角度来写一个demo的示例,用于接入DeepSeek大模型,国内的大模型有很多的接入渠道,今天主要介绍下阿里云的百炼模型,因为这个模型是免费的,只要注册一个账户,就会免费送百万的token进行学习,今天就从一个简单的可以执行的示例开始进行介绍,希望可以分享给各位正在学习的同学们。
537 3
JAVA接入DeepSeek大模型接口开发---阿里云的百炼模型
|
3月前
|
Java Lambda 表达式:以 Foo 接口为例深入解析
本文深入解析了 Java 8 中 Lambda 表达式的用法及其背后的函数式接口原理,以 `Foo` 接口为例,展示了如何通过简洁的 Lambda 表达式替代传统匿名类实现。文章从 Lambda 基本语法、函数式接口定义到实际应用层层递进,并探讨默认方法与静态方法的扩展性,最后总结常见误区与关键点,助你高效优化代码!
84 0
|
3月前
|
java中一个接口A,以及一个实现它的类B,一个A类型的引用对象作为一个方法的参数,这个参数的类型可以是B的类型吗?
本文探讨了面向对象编程中接口与实现类的关系,以及里氏替换原则(LSP)的应用。通过示例代码展示了如何利用多态性将实现类的对象传递给接口类型的参数,满足LSP的要求。LSP确保子类能无缝替换父类或接口,不改变程序行为。接口定义了行为规范,实现类遵循此规范,从而保证了多态性和代码的可维护性。总结来说,接口与实现类的关系天然符合LSP,体现了多态性的核心思想。
82 0
java中重载和多态的区别
本文详细解析了面向对象编程中多态与重载的概念及其关系。多态是OOP的核心,分为编译时多态(静态多态)和运行时多态(动态多态)。编译时多态主要通过方法重载和运算符重载实现,如Java中的同名方法因参数不同而区分;运行时多态则依赖继承和方法重写,通过父类引用调用子类方法实现。重载是多态的一种形式,专注于方法签名的多样性,提升代码可读性。两者结合增强了程序灵活性与扩展性,帮助开发者更好地实现代码复用。
134 0
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
863 5
|
6月前
|
Java 面向对象编程的三大法宝:封装、继承与多态
本文介绍了Java面向对象编程中的三大核心概念:封装、继承和多态。
403 15
|
7月前
|
java如何请求接口然后终止某个线程
通过本文的介绍,您应该能够理解如何在Java中请求接口并根据返回结果终止某个线程。合理使用标志位或 `interrupt`方法可以确保线程的安全终止,而处理好网络请求中的各种异常情况,可以提高程序的稳定性和可靠性。
107 6
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问