Java基础第五篇 实施接口

 更新时间:2021年09月10日 16:27:18   作者:Vamei  
在public和private的封装机制,我们实际上同时定义了类和接口,类和接口混合在一起。Java还提供了interface这一语法。这一语法将接口从类的具体定义中剥离出来,构成一个独立的主体,下面文章内容将为大家做详细介绍

在上一篇文章封装与接口中,private关键字封装了对象的内部成员。经过封装,产品隐藏了内部细节,只提供给用户接口(interface)。

接口是非常有用的概念,可以辅助我们的抽象思考。在现实生活中,当我们想起某个用具的时候,往往想到的是该用具的功能性接口。比如杯子,我们想到加水和喝水的可能性,高于想到杯子的材质和价格。也就是说,一定程度上,用具的接口等同于用具本身。内部细节则在思考过程中被摒弃。

publicprivate的封装机制,我们实际上同时定义了类和接口,类和接口混合在一起。Java还提供了interface这一语法。这一语法将接口从类的具体定义中剥离出来,构成一个独立的主体。

 1、interface

以杯子为例,定义一个杯子的接口:

interface Cup {
    void addWater(int w);
    void drinkWater(int w);
}


Cup这个interface中定义了两个方法的原型(stereotype): addWater()和drinkWater()。一个方法的原型规定了方法名,参数列表和返回类型。原型可以告诉外部如何使用这些方法。

在interface中,我们应注意

  • 不需要定义方法的主体
  • 不需要说明方法的可见性

特别注意第二点,interface中的方法默认为public。正如我们在封装与接口中讲到的,一个类的public方法构成了接口。所以,所有出现在interface中的方法都默认为public。

我们可以在一个类的定义中实施接口,比如下面的MusicCup (可以播放音乐的杯子):

class MusicCup implements Cup 
{
    public void addWater(int w) 
    {
        this.water = this.water + w;
    }

    public void drinkWater(int w)
    {
        this.water = this.water - w;
    }

    private int water = 0;
}

我们用implements关键字来实施interface。一旦在类中实施了某个interface,必须在该类中定义interface的所有方法(addWater()和drinkWater())。类中的方法需要与interface中的方法原型相符。否则,Java将报错。

 在类中可以定义interface没有提及的其他public方法。也就是说,interface规定一个必须要实施的最小接口。比如下面的waterContent()方法就没有在Cup接口中规定原型:

class MusicCup implements Cup 
{
    public void addWater(int w) 
    {
        this.water = this.water + w;
    }

    public void drinkWater(int w)
    {
        this.water = this.water - w;
    }

    public int waterContent()
    {
        return this.water;
    }

    private int water = 0;
}

 

2、分离接口的意义

我们使用了interface,但这个interface并没有减少我们定义类时的工作量。我们依然要像之前一样,具体的编写类。我们甚至于要更加小心,不能违反了interface的规定。既然如此,我们为什么要使用interface呢?

事实上,interface就像是行业标准。一个工厂(类)可以采纳行业标准 (implement interface),也可以不采纳行业标准。但是,一个采纳了行业标准的产品将有下面的好处:

  • 更高质量: 没有加水功能的杯子不符合标准。
  • 更容易推广: 正如电脑上的USB接口一样,下游产品可以更容易衔接。

如果我们已经有一个Java程序,用于处理符合Cup接口的对象,比如领小朋友喝水。那么,只要我们确定,我们给小朋友的杯子(对象)实施了Cup接口,就可以确保小朋友可以执行喝水这个动作了。至于这个杯子(对象)是如何具体定义喝水这个动作的,我们就可以留给相应的类自行决定 (比如用吸管喝水,或者开一个小口喝水)。

在计算机科学中,接口是很重要的概念。比如任何提供UNIX接口的操作系统都可以称作UNIX系统。LinuxMac OSSolaris都是UNIX系统,它们提供相似的接口。但是,各个系统的具体实施(源代码)互不相同。Linux是开源的,你可以查看它的每一行代码,但你还是不知道如何去编写一个Solaris系统。

相同的UNIX接口:

3、实施多个接口

一个类可以实施不止一个的interface。比如我们有下面一个interface:

interface MusicPlayer {
    void play();
}
 

我们再来考虑MusicCup类。MusicCup可以看做播放器和杯子的混合体。

所以MusicCup应该具备两套接口,即同时实施MusicPlayer接口和Cup接口:

class MusicCup implements MusicPlayer, Cup
{
    public void addWater(int w) 
    {
        this.water = this.water + w;
    }

    public void drinkWater(int w)
    {
        this.water = this.water - w;
    }

    public void play()
    {
        System.out.println("la...la...la");
    }

    private int water = 0;
}

最后,可以尝试将本文中的interface和类定义放在同一个文件中,并编写Test类,运行一下。

 4、总结

interface, method stereotype, public

implements interface

implements interface1, interface2

到此这篇关于Java基础第五篇 实施接口的文章就介绍到这了,更多相关Java实施接口内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java.security.egd 作用详解

    java.security.egd 作用详解

    这篇文章主要为大家介绍了java.security.egd作用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • Java中使用阻塞队列控制线程集实例

    Java中使用阻塞队列控制线程集实例

    这篇文章主要介绍了Java控制阻塞队列线程集实例,本文用一个程序展示了如何使用阻塞队列来控制线程集,程序功能是在一个目录及它的所有子目录下搜索所有文件,打印出包含指定关键字的文件列表,需要的朋友可以参考下
    2015-01-01
  • java Thumbnails 图片处理的使用

    java Thumbnails 图片处理的使用

    这篇文章主要介绍了java Thumbnails 图片处理的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • Struts中使用validate()输入校验方法详解

    Struts中使用validate()输入校验方法详解

    这篇文章主要介绍了Struts中使用validate()输入校验方法,本文介绍的非常详细,具有参考借鉴价值,感兴趣的朋友一起看看吧
    2016-09-09
  • Spring MVC文件上传大小和类型限制以及超大文件上传bug问题

    Spring MVC文件上传大小和类型限制以及超大文件上传bug问题

    这篇文章主要介绍了Spring MVC文件上传大小和类型限制以及超大文件上传bug问题,非常具有实用价值,需要的朋友可以参考下
    2017-10-10
  • 解决常见的Eclipse SVN插件报错方法详解

    解决常见的Eclipse SVN插件报错方法详解

    本篇文章是对常见的Eclipse SVN插件报错方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • Struts2学习笔记(1)-入门教程

    Struts2学习笔记(1)-入门教程

    本文是一个Struts2的简单入门教程,比较简单,希望能给大家做一个参考。
    2016-06-06
  • Spring lazy-init 懒加载的原理小结

    Spring lazy-init 懒加载的原理小结

    lazy-init 是一个非常重要的属性,可以优化应用的启动时间,尤其是在处理大量bean或者复杂依赖关系时,可以显著提高应用的响应速度,本文主要介绍了Spring lazy-init 懒加载的原理小结,感兴趣的可以了解一下
    2025-04-04
  • Java非递归实现删除任意目录的方法

    Java非递归实现删除任意目录的方法

    这篇文章主要为大家详细介绍了Java非递归实现删除任意目录的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • Java幸运28系统搭建数组的使用实例详解

    Java幸运28系统搭建数组的使用实例详解

    在本篇文章里小编给大家整理了关于Java幸运28系统搭建数组的使用实例内容,有需要的朋友们可以参考学习下。
    2019-09-09

最新评论