接口的使用

85 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第28天,点击查看活动详情

关于接口

接口就是用来实现类之间多重继承功能的一种结构,是相对独立的完成特定功能的属性集合。

问:Java 中类是支持单继承还是多继承?

答案:java 类只支持单继承。

在 Java 中由于类只能继承一个类,为了改进就有了接口,所以接口模拟的实现了多继承。

接口结构

我们来看一下接口声明的格式:

[public] interface 接口名{
    // 声明常量
      // 声明抽象方法
}

抽象方法也类似一种约定,比抽象类更进一步抽象

对于接口的修饰符,只有 public,用 public 修饰的接口称为公共接口。被修饰为 public 的接口,接口名必须和文件名一致。

类通过关键字 class 标识,而接口通过关键字 interface 来标识。 从结构上来看,接口就是特殊的抽象类。看一下具体的代码:

interface InterfaceA{
    int ID = 100;
    void method1();
}

等价于:

interface InterfaceA{
    public static final int ID = 100;
    public abstract void method1();
}

我们可以看到在接口里面只有常量和方法的声明,所以说接口是由常量和抽象方法组成的。

一般我们建议,在接口中常量前的修饰符全部省略书写,而抽象方法省略 abstract 关键字的书写。

同样也需要注意以下的写法都是不允许存在的,在接口中不能存在构造方法和方法的方法体

interface InterfaceC{
    public InterfaceC(){

    }
    public void method3(){

    }
}

同理,接口也是不能实例化的。

接口的继承

和类一样,接口也具有继承性,它将继承父接口的所有属性和方法。

不过接口可以继承多个父接口,实现了多继承

语法结构:

[public] interface 接口名 extends 父接口名1[, 父接口名2,... 父接口名n]{
        // 可以继承父接口中所有的属性和方法
}

接口的实现

由上面介绍我们可以知道,接口不能实例化,没有构造方法,对于怎么使用接口,我们需要给他提供子类,来具体实现接口里面的方法

实现接口需要使用关键字 implements 。

语法结构:

[public] class 类名 implments 接口名1[, 接口名2, ...接口名n]{
  // 可以调用接口中所有属性
  // 实现接口中所有的抽象方法
}

每个类最多只能继承一个父类,不能同时继承多个类,也就是不允许多重继承。而接口不存在这方面的限制,可以只实现一个接口,也可以同时实现两个接口、三个接口等等。

如果子类没有实现父类的接口里面全部方法,那么编译会报错。但是把类设置成为抽象类,那么就不需要实现所有方法

abstract class ClassB implements InterfaceD, InterfaceE{

}
  • 不同的类可以实现相同的接口

接下来,我们来看看以下代码:👇

interface InterfaceX{
    public void method1();
}
interface InterfaceY{
    public void method1();
}

class ClassZ implements InterfaceX,InterfaceY{
  @Override
    public void method1(){

    }
}

🤔 可能你会想相同的方法名 method1() ,会冲突吧 ~

但是这个程序没有任何问题,在 ClassZ 中所写的 method1() 方法既实现了 InterfaceX 接口中的 method1() 方法,也实现了 InterfaceY 接口中的 method1() 方法。

总结:

  1. 声明接口采用 interface 关键字来标识的,在接口中只有常量和方法的声明。
  2. 接口可以采用 extends 关键字完成多继承,也就是说接口可以继承一个接口,也可以继承多个接口。
  3. 接口不能实例化,必须通过子类才能获取实例,那么子类需要通过 implements 关键字实现该接口。

接口与类的不同之处:

  • 凡是类都有构造方法,即便是抽象类也支持定义构造方法,但接口不允许定义构造方法。

  • 在 JDK8 以前,接口内部的所有方法都必须是抽象方法,但可以省略 abstract 关键字的修饰。

  • 接口里声明的属性默认是 public final static 修饰,就是一个常量值。

  • 判断继承和接口 继承就是’是‘的关系,比如对象是xx,接口就是拥有关系,比如门有锁

练习

image.png

3种,接口 C 继承接口 A 和 B,不同的方法都被直接继承下来,相同的方法合并后被继承下来。