接口中的默认方法
接口默认方法的“超类优先” 原则
调用:
接口默认方法的“超类优先” 原则
java8在接口中引入了默认方法,通过在方法前加上default关键字就可以在接口中写方法的默认实现,有点类似于C++中的多继承,但是当多个接口或父类中有相同签名的方法时,会引发一些问题,经过实验得出如下结论:
规则如下:
1.超类优先,如果超类提供了一个具体的方法,同名而且有相同的参数类型的默认方法会被忽略。
2.接口冲突。如果一个超接口提供了一个默认方法,另一个接口提供了一个同名而且参数类型(不论是否是默认参数)相同的方法,必须覆盖这个方法来解决。
1.当继承的父类和实现的接口中有相同签名的方法时,优先使用父类的方法。(超类优先原则)
public class SubClass extends MyClass implements MyInterface{
}
public interface MyInterface {
default String getName(){
return "我是父类接口";
}
}
public class MyClass {
public String getName(){
return "子类";
}
}
SubClass subClass=new SubClass();
System.out.println( subClass.getName());
子类
2.当实现的多个接口中有相同签名的方法(不论是否是默认参数)时,必须在实现类中通过重写方法解决冲突问题,否者无法通过编译,在重写的方法中可以通过 接口名.super.方法名(); 的方式显示调用需要的方法。(接口冲突)
public class SubClass implements MyFun, MyInterface{
@Override
public String getName() {
return MyInterface.super.getName();
}
}
public interface MyFun {
default String getName(){
return "哈哈哈";
}
}
public interface MyInterface {
default String getName(){
return "我是父类接口";
}
}
2.接口中的静态方法
public interface MyInterface {
default String getName(){
return "我是父类接口";
}
public static void show(){
System.out.println("接口中的静态方法");
}
}
调用:
MyInterface.show();