前言:
JDK8中新增了一系列的特性,接口的组成也进行了一系列的变革,当然是在原有的基础上新增了静态方法和default方法,
一、接口组成
更新之前的组成:①静态常量 ②抽象方法
修饰词 interface 接口名{
静态常量;
抽象方法;
}
更新之后的接口组成①静态常量 ②抽象方法 ③默认方法 ④静态方法
修饰词 interface 接口名{
静态常量;
抽象方法;
默认方法;
静态方法;
}
package lambdasinaction.chap9;
public interface MyInterface {
static void staticMethod(){
System.out.println("静态方法");
}
default void defaultMethod(){
System.out.println("默认方法");
}
}
再定义一个类实现接口
public class MyClass implements MyInterface {
//实现接口后,因为默认方法不是抽象方法,所以可以不重写,但是如果开发需要,也可以重写
}
二、使用时注意事项
1、不论时静态方法还是默认方法默认都是Public),静态可以使用别的访问修饰符,但默认方法只能public修饰
2、静态方法,只能通过接口名调用,不可以通过实现类的类名或者实现类的对象调用。default方法,只能通过接口实现类的对象来调用。
public class Main {
public static void main(String[] args) {
// static方法必须通过接口类调用
MyInterface.staticMethod();
//default方法必须通过实现类的对象调用
new MyClass().defaultMethod();
}
}
3、当然如果接口中的默认方法不能满足某个实现类需要,那么实现类可以覆盖默认方法。
public class MyClass implements MyInterface {
// 签名跟接口default方法一致,但是不能再加default修饰符
@Override
public void defaultMethod() {
System.out.println("接口实现类覆盖了接口中的default");
}
}
4、菱形继承问题 ,实现多个接口而有同名的默认方法产生的问题
由于java支持一个实现类可以实现多个接口,如果多个接口中存在同样的static和default方法会怎么样呢?如果两个接口中定义了一模一样的默认方法,并且一个实现类同时实现了这两个接口并且父类中并没有同名方法,则可能会编译失败,因为编译器无法判断
解决 冲突的机制其实相当简单。你只需要遵守下面这三条准则就能解决所有可能的冲突。
1、 首先,类或父类中显式声明的方法,其优先级高于所有的默认方法。
2、如果用第一条无法判断,方法签名又没有区别,那么选择提供最具体实现的默认方法的 接口。
3、 最后,如果冲突依旧无法解决,你就只能在你的类中覆盖该默认方法,显式地指定在你 的类中使用哪一个接口中的方法。
PS:因为static方法必须显式调用所以并不会产生问题,建议显式指定你在类中使用哪一个接口中的方法
三、函数式接口
接口中只有一个抽象方法就被称为函数式接口,函数式接口也可以显式的使用@FunctionalInterface 标记,
函数式接口主要使用在lambda表示式中,关于lambda表达式具体可以参考Lambda表达式详解
四、对于新引入特性的思考
为什么引入新特性呢?我想是源于解决API的不断演进出现的问题
附上JAVA8实战中的一段话
静态方法及接口 同时定义接口以及工具辅助类(companion class)是Java语言常用的一种模式,工具类定 义了与接口实例协作的很多静态方法。比如,Collections就是处理Collection对象的辅 助类。由于静态方法可以存在于接口内部,你代码中的这些辅助类就没有了存在的必要,你可 以把这些静态方法转移到接口内部。为了保持后向的兼容性,这些类依然会存在于Java应用程 序的接口之中。
本文详细介绍了JDK8中接口的更新,包括新增的默认方法和静态方法,以及函数式接口的概念。探讨了使用时的注意事项,如访问修饰符、调用方式和菱形继承问题的解决策略。
1万+

被折叠的 条评论
为什么被折叠?



