接口中引入默认方法的目的是为了保证向前兼容
,避免对既有代码产生破坏性的影响
1 同时实现两个接口
当两个接口的方法相同是,实现列必须重写其方法,不然编译器无法确定当前类实现的是哪个接口的方法
- 示例
public class MyClass1 implements MyInterface1, MyInterface2{
public static void main(String[] args) {
MyClass1 myClass = new MyClass1();
myClass.myMethod();
}
@Override
public void myMethod() {
//指定接口默认方法
MyInterface2.super.myMethod();
}
}
public interface MyInterface1 {
default void myMethod(){
System.out.println("MyInterface1");
}
}
public interface MyInterface2 {
default void myMethod(){
System.out.println("MyInterface2");
}
}
执行结果
MyInterface2
另外,若实现类想指定调用接口的默认方法,可以用接口名.super.方法名
的方式进行调用
2 即实现接口又继承其他类
当继承类和接口类有相同的方法时,会调用继承类中方法,原因是在java中约定实现类方法的优先级要高于接口类方法的优先级
- 示例
public class MyClass2 extends MyInterface1Impl implements MyInterface2{
public static void main(String[] args) {
MyClass2 myClass2 = new MyClass2();
//调用的是MyInterface1Impl的myMethod方法
myClass2.myMethod();
}
}
public class MyInterface1Impl implements MyInterface1{
@Override
public void myMethod(){
System.out.println("MyInterface1Impl");
}
}
public interface MyInterface1 {
default void myMethod(){
System.out.println("MyInterface1");
}
}
public interface MyInterface2 {
default void myMethod(){
System.out.println("MyInterface2");
}
}
执行结果
MyInterface1Impl