通过HTTP协议理解标准的制定,进而理解JAVA接口

时间:2022-06-16 01:00:55


最近学习了JAVA的继承和多态,学到接口时,书上的例子将接口比作角色,比如职工是一个类,则产品经理、工程师、程序员等都可以看成职工的角色,相应的角色要有相应的能力,这些能力通常体现为一组方法,可以将这些方法封装在一个接口中。

通过以上的例子,能让你对接口有初步的理解,但是每个人的理解可能有所差异,我个人认为还是不好理解,在网上看到一些例子,比如USB接口和相机接口,都很好理解,这里我再用一个网络协议,加深对接口的理解。

HTTP协议

我们先来简单了解一下HTTP协议:

HTTP协议是一个简单的 请求-响应 协议
指定了客户端可以发送给服务器什么样的消息以及得到什么样的响应

换句话说,协议就是约定好了双方的做事方法,以及得到的反馈

报文格式

HTTP报文由从客户机到服务器的请求和从服务器到客户机的响应构成

请求报文格式如下:

请求行 - 通用信息头 - 请求头 - 实体头 - 报文主体

应答报文格式如下:

状态行 - 通用信息头 - 响应头 - 实体头 - 报文主体

这里可以简单地把HTTP协议的报文格式理解成HTTP协议下的信息交换模式,即请求报文符合规范时,才能收到应答报文

标准的制定

而JAVA接口其实可以理解为协议,即一种办事的标准

举个例子,在实际开发中,甲方爸爸把接口定义好,要实现哪些功能,程序员就在这些接口(规范)下把功能具体化

用一个具体的例子描述项目

再具体化地举个例子,甲方爸爸有个需求,临近毕业,因为疫情无法到学校拍毕业照,所以要做一个拍毕业照的小程序,需要有拍照和P图的功能

而恰巧我就是这个甲方爸爸,我给出的接口是这样的:

interface GraduationPhotoApplet {
void takePhoto();
void revisionDrawings();
}

我找了乙方帮我实现里面的功能,如下所示:

class GraduationPhotoAppletTest implements GraduationPhotoApplet {
@Override
public void takePhoto() {
System.out.println("这是拍照功能");
}

@Override
public void revisionDrawings() {
System.out.println("这是修图功能");
}

public static void main (String[] args){
GraduationPhotoApplet graduationPhotoApplet = new GraduationPhotoAppletTest();
graduationPhotoApplet.takePhoto();
graduationPhotoApplet.revisionDrawings();
}
}

好吧,我承认甲方乙方都是我,下面我们来分析一下:

首先,甲方爸爸提出的要求必须要全部完成

如果您用的是IDEA,那么您应该深有体会:

通过HTTP协议理解标准的制定,进而理解JAVA接口


把两个功能注释,会发生报错,点击报错处的红灯会给出修改建议:

通过HTTP协议理解标准的制定,进而理解JAVA接口


我们来看一下具体要添加哪些方法 :

通过HTTP协议理解标准的制定,进而理解JAVA接口


现在你能体会到了吗?

要实现接口,就必须实现接口规定实现的所有方法

这也就是JAVA接口常常被用来制定标准的原因

JAVA接口的语法

接口的声明语法

格式如下:

[权限] interface [接口名称] [extends 其他的接口名] {
// 声明变量
// 抽象方法
}

Interface关键字用来声明一个接口,extends是继承的关键字

接口的实现

当类实现接口的时候,类要实现接口中所有的方法。否则,类必须声明为抽象的类。

类使用implements关键字实现接口

在类声明中,Implements关键字放在class声明后面

格式如下:

public class [要实现的类的名称] implements [接口名]{
//把接口的方法一一实现
}

接口的多继承

在Java中,类的多继承是不合法,但接口允许多继承

在接口的多继承中extends关键字只需要使用一次,在其后跟着继承接口

格式如下:

public interface [子接口名称] extends [父接口名], [父接口名]

标记接口

没有任何方法的接口被称为标记接口

它仅仅表明它的类属于一个特定的类型,格式如下:

public interface [标记接口的名称]{}

标记接口主要有两种目的:

  • 建立一个公共的父接口
    使用一个标记接口来建立一组接口的父接口
  • 向一个类添加数据类型
    让该类通过多态性变成一个接口类型