提到java的interface大家一定不会陌生。Interface长期以来是作为一个约定存在。就如汽车上要开一个天窗,那就需要按照天窗所具有的行为来对汽车进行设计。这样我们看到所有的车上面的天窗就具有相同的行为。
public interface Sunroof {
void open();
void close();
}
值得注意的是,interface指定的方法均为public,这也是区别于abstract class的其中一个方面。
在java8的interface中引入了两个关键字static和default。顾名思义,default是作为默认的方法存在,static则是默认不能覆盖的方法。
public interface Sunroof {
default void open() {
System.out.println("open sunroof");
}
static void close() {
System.out.println("close sunroof");
}
}
这样做的好处是什么呢,考虑每一辆汽车都有open和close的操作,如果每一个拥有Sunroof的汽车都要重写一遍相同的open和close,是很让人烦躁的。
原有的解决方案是新建一个基类vehicle,这个基类中有open和close的实现,所有的车辆都继承自这个vehicle,那么也就拥有了天窗的open和close功能。
public abstract class Vehicle implements Sunroof {
public void open() {
System.out.println("open sunroof");
}
static void close() {
System.out.println("close sunroof");
}
}
所以,从java8之后,就不需要再新增这个基类了,只需要在interface中实现对应的default或者static即可。