很多时候,别人问我接口和类的区别的时候,我都会回答接口里面只能有抽象方法,而不能够有具体方法,但是今天看Mybatis源码的时候,发现了有一段代码是判断接口里面的默认方法的,于是我发现原来对接口的认识太过于肤浅了。
JDK1.8之后,在接口里面可以定义default方法,default方法里面是可以具备方法体的,当子类实现该接口之后,不需要重写该方法即可以调用该方法。
ok,看看代码
//定义一个接口 里面有一个默认方法
public interface Face {
default String get(){
return "123";
}
}
//定义一个实现类,空类
public class FaceImp implements Face {
}
//写一个测试类
public class Main {
public static void main(String[] args) {
Face face=new FaceImp();
System.out.println(face.get());
}
}
测试结果:
123
我们可以看到,实现类可以直接继承父接口的默认方法,这个默认实现子类也是可以重写的。
现在抽象类和接口就更像了,那么我们来看看现在接口和抽象类的区别:
- 抽象类只能单继承,接口可以多现实
- 抽象类中可以用private、protected方法,接口不可以用
那么在接口中加入default方法有什么好处呢?
- 对于一些公有的方法,直接使用默认的方法,就不用在实现类中写重复代码了。
- 可以对代码零入侵的加入一些新的方法