所有示例代码打包下载 : 点击打开链接
Java8新特性 :
- 接口新增默认方法和静态方法
- Optional类
- Lambda表达式
- 方法引用
- Stream API - 函数式操作流元素集合
- Date/Time API
- 新API和工具
- Nashorn , JavaScript引擎
1 . 接口默认方法和静态方法
静态方法比较简单 , 就是用static修饰的方法 , 可以用接口名.方法名直接调用 , 不可重写 .
而默认方法就是接口里面写带有实现的方法(Java8之前接口中的方法必须是抽象的) , 而且该接口的实现类并不需要实现该方法 .
默认方法的书写形式只需要在方法名前面加个default关键字声明即可 .
Q : 为什么要有这个新特性 ?
之前的接口中 , 如果需要修改接口增加新方法的时候 , 如果该接口有N个实现类 , 则必须要重写该接口及其所有的实现类 , 即使该实现类用不上这个新方法 , 也必须显式的实现该接口填充空的方法体内容 . 所以默认方法的目的是为了解决接口的修改与现有的实现不兼容的问题 . 以Java8为例 , Java8之前的集合框架没有foreach方法(参看集合顶级接口Iterable<T>) , 通常能想到的解决方法就是在JDK里给相关的接口添加新的方法及实现 . 然而 , 对于已经发布的版本 , 是没法在给接口添加新方法的同时不影响已有的实现 , 所以引进了默认方法 .
代码Demo :
package com.xbz.java8.defualtMethod;
/**
* 接口默认方法和静态方法
*/
public interface Interface1 {
/**
* 接口静态方法 , 用static关键字修饰 , 用接口名.方法名直接调用
* 默认作用域为public(省略不写也是public) , 不可用protected , private , 否则编译直接不通过
*/
static void staticMethod1(){
System.out.println("Interface1.staticMethod1()");
}
/**
* 接口默认方法 , 用default关键字修饰 , 用实现类的对象调用
* (不可用接口直接调用 , 默认方法实际上还是属于实现类的实现 , 只不过是接口为所有实现类提供的默认的实现内容)
* 默认作用域为public(省略不写也是public) , 不可用protected , private , 否则编译直接不通过
*/
default void defaultMethod1(){
System.out.println("Interface1.defaultMethod1()");
}
/**
* 接口中可以存在多个默认方法
*/
default void defaultMethod2(){
System.out.println("Interface1.defaultMethod2()");
}
}
/** @title 接口1实现类 , 无需实现默认方法和静态方法 */
public class Impl1 implements Interface1{}
package com.xbz.java8.defualtMethod;
/**
* @title 接口默认方法和静态方法Demo1
*/
public class DefaultMethodDemo1 {
public static void main(String[] args){
Interface1.staticMethod1();//静态方法由接口名.方法名调用
Impl1 impl1 = new Impl1();
impl1.defaultMethod1();//默认方法由实现对象.方法名调用
impl1.defaultMethod2();;
}
}
输出结果
Interface1.staticMethod1()
Interface1.defaultMethod1()
Interface1.defaultMethod2()
默认方法也可以重写 , 重写方法无需再书写default关键字 , 等同于接口抽象方法的重写
package com.xbz.java8.defualtMethod;
/** @title 接口1实现类 , 无需实现默认方法和静态方法 */
public class Impl1 implements Interface1{
/** 默认方法重写 , 写法等同于接口抽象方法的重写 */
public void defaultMethod1(){
System.out.println("[Interface1]Impl1.defaultMethod1()");
}
}
重写之后 , 再调用输出的就是子类实现的内容了
Interface1.staticMethod1()
[Interface1] Impl1.defaultMethod1()
Interface1.defaultMethod2()
由于Java的接口是多继承的 , 就可能存在一个类实现多个接口 , 如果多个接口中多有默认方法且不冲突(方法签名不冲突) , 则互不影响 , 若存在方法签名一样的默认方法 , 则要求子类必须显式实现并重写默认方法