有关默认方法的注意点
以下都是讨论类和接口中的方法一样时发生的情况
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{
}
- 会报错
解决办法
- 实现类重写相关方法即可,或指定哪个接口中的方法
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();
}
}
解释
- MyClass3Impl会继承实现类中的**f()**方法
- 因为实现类的优先级比接口高
为什么要引用默认方法
防止破坏老版本的代码
- 如果想在接口中增加方法,其实现类就必须实现它,就会对以前的代码造成破坏
- 加入了默认方法后,接口中就可以增加方法,而实现类不需要修改,不必增加对应方法的实现