default是在java8中引入的关键字,被default标识的方法也可称为Virtual extension methods——虚拟扩展方法。
Virtual extension methods:在接口内部包含了一些默认的方法实现(也就是接口中可以包含方法体,这打破了Java之前版本对接口的语法限制),从而使得接口在进行扩展的时候,不会破坏与接口相关的实现类代码。
例如Iterable接口中的forEach和spliterator方法:
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
default Spliterator<T> spliterator() {
return Spliterators.spliteratorUnknownSize(iterator(), 0);
}
注意:
- 在接口中编写default修饰的方法时,必须有方法体
- 接口用static和default修饰的方法都要有方法体,其中被static修饰的方法表示该接口的静态方法(即属于这个接口(类)的方法,不可被继承当然也就不存在重写Override,但是可以被调用)
- 本类的对象可以直接调用本类的公有成员方法
- default关键字有利有弊,弊端在于default关键字将抽象类和接口之间的一个显著区别抹平了,即接口只能有抽象方法,不提供子类方法的具体实现,而抽象类可以有非抽象的方法
网友评论