接口


概述

接口,是 Java 语言中一种引用类型,是方法的集合,是一种规范

定义接口与定义类方式相似,但是使用interface关键字。它也会被编译成.class 文件,但一定要明确它并不是类,而是另外一种引用数据类型。

引用数据类型:数组,类,接口。

接口的使用,它不能创建对象,但是可以被实现(implements,类似于被继承)。一个实现接口的类(可以看做是接口的子类),需要实现接口中所有的抽象方法,创建该类对象,就可以调用方法了。

定义格式

public interface 接口名称{

}

内容

在 java 9+版本中,接口内容可以有:

  1. 成员变量(其实是常量),格式:
[public] [static] [final] 数据类型 常量名称 = 数据值;

注意:

  • 常量必须进行赋值,而且一旦赋值不能改变
  • 常量名称完全大写,用下划线进行分隔
  1. 抽象方法(最重要)
[public] [abstract] 返回值类型 方法名称(参数列表);

注意:

  • 没有方法体,该方法供子类实现使用
  • 实现类必须覆盖重写接口中所有的抽象方法,除非实现类是抽象类
  1. 默认方法(从 java 8 开始)
[public] default 返回值类型 方法名称(参数列表) {方法体}

注意:

  • 默认方法也可以被覆盖重写
  1. 静态方法(从 java 8 开始)
[public] static 返回值类型 方法名称(参数列表) {方法体}

注意:

  • 应该通过接口名称进行调用,不能通过实现类对象进调用接口静态方法
  1. 私有方法(java 9 开始)
  • 普通私有方法(解决多个默认方法之间重复代码问题)
private 返回值类型 方法名称(参数列表) {方法体}
  • 静态私有方法(解决多个静态方法之间重复代码问题)
private static 返回值类型 方法名称(参数列表) {方法体}

注意:

  • private 的方法只有接口自己才能调用,不能被实现类或者别人使用
  1. 接口中没有构造方法,不能创建对象
  2. 接口中没有静态代码块

实现

类与接口的关系为实现关系,即类实现接口。该类可以称为接口的实现类,也可以称为接口的子类。实现的动作类似继承,格式相仿,只是关键字不同,实现使用implements关键字

非抽象子类实现接口:

  • 必须重写接口中的所有抽象方法
  • 继承了接口的默认方法,既可以直接调用,也可以重写

格式

class 类名 implements 接口名{
    //重写接口中的抽象方法
    //[重写接口中的默认方法]
}

接口的多实现

一个类只能继承一个父类。而对于接口而言,一个类是可以实现多个接口的,这叫做接口的多实现。并且,一个类能继承一个父类,同时实现多个接口。

格式

class 类名 [extends 父类名] implements 接口名1, 接口名2, 接口名3...{
    //重写接口中抽象方法【必须】
    //重写接口中默认方法【不重名时可选】
}
  1. 抽象方法

    接口中,有多个抽象方法时,必须重写所有抽象方法。如果抽象方法有重名的,只需要重写一次

  2. 默认方法

    接口中有多个默认方法时,实现类都可继承调用。如果默认方法有重名的,必须重写一次

  3. 静态方法

    接口中存在重名的静态方法并不会冲突,原因是都只能通过各自的接口名来访问静态方法

优先级

当一个类,既继承一个父类,又实现若干个接口时,父类中的成员方法与接口中的默认方法重名,子类就近选择执行父类的成员方法。

接口的多继承

一个接口能继承另一个或者多个接口,这和类之间的继承比较相似。接口的继承使用extends关键字,子接口继承父接口的方法。如果父接口中的默认方法有重名的,那么子接口需要重写一次。

子接口重写默认方法时,default 关键字可以保留。

子类重写默认方法时,default 关键字不可以保留。


文章作者: Wujiu
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Wujiu !
  目录