从Java 8开始接口默认定义方法
- 接口中的默认方法可以解决接口升级的问题,比如某个接口被很多个实现方法实现了,n年以后,这个接口升级了,比方说多了一个功能,那么每个接口实现方法都要加那一条接口的实现方法,很麻烦,所以有默认接口实现就可以不需要再去每一个实现方法中实现了
- 格式
public default 返回值类型 方法名称(参数列表){
}
- 接口的默认方法,可以通过
接口实现类
对象,直接调用
- 接口的默认方法,也可以被
接口实现类
进行覆盖重写
public interface MyInterfaceDefault {
public abstract void first();
public default void defaultInterface(){
System.out.println("default implementation");
}
}
public class MyInterfaceDefaultImpl01 implements MyInterfaceDefault{
@Override
public void first() {
System.out.println("implementation 1");
}
}
public class MyInterfaceDefaultImpl02 implements MyInterfaceDefault{
@Override
public void first() {
System.out.println("implementation 2");
}
@Override
public void defaultInterface(){
System.out.println("Overrode implementation");
}
}
public class Demo02Interface {
public static void main(String[] args) {
MyInterfaceDefaultImpl01 impl01 = new MyInterfaceDefaultImpl01();
impl01.first();
impl01.defaultInterface();
System.out.println("=================");
MyInterfaceDefaultImpl02 impl02 = new MyInterfaceDefaultImpl02();
impl02.first();
impl02.defaultInterface();
}
}
implementation 1
default implementation
=================
implementation 2
Overrode implementation
Java 8开始支持静态接口方法
public interface MyInterfaceStatic {
public static void staticMethod(){
System.out.println("这是接口的静态方法");
}
}
public class MyInterfaceStaticImpl {
}
public class Demo03Interface {
public static void main(String[] args) {
MyInterfaceStaticImpl impl01 = new MyInterfaceStaticImpl();
MyInterfaceStatic.staticMethod();
}
}
- 这些方法不能由实现它的类继承(static method may be invoked on containing interface class only. )。 这样做是有道理的,因为一个类可以实现多个接口。如果2个接口具有相同的静态方法,它们都将被继承,编译器就不知道要调用哪个接口。
- 然而如果是继承某个类,而非实现某接口,就可以用这个继承的类调用,因为继承只能继承一个,不会存在歧义。
Class A {
static void staticMethod() {
println();
}
}
Class B extends A {
}
B.staticMethod();