在Java 8中可以在接口定义方法的实现, 称为default方法, 类似用于Scala中的trait
, 在Iterable
中有类似以下的定义
1 | default void forEach(Consumer<? super T> action) { |
Iterable
中的default方法的主要目的是为Java 8的Lambda表达式提供支持, 如果将这个方法定义成普通接口方法,则会对现有的JDK中的其他使用Iterable
接口造成影响, 因此提供了default方法的功能。
一个接口中可以定义多个default方法。 下面写个简单的例子说明下default方法的使用
存在一个父接口, 定义了一个default方法
1 | public interface Parent { |
有一个类实现该接口,使用默认的default方法
1 | public class ParentImpl implements Parent { |
ParentImpl
有一个实现类
1 | public class ParentImpl2 extends ParentImpl { |
ParentImpl2
有一个实现类
1 | public class ChildImpl2 extends ParentImpl2 implements Child { |
有一个接口继承Parent
接口
1 | public interface Child extends Parent { |
Child
有一个实现类,使用Child
的default方法
1 | public class ChildImpl implements Child { |
以下为测试代码
1 | public class DefaultMethodTest { |
通过以上的例子中可以得出以下几点:
实现类可以直接使用父接口中定义的default方法
接口可以重写父接口中定义的default方法
实现类可以重写父接口中定义的default方法
当父类与父接口都存在default方法时, 使用父类中重写的default方法
如果一个类实现了2个接口,这2个接口有相同的default方法签名时, 此时会编译失败, 必须在子类中重写这个default方法。