前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >什么是接口?

什么是接口?

作者头像
BWH_Steven
发布2021-10-13 14:05:24
9740
发布2021-10-13 14:05:24
举报
文章被收录于专栏:理想二旬不止理想二旬不止

为满足移动端和PC端的双重阅读体验,以及文章质量的保证,开始重构的以及新写的文章都会基于 “语雀” 平台编写,公众号会同步刚发布的文章,但随后的修改或者更新只会在语雀中维护。

👉 点击底部左下角 “阅读原文” 即可跳转到文章最新页面!理想二旬不止@BWH_Steven

注:这里我们只讲解最浅显的概念,至于接口的应用,会在后面语雀中迭代。

1. 概述

Java 接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。—— 百度百科

简单的说:接口是一个抽象的类型,其中定义了一些没有方法体只有声明的抽象方法,因此它也不能够被实例化,它和类的创建很像,尤其是抽象类,但是它们之间又有很大的不同.

常见的猫狗案例,猫和狗它们仅仅提供一些基本功能。但有一些不是动物本身就具备的,比如:猫钻火圈,狗跳高等功能,是在后面的培养中训练出来的,这种额外的功能,Java 提供了接口表示。

2. 定义与实现

A:接口用关键字 interface 表示

代码语言:javascript
复制
[public] interface 接口名 {
    ...
}
  • 接口中的方法不能具体实现,接口中的方法必须为抽象方法
  • 接口中一般不定义变量,因为接口中的变量会被默认指定为 public static final 变量(只能是)

B:类实现接口用implements 表示

代码语言:javascript
复制
class 类名 implements 接口1,接口2,[....]{
    ...
}
  • 一个类(非抽象类)可以遵循多个接口,并且需要实现(重写)该接口中所有的方法
  • 子类为抽象类的意义不大

3. 抽象类和接口的区别(重要)

我们从我们实际设计场景中来切入这个话题,先来举一个简单的例子: 狗都具有 eat() 、sleep() 方法,我们分别通过抽象类和接口定义这个抽象概念

代码语言:javascript
复制
//通过抽象类定义
public abstract class Dog {
    public abstract void eat();
    public abstract void sleep();  
}
代码语言:javascript
复制
//通过接口定义
public interface Dog {
    public abstract void eat();
    public abstract void sleep();
}

但是我们现在如果需要让狗拥有一项特殊的技能——钻火圈 DrillFireCircle(),如何增加这个行为呢?

思考:

  1. 将钻火圈方法与前面两个方法一同写入抽象类中,但是这样的话,但凡继承这个抽象类狗都具有了钻火圈技能,明显不合适 。
  2. 将钻火圈方法与前面两个方法一同写入接口中,当需要使用钻火圈功能的时候,就必须实现 接口中的 eat() 、sleep() 方法(重写该接口中所有的方法)显然也不合适 。

那么该如何解决呢 ? 我们可以仔细想一想,eat 和 sleep 都是狗本身所应该具有的一种行为,而钻火圈这种行为则是后天训练出来的,只能算是对狗类的一种附加或者延伸, 两者不应该在同一个范畴内,所以我们考虑将这个单独的行为,独立的设计一个接口,其中包含 DrillFireCircle() 方法,Dog设计为一个抽象类, 其中又包括eat() 、sleep() 方法。

一个 SpecialDog 即可继承 Dog 类并且实现 DrillFireCircle() 接口

下面给出代码:

代码语言:javascript
复制
// 定义接口,含有钻火圈方法
public interface DrillFireCircle() {
    public abstract void drillFireCircle();
}

// 定义抽象类狗类
public abstract class Dog {
    public abstract void eat();
    public abstract void sleep();
}

// 继承抽象类且实现接口
class SpecialDog extends Dog implements drillFireCircle {
    public void eat() {
      //....
    }
    public void sleep() {
      //....
    }
    public void drillFireCircle() () {
      //....
    }
}
总结:

继承是一个 "是不是"的关系,而 接口 实现则是 "有没有"的关系。如果一个类继承了某个抽象类,则子类必定是抽象类的种类,而接口实现则是有没有、具备不具备的关系,比如狗是否能钻火圈,能则可以实现这个接口,不能就不实现这个接口。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-09-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 理想二旬不止 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 注:这里我们只讲解最浅显的概念,至于接口的应用,会在后面语雀中迭代。
  • 1. 概述
  • 2. 定义与实现
  • 3. 抽象类和接口的区别(重要)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档