default
1.8中新增的关键字,用来修饰接口中的方法。带有default修饰的方法允许拥有方法体,用以对接口方法提供默认实现。
public interface IDef {
default void aa() {
System.out.println(111);
}
}
对于实现了IDef接口的类,在IDef中的用default关键字修饰的方法是不需要强制实现的。
下面的代码是可以编译通过的。
public interface IDef {
default void aa() {};
}
class Def implements IDef{}
本来,像提供默认实现这样的功能是应该用抽象类来辅助实现的,比如这样
public interface IDef {
void aa();
}
abstract class AbsDef implements IDef{
public void aa() {
System.out.println(111);
}
}
class Def extends AbsDef implements IDef{
}
但是,default语法确实对老代码的维护提供了一种优秀的补救方法,因为并不是所有老代码都是严格按照继承的套路写的(当然有些情况下也确实不应该使用继承)。
比如,Iterable新增的forEach方法,在ArrayList中就必须通过修改老代码来实现。
需要注意的是,“在接口中实现具体业务逻辑”这个做法本身是违背接口的定义的。这会模糊接口与其实现类之间的界限,所以,我个人认为default特性需要慎用。
- 总之,default 特性更应该作为一种补救措施,而不是在设计阶段就考虑使用。
静态方法
接口中允许直接定义静态方法。与default相比,这个特性可以用的更随意一些,因为这只是把从前写在“工具类”中的代码放到了接口中。况且接口中本来就是可以定义静态变量的,这只是一个扩展罢了。
例
public interface IDef {
public static void create() {
}
}