共计 2209 个字符,预计需要花费 6 分钟才能阅读完成。
总概
JAVA8 已经发布很久,而且毫无疑问,java8 是自 java5(2004 年发布)之后的最重要的版本。其中包括语言、编译器、库、工具和 JVM 等诸多方面的新特性。
Java8 新特性列表如下:
接口默认方法
函数式接口
Lambda
表达式
方法引用
Stream
Optional 类
Date API
Base64
重复注解与类型注解
接下来乐字节将会带大家一一讲以上 Java8 新特性详细讲解,作为 Java8 新特性系列文章连载。
一、接口默认方法
1、什么是接口默认方法
从 Java8 开始,程序允许在接口中包含带有具体实现的方法,使用 default 修饰,这类方法就是默认方法。默认方法在接口中可以添加多个,并且 Java8 提供了很多对应的接口默认方法。
2、设计接口默认方法好处
使用接口编程的好处是,开发是面向抽象而不再是面向具体来编程,使得程序变得很灵活,缺陷是,当需要修改接口时候,此时对应需要修改全部实现该接口的类,举个例子,java 8 之前对于我们常用的集合框架没有 foreach 方法,通常能想到的解决办法是在 JDK 里给相关的接口添加新的方法及实现。从 Java8 开始,引入了接口默认方法,这样的好处也是很明显的,首先解决了 Java8 以前版本接口兼容性问题,同时对于我们以后的程序开发,也可以在接口子类中直接使用接口默认方法,而不再需要再各个子类中各自实现响应接口方法。
3、默认方法编写
jdk8 中接口可以包含实现方法,需要使用 default 修饰,此类方法称为默认方法。默认方法在接口中必须提供实现,在实现类中可以按需重写。默认方法只能在实现类中或通过实现类对象调用。注意:当多个父接口中存在相同的默认方法时,子类中以就近原则继承。
public interface IMathOperation {
/**
* 定义接口默认方法 支持方法形参
*/
default void print(){
System.out.println(“ 这是数值运算基本接口。。。”);
}
}
4、静态方法
静态方法即通过 static 修饰的方法。接口中静态方法页也必须实现,提供了可以直接通过接口调用方法的方式。
public interface IMathOperation {
/**
* 定义接口默认方法 支持方法形参
*/
default void print(){
System.out.println(“ 这是数值运算基本接口。。。”);
}
/**
* 定义静态默认方法
*/
static void version(){
System.out.println(“ 这是 1.0 版简易计算器 ”);
}
}
5、接口默认方法使用
1)、定义 IMathOperation 接口 并提供默认打印方法
public interface IMathOperation {
/**
* 定义接口默认方法 支持方法形参
*/
default void print(){
System.out.println(“ 这是数值运算基本接口。。。”);
}
/**
* 定义静态默认方法
*/
static void version(){
System.out.println(“ 这是 1.0 版简易计算器 ”);
}
/**
* 整数加法运算方法
* @param a
* @param b
* @return
*/
public int add(int a,int b);
}
2)、子类实现
定义 MathOperationImpl 子类 实现 IMathOperation 接口
这里可以看到,在实现 IMathOperation 接口时可以选择实现 (也可以不实现,在子类方法中直接使用) 接口默认方法。
public class MathOperationImpl implements IMathOperation {
@Override
public int add(int a, int b) {
// 子类中可以直接调用父类接口默认方法
IMathOperation.super.print();
// 调用父类静态默认方法
IMathOperation.version();
return a+b;
}
}
3)、多个默认方法情况
使用 Java8 开发应用程序,子类实现多个接口时,对于接口默认方法定义可能会出现多个默认方法,并且接口默认方法可能会出现同名情况,此时对于子类在实现或者调用时通常遵循以下原则:
1. 类中的方法优先级最高
2. 如果第一条无法进行判断, 那么子接口的优先级更高: 函数签名相同时, 优先选择拥有最具体实现的默认方法的接口, 即如果 B 继承了 A, 那么 B 就比 A 更加具体
示例代码如下:
/**
* 定义手机接口 提供默认 info 方法
*/
public interface Phone {
default void info(){
System.out.println(“ 这是一部手机 ”);
}
}
/**
* 定义 MiPhone 子接口 并继承 Phone 父接口 同时也提供 info 方法
*/
public interface MiPhone extends Phone{
default void info(){
System.out.println(“ 这是一部小米手机 ”);
}
}
/**
* 实现 Phone MiPhone 接口
*/
public class M2sPhone implements Phone,MiPhone {
public static void main(String[] args) {
new M2sPhone().info();
}
}
打印结果: 这是一部小米手机
乐字节原创,转载请先联系,谢谢阅读。这是乐字节 Java8 新特性连载文章之一,欢迎继续关注看下一篇 Java8 新特性介绍。