Java8中接口增强:接口静态方法、接口默认方法。
一、接口静态方法
在接口方法前添加static 修饰符,表示接口中的静态方法。接口静态方法不要求子类实现、重写,且子类也无法实现和重写,
因为静态的东西脱离了对象而存在于类中。 子类继承和实现的是父类\接口的非静态抽象方法。
接口中新增静态方法,能够增强接口的功能,而对所有子类、子接口无影响 。如
public interface MC{
static max(int a ,int b){
return a>b?a:b;
}
}
二、接口默认方法
默认方法允许接口方法定义默认实现,子类中无须实现此方法而就可以拥有该方法及实现。如下:
public interface DefaultFuncInter {
int getInt();
default String getString(){
return "Default String";
}
}
默认方法主要优势是提供了一种扩展接口的方法,而不破坏现有代码。如果一个已经投入使用的接口需要扩展一个新的方法,在JDK8以前,我们必须再该接口的所有实现类中都添加该方法的实现,否则编译会出错。如果实现类数量很少且我们有修改的权限,可能工作量会少,但是如果实现类很多或者我们没有修改代码的权限,这样的话就很难解决了。而默认方法提供了一个实现,当没有显式提供时就默认采用这个实现,这样新添加的接口就不会破坏现有的代码。默认方法另一个优势是该方法是可选的,子类可以根据自身的需求可重写(override)父类\接口的实现。
再看下面一个例子 :
public class DefaultMethodTest {
public static void main(String[] args) {
A a=new C();
a.hi();
a.print();
}
}
interface A{
default void print() {
System.out.println("i am A ");
}
default void hi() {
System.out.println("hi i am A");
}
}
interface B{
default void print() {
System.out.println("i am B ");
}
}
class C implements A,B {
@Override
public void print() {
A.super.print();
}
}
C类 implements 了A、B两个接口,而A、B两个接口中都定义了print的默认方法,则在子类C中必须重写这个默认方法。