5 接口默认方法
在 java8 之后,我们可以在接口中写默认实现方法。使用关键字 default 定义默认接口实现
在 java8 中,接口引入默认方法是为了什么: 为了能保证向后兼容。
现在对接口默认方法的几种情况进行说明。
5.1 一个类实现一个默认实现方法的接口
首先我们定义一个接口
package cn.zxhysy.jdk8.dufaultmethod;
public interface MyInterface {
default void myMethod() {
System.out.println("myInterface1");
}
}
定义一个类,实现该接口调用接口默认方法。
package cn.zxhysy.jdk8.dufaultmethod;
public class MyClass implements MyInterface {
public static void main(String[] args) {
MyClass myClass = new MyClass();
//实体类可以直接调用。
myClass.myMethod();
}
}
5.2 一个类实现两个接口,且接口的默认方法名一直
这里我们在上面的基础上,再定义一个接口为 myInterface2
package cn.zxhysy.jdk8.dufaultmethod;
public interface MyInterface2 {
default void myMethod(){
System.out.println("myInterface2");
}
}
这时我们就不可一直用基类来直接调用方法,因为会报错,说有多个接口的默认方法名一致,需要我们重写方法。
package cn.zxhysy.jdk8.dufaultmethod;
public class MyClass implements MyInterface,MyInterface2 {
@Override
public void myMethod(){
//todos...
// 也可以用某个接口的默认方法。
MyInterface2.super.myMethod();
}
public static void main(String[] args) {
MyClass myClass = new MyClass();
myClass.myMethod();
}
}
如果我们要保留或者用某个接口的默认方法,只需要在覆盖方法的时候,用接口名.super.方法名
,就如上面代码:
@Override
public void myMethod(){
//todos...
// 也可以用某个接口的默认方法。
MyInterface2.super.myMethod();
}
5.3 一个类实现另一个类和接口,其中另一个类和接口中的默认方法名字一直。
这里我们就用另一个类 MyInterfaceImpl 来实现 MyInterface 接口,用 MyClass 来继承该类,和实现 MyInterface2 接口。
package cn.zxhysy.jdk8.dufaultmethod;
public class MyInterfaceImpl implements MyInterface{
@Override
public void myMethod(){
System.out.println("myInterfaceImpl");
}
}
package cn.zxhysy.jdk8.dufaultmethod;
public class MyClass extends MyInterfaceImpl implements MyInterface2 {
public static void main(String[] args) {
MyClass myClass = new MyClass();
myClass.myMethod();
}
}
结果中,没报错,默认情况下,默认使用的是 实现类中的方法,而不会使用接口中的默认方法。打印了 myInterfaceImpl