在Java开发过程中,我们应该遇到过这样的情景:起初,有人定义了一个接口,并声明了一些方法,许多人对该接口进行了不同的实现。随着需求的增加,有人又在该接口中增加了一个方法。对于大多数需要该方法的人来说,修改自己的类并不成问题。然而,对于少数不需要该方法的人来说,他们也不得不跟着修改类,这样不仅增加了工作量,还提高了出错的可能性。JDK8引入了默认方法,可以解决这个问题。
默认方法在接口中定义,可以有多个,使用'default'关键字修饰,必须有方法体。比如我很应景的定义了一个名为GaoKao的接口和一个默认方法biSheng,祝各位学子,高考必胜!
/**
* 接口:高考
*/
public interface GaoKao {
/**
* 默认方法: 必胜
*/
default void biSheng() {
System.out.println("祝愿各位学子,高考必胜!!");
}
}
子接口(或实现类)会悄悄继承(或实现?)接口中的默认方法。所以,在你的实现类中,即使你不重写接口中的默认方法,你也可以直接调用。
public class GaoKaoImpl implements GaoKao{
public static void main(String[] args) {
//直接调用
new GaoKaoImpl().biSheng();
}
}
如果你需要继承一个有默认方法的接口,你有几种选择:
1. 忽略默认方法:满足需求或者根本用不到;
2. 重新声明默认方法,并去掉'default'修饰符:废掉默认方法,子接口的实现类必须重写该方法;
3. 重写默认方法:用到,但是不满足需求,需要重写逻辑。
除了默认方法之外,我们还可以在接口中定义静态方法。接口中的静态方法,需要通过接口去调用。如果有需要,实现类中可以重写静态方法为静态或非静态的。
/**
* 接口:高考
*/
public interface GaoKao {
/**
* 默认方法: 必胜
*/
default void biSheng() {
System.out.println("祝愿各位学子,高考必胜!!");
}
/**
* 静态方法: 加油
*/
static void jiaYou() {
System.out.println("各位学子,高考加油!!");
}
}
public class GaoKaoImpl implements GaoKao {
public static void main(String[] args) {
new GaoKaoImpl().biSheng();
GaoKao.jiaYou(); //通过接口直接调用静态方法
//new GaoKao().jiaYou(); 通过类调用接口静态方法,是不可以的
}
}