- 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中接口的定义