接口的默认方法
Java 8用默认方法与静态方法这两个新概念来扩展接口的声明。默认方法使接口有点像Traits(Scala中特征(trait)类似于Java中的Interface,但它可以包含实现代码,也就是目前Java8新增的功能),但与传统的接口又有些不一样,它允许在已有的接口中添加新方法,而同时又保持了与旧版本代码的兼容性。
默认方法与抽象方法不同之处在于抽象方法必须要求实现,但是默认方法则没有这个要求。相反,每个接口都必须提供一个所谓的默认实现,这样所有的接口实现者将会默认继承它(如果有必要的话,可以覆盖这个默认实现)。让我们看看下面的例子:
1、默认方法必须有方法体
2、默认方法无需事先,可以直接调用,也可以背重写
public interface Defaultable {
default String defaultMethod1() {
return "这是Defaultable接口的默认defaultMethod1方法";
}
default String defaultMethod2() {
return "这是Defaultable接口的默认defaultMethod2方法";
}
}
class DefaultClass implements Defaultable{
@Override
public String defaultMethod2() {
return "这是DefaultClass类的默认defaultMethod2方法;";
}
}
public class NewCharacter {
public static void main(String[] args) {
DefaultClass defaultClass = new DefaultClass();
String s1 = defaultClass.defaultMethod1();
String s2 = defaultClass.defaultMethod2();
System.out.println(s1);
System.out.println(s2);
}
}
在JVM中,默认方法的实现是非常高效的,并且通过字节码指令为方法调用提供了支持。默认方法允许继续使用现有的Java接口,而同时能够保障正常的编译过程。这方面好的例子是大量的方法被添加到java.util.Collection接口中去:stream(),parallelStream(),forEach(),removeIf(),……
接口的静态方法
Java 8带来的另一个有趣的特性是接口可以声明(并且可以提供实现)静态方法。例如:
1、静态方法必须有方法体
2、静态方法不能够被重写
3、静态方法只能被定义接口静态调用
不能通过接口的实现类调用
不能通过实现类的对象调用
只能通过接口类静态调用
public interface Staticable {
static String statictMethod1() {
return "这是Staticable接口的默认statictMethod1方法";
}
}
public class NewCharacter {
public static void main(String[] args) {
String s1 = Staticable.statictMethod1();
System.out.println(s1);
}
}