Java 8 接口中的默认(default)方法

1,585 阅读1分钟

有关默认方法的注意点

以下都是讨论类和接口中的方法一样时发生的情况

1、当多个接口同时又一样的方法时

测试

  • 一个接口
public interface MyInterface {
    default void f(){
        System.out.println("from MyInterface");
    }
}
  • 另一个接口
public interface MyInterface2 {
    default void f(){
        System.out.println("from MyInterface222");
    }
}
  • 实现类
public class MyClass implements MyInterface,MyInterface2{

}
  • 会报错 image.png

解决办法

  • 实现类重写相关方法即可,或指定哪个接口中的方法
public class MyClass implements MyInterface,MyInterface2{
    @Override
    public void f() {
        MyInterface.super.f();
    }
}

super关键字可以调用父类成员方法和成员变量

2、继承了Interface的实现类,且该类实现Interface2

测试

  • Interface的实现类
public class MyClass2Impl implements MyInterface{
    @Override
    public void f() {
        System.out.println(" from MyClass2Impl");
    }
}
  • 多继承
public class MyClass3Impl extends MyClass2Impl implements MyInterface2{

}
  • test
public class Test {
    public static void main(String[] args) {
        MyClass3Impl myClass3 = new MyClass3Impl();
        myClass3.f();
    }
}

image.png

解释

  • MyClass3Impl会继承实现类中的**f()**方法
  • 因为实现类的优先级比接口高

为什么要引用默认方法

防止破坏老版本的代码

  • 如果想在接口中增加方法,其实现类就必须实现它,就会对以前的代码造成破坏
  • 加入了默认方法后,接口中就可以增加方法,而实现类不需要修改,不必增加对应方法的实现