6.6.2 Java9中接口的定义

6.6.2 Java9中接口的定义

定义接口使用interface关键字。接口定义的基本语法如下:

1
2
3
4
5
6
7
[修饰符] interface 接口名 extends 父接口1,父接口2
{
零个到多个常量定义,
零个到多个抽象方法定义
零个到多个内部类、接口、枚举定义
零个到多个私有方法、默认方法或类方法定义
}

对上面语法的详细说明如下:

  • 接口的修饰符可以是public或者省略,如果省略了public访问控制符,则默认釆用包权限访问控制符,即只有在相同包结构下才可以访问该接口。
  • 接口名应与类名采用相同的命名规则,如果要遵守Java可读性规范,则接口名应由多个有意义的单词连缀而成,每个单词首字母大写,单词与单词之间无须任何分隔符。接口名通常能够使用形容词。
  • 一个接口可以有多个直接父接口,但接口只能继承接口,不能继承类。

在上面语法定义中,只有在Java8以上的版本中才允许在接口中定义默认方法、类方法

接口中 不能有构造器 不能有初始化块

由于接口定义的是一种规范,因此接口里不能包含构造器初始化块定义

接口里可以有的成员

接口里可以包含

  • 成员变量(只能是静态常量)、
  • 方法(只能是共有抽象实例方法类方法默认方法私有方法)、
  • 内部类(包括内部接口、枚举)定义。

接口里的成员变量只能是静态常量,接口里的方法只能是抽象方法类方法默认方法私有方法这四种

接口里只能有public修饰符和默认控制符

定义接口成员时,可以省略访问控制修饰符,如果要指定访问控制修饰符,则只能使用public访问控制修饰符。

java9中为接口增加私有方法

Java9为接口增加了一种新的私有方法,

私有方法的主要作用就是作为工具方法,为接口中的默认方法或类方法提供支持。
私有方法可以拥有方法体,但私有方法不能使用default修饰。
私有方法可以使用static修饰,也就是说,**私有方法既可是类方法,也可是实例方法**。

接口里的成员变量都是静态常量

对于接口里定义的静态常量而言,它们是接口相关的,因此系统会自动为这些成员变量增加staticfinal两个修饰符。也就是说,在接口中定义成员变量时,不管是否使用public static final修饰符,接口里的成员变量总是使用这三个修饰符来修饰。而且接口里没有构造器和初始化块,因此接口里定义的成员变量只能在定义时指定默认值

接口中的方法说明

接口里定义的方法只能是抽象方法类方法默认方法私有方法,

接口中的普通方法默认使用public abstract修饰

  • 定义接口里的普通方法时不管是否使用public abstract修饰符,接口里的普通方法总是使用public abstract来修饰。
  • 接口里的普通方法不能有方法实现(方法体);

接口中类方法 默认方法 私有方法 必须有方法体

类方法默认方法私有方法必须有方法体

接口里的内部类 内部接口 内部枚举默认public static修饰

接口里定义的内部类、内部接口、内部枚举默认都采用public static两个修饰符,不管定义时是否指定这两个修饰符,系统都会自动使用public static对它们进行修饰。

java8增强的接口

Java8接口中的默认方法必须使用default修饰符

Java8允许在接口中定义默认方法,默认方法必须使用default修饰,该方法不能使用static修饰。

默认方法总是使用public修饰

默认方法总是使用public修饰,如果开发者没有指定public,系统会自动为默认方法添加public修饰符。

没有接口中静态默认方法

由于默认方法并没有static修饰,因此不能直接使用接口来调用默认方法,需要使用接口的实现类的实例来调用这些默认方法。

java8默认方法的实质

接口的默认方法其实就是实例方法,但由于早期Java的设计是:接口中的实例方法不能有方法体;Java8也不能直接”推倒”以前的规则,因此只好重定义一个所谓的”默方法”,默认方法就是有方法体的实例方法

java8可以在接口中定义静态方法

Java8允许在接口中定义类方法,类方法必须使用static修饰,该方法不能使用default修饰,无论程序是否指定,静态方法总是使用public修饰——如果开发者没有指定public,系统会自动为静态方法添加public修饰符。接口的静态方法可以直接使用接口来调用

java8增加了带方法体的私有方法

Java9增加了带方法体的私有方法,这也是Java8埋下的伏笔:Java8允许在接口中定义带方法体的默认方法和类方法——这样势必会引发一个问题,当两个默认方法(或类方法)中包含一段相同的实现逻辑时,程序必然考虑将这段实现逻辑抽取成工具方法,而工具方法是应该被隐藏的,这就是Java9增加私有方法的必然性。

接口里的成员变量默认public static final修饰

接口里的成员变量默认是使用public static final修饰的,因此即使另一个类处于不同包下,也可以通过接口来访问接口里的成员变量

public接口名必须和java源文件名相同

一个Java源文件里最多只能有个public接口,如果一个Java源文件里定义了一个public接口,则该源文件的主文件名必须与该接口名相同