有一天,小A的朋友小呼面试回来,愁眉不展。
"难道面试不顺利?"小A心想。于是问小呼都问了什么。小呼说,面试官问了个奇怪的问题,
"Java的接口能不能定义静态方法"
小呼当时就内心一喜,这不是明摆着的问题嘛!
"当然不能,从来没听说过可以这么操作"
面试官微微一笑,
"好的回去等通知吧"
"难道我记错了?"小呼说。
"其实啊,你听我说…",于是小A跟小呼解释了起来
总所周知,Java的Interface不能有静态方法,因为接口是用来规定一种约束,所以它自己本身不能有任何实现。不理解这点的同学可以查看昨天对于Java接口静态变量的解释。
但是!在Java8中,接口新增了特性,允许用户定义静态方法!
那么接口静态方法怎么用,又在什么时候用呢?
直到Java8之前,接口都不能定义静态方法。我们举个例子,产品提了个需求要做个计算器,只有加减两个方法。
public interface BaseCalculator {
public int add(int a, int b);
public int subtract(int a, int b);
}
我们先定义了个约束或者叫规范,这个计算器只提供加和减两个功能。然后我们实现了个类
public class SimpleCalculator implements BaseCalculator {
@Override
public int add(int a, int b) {
//do add
}
@Override
public int subtract(int a, int b) {
//do substract
}
}
产品上线后,获得了小学生的一致好评!
产品说,我们来改需求吧。加个功能,求平方。
无奈的我们就加了个接口square
public interface BaseCalculator {
public int add(int a, int b);
public int subtract(int a, int b);
public int square(int a);
}
可是此时就要修改实现类SimpleCalculator了。这种场景经常发生,代码量小的时候还好,但是当实现这个接口的类非常多的时候,没个文件都要去修改,新增一个接口,就很蛋疼了。而且!有些类根本不需要这个接口,咋办呀?
Java8提供了这种功能,可以定义个default方法作为默认实现,同时,接口也可以定义静态方法来给调用者使用了。
public interface BaseCalculator {
public static void baseMethod() {
System.out.println("static method of interface");
}
public int add(int a, int b);
public int subtract(int a, int b);
default int square(int a) {
return a * a;
}
}
这样之前的实现类SimpleCalculator就不需要再去修改了,而我们只需要在新的实现类里按我们的需要来重写default方法就行了。
Java8提供了接口的两个新特性,静态方法和默认方法。 对于静态方法的调用跟接口的静态变量调用一样,都是以接口进行的。 对于默认方法,实现类可以根据需要来重写方法的实现。 对于面向接口编程来说,非常有用。可以避免对接口的修改导致大范围的而且是无必要的代码调整。