在Java8之前,接口中可以包含的成员有:抽象方法和常量。抽象方法的默认修饰是public abstract。常量的默认修饰是public static final。并且这些默认修饰符是可以省略不写的。
在Java8中接口可以包含具有具体实现的方法。有默认方法和静态方法两种。
1 接口中的默认方法
默认方法,使用default修饰符。default不可省略。
1.1 “类优先”原则
若一个接口中定义了默认方法。而另外一个父类或者接口中又定义了一个同名的方法时:
- 选择父类中的方法。如果一个父类提供了具体的实现,那么接口中具有相同名称和参数的默认方法会被忽略。
- 接口冲突。如果一个父接口提供一个默认方法,而另一个接口也提供了一个具有相同名称和参数列表的方法(不管方法是否是默认方法), 那么必须覆盖该方法来解决冲突 。
一、接口中定义了默认方法,父类中也又相同名称和参数的方法:
1 | // 接口中定义了一个默认方法 |
二、一个接口中定义了一个默认方法,另一个接口中也定义了一个同名同参数的方法
1 | // 接口中定义了一个默认方法 |
此时,有一个子类同时实现了这两个接口:
1 | public class AnotherSubClass implements MyInterface, MyOtherInterface { |
此时编译器会报错:

此时必须重写该方法来解决冲突问题。
若想选择某一个接口中的默认方法,重写的方法可以为:
1 | public class AnotherSubClass implements MyInterface, MyOtherInterface { |
2 接口中的静态方法
Java8中接口可以定义静态方法,使用static修饰。
1 | public interface MyInterface { |