可能在偶然间, 我们突然发现, 在点开某一个接口的源码的时候, 我们突然发现接口里面的方法竟然有了方法体。 莫慌, 那么恭喜你, 你使用的JDK版本一定是在JDK8之后的版本, 这就是JDK8对接口的增强(默认接口方法和静态接口方法)

情景及代码案例

现在我们有了人这个类, 我们知道人之所以区别于其他的动物, 很大部分原因是因为我们的交流沟通能力很强, 于是我们定义一个插件接口。 这个接口里有两个方法等待我们实现。 ​人说什么国家的语言​, ​人用什么进行说话​。

首先在我们中国, 人分东北人、河南人、福建人…那么好, 我们每一种人都继承说话这个接口实现第一个方法, 我们都说中国话, 那么我们一个类接一个类的去实现这个接口, 会造成大量的代码重复, 违反了我们编码的原则, 也不利于以后的维护, 于是默认方法来了, 好我在代码里就给你先实现, 人说中国话!

/**
* 接口---说话
*
* <pre>
* 用来测试讲解JDK8对接口的增强
* </pre>
*
* @author YangHang
* @Date 2018年12月8日 上午12:18:00
*
*/
public interface Speak {

/**
* 默认方法
*/
default void speakByLanguage() {
System.out.println("说中文");
}
}

使用默认接口的好处是, 中国大部分人都说中国普通话, 如果有个别的地区非要坚持自己的方言, 举个栗子。 东北人我就说东北话, 好, 东北人这个类就重新这个方法, 我就要说普通话。没错, 默认方法是可以被重写的。

jdk8对接口的增强(默认接口方法与静态接口方法)_默认接口方法

好, 我们再来说第二个接口方法, 人用什么说话, 好嘛, 除了嘴, 全世界的人民都找不出其他部位来了。 如果来了一种人非要重写这个方法, 说我们就要用眉毛说话, 这不是捣乱么。 于是乎, 我们把用什么说话定义成静态接口方法。 实现这个接口我也不让你重写, 省的你捣乱。

/**
* 接口---说话
*
* <pre>
* 用来测试讲解JDK8对接口的增强
* </pre>
*
* @author YangHang
* @Date 2018年12月8日 上午12:18:00
*
*/
public interface Speak {

/**
* 默认方法
*/
default void speakByLanguage() {
System.out.println("说中文");
}

/**
* 静态方法
*/
static void speakWith() {
System.out.println("用嘴说话");
}
}

我们可以看到, 这个静态接口方法是不可以被重写的

jdk8对接口的增强(默认接口方法与静态接口方法)_静态接口方法_02

静态接口想要调用, 需要通过接口名点静态方法名出来, 就像类调用静态方法一样。(用实现类是点不出来的)

最后, 如果我们实现的多个接口有一样方法签名的默认方法, 好嘛, 我知道你到底要说什么话, 你哦这个实现类要搞事情啊, 必须重写, 不然我怎么知道你要说什么语言呢? 静态的接口方法由于是由接口直接调用, 所以不收限制。