1,默认方法的用途,例子如下:
interface DefaultInterface {
void printHello();
default String defaultMethod() {
return "DefaultFunction()";
}
}
class ClassImpl implements DefaultInterface{
@Override
public void printHello() {
System.out.println("Hello");
}
}
class ClassTwoImpl implements DefaultInterface{
@Override
public void printHello() {
System.out.println("Hello world!");
}
public String defaultMethod() {
return "ClassTwoImpl Function()";
}
}
public class FunctionInterface{
public static void main(String[] args) {
ClassImpl impl=new ClassImpl();
System.out.println(impl.defaultMethod());
impl.printHello();
ClassTwoImpl classT=new ClassTwoImpl();
System.out.println(classT.defaultMethod());
classT.printHello();
}
}
如上面的例子所示,default修改的方法就是默认方法,默认方法不需要子类实现,但是子类可以直接使用;
子类也可以选择重写这个默认方法,这样的操作也是可以得
2,静态方法的用法,如下图:
import java.util.function.Supplier;
interface DefaulableFactory {
static DefaultInterface create(Supplier<DefaultInterface> supplier) {
return supplier.get();
}
}
public class Test {
public static void main(String[] args) throws InterruptedException {
DefaultInterface defaulable = DefaulableFactory.create(ClassImpl::new);
System.out.println(defaulable.defaultMethod());
defaulable = DefaulableFactory.create(ClassTwoImpl::new);
System.out.println(defaulable.defaultMethod());
}
}
由于JVM上的默认方法的实现在字节码层面提供了支持,因此效率非常高。默认方法允许在不打破现有继承体系的基础上改进接口。该特性在官方库中的应用是:给java.util.Collection接口添加新方法,如stream()、parallelStream()、forEach()和removeIf()等等。
尽管默认方法有这么多好处,但在实际开发中应该谨慎使用:在复杂的继承体系中,默认方法可能引起歧义和编译错误。
本文一些观点转自 https://blog.csdn.net/u014470581/article/details/54944384