在日常开发中可能很多人对JAVA8的一些新特性不太关注:

有一个新特性看似不起眼,一旦用到了则会觉得非常的方便;

很多人都觉得接口接口里面只能写抽象方法,不能写实现方法;

实际上在JAVA8更新后,接口就可以添加默认方法和静态方法:默认方法用default修饰符修饰,会被其他接口继承;而静态方法使用static修饰符修饰;

非常典型的就是java.util.Map,有兴趣的可以去瞧一瞧;

为什么要有接口默认方法?

举一个很现实的例子:

我们的接口老早就写好了,后面因为各种业务问题,避免不了要修改接口。

在 Java 8 之前,比如要在一个接口中添加一个抽象方法,那所有的接口实现类都要去实现这个方法,不然就会编译错误,而某些实现类根本就不需要实现这个方法也被迫要写一个空实现,改动会非常大。

所以,接口默认方法就是为了解决这个问题,只要在一个接口添加了一个默认方法,所有的实现类就自动继承,不需要改动任何实现类,也不会影响业务,爽歪歪。

另外,接口默认方法可以被接口实现类重写。

为什么要有接口静态方法?

接口静态方法和默认方法类似,只是接口静态方法不可以被接口实现类重写。

接口静态方法只可以直接通过静态方法所在的 接口名.静态方法名 来调用。

注意点

在接口多继承的情况下,被继承的接口如果存在相同的默认方法,是会引起编译报错的,如果在继承接口类中不重写此默认方法是会报错的;

如果需要调用父类的方法可以通过 被继承类的类名.super.默认方法名 的形式调用父类默认方法;

有一种情况下例外:就是多继承的接口有相同的默认方法,也就是其中一个接口重写了父类的默认方法,这种情况下不需要重写默认方法;

默认方法与接口抽象方法定义相同:默认方法会优先于接口抽象方法,接口定义的方法会被忽略;