- 6.6.2 Java9中接口的定义
6.6.2 Java9中接口的定义
定义接口使用interface关键字。接口定义的基本语法如下:
1 | [修饰符] interface 接口名 extends 父接口1,父接口2 |
对上面语法的详细说明如下:
- 接口的修饰符可以是
public或者省略,如果省略了public访问控制符,则默认釆用包权限访问控制符,即只有在相同包结构下才可以访问该接口。 - 接口名应与类名采用相同的命名规则,如果要遵守
Java可读性规范,则接口名应由多个有意义的单词连缀而成,每个单词首字母大写,单词与单词之间无须任何分隔符。接口名通常能够使用形容词。 - 一个接口可以有多个直接父接口,但接口只能继承接口,不能继承类。
在上面语法定义中,只有在Java8以上的版本中才允许在接口中定义默认方法、类方法。
接口中 不能有构造器 不能有初始化块
由于接口定义的是一种规范,因此接口里不能包含构造器和初始化块定义。
接口里可以有的成员
接口里可以包含
- 成员变量(只能是静态常量)、
- 方法(只能是
共有抽象实例方法、类方法、默认方法或私有方法)、 - 内部类(包括内部接口、枚举)定义。
接口里的成员变量只能是静态常量,接口里的方法只能是抽象方法、类方法、默认方法或私有方法这四种。
接口里只能有public修饰符和默认控制符
定义接口成员时,可以省略访问控制修饰符,如果要指定访问控制修饰符,则只能使用public访问控制修饰符。
java9中为接口增加私有方法
Java9为接口增加了一种新的私有方法,
私有方法的主要作用就是作为工具方法,为接口中的默认方法或类方法提供支持。私有方法可以拥有方法体,但私有方法不能使用default修饰。私有方法可以使用static修饰,也就是说,私有方法既可是类方法,也可是实例方法。
接口里的成员变量都是静态常量
对于接口里定义的静态常量而言,它们是接口相关的,因此系统会自动为这些成员变量增加static和final两个修饰符。也就是说,在接口中定义成员变量时,不管是否使用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接口,则该源文件的主文件名必须与该接口名相同
原文链接: 6.6.2 Java9中接口的定义