在日常开发中可能很多人对JAVA8的一些新特性不太关注:
有一个新特性看似不起眼,一旦用到了则会觉得非常的方便;
很多人都觉得接口接口里面只能写抽象方法,不能写实现方法;
实际上在JAVA8更新后,接口就可以添加默认方法和静态方法:默认方法用default修饰符修饰,会被其他接口继承;而静态方法使用static修饰符修饰;
非常典型的就是java.util.Map,有兴趣的可以去瞧一瞧;
为什么要有接口默认方法?
举一个很现实的例子:
我们的接口老早就写好了,后面因为各种业务问题,避免不了要修改接口。
在 Java 8 之前,比如要在一个接口中添加一个抽象方法,那所有的接口实现类都要去实现这个方法,不然就会编译错误,而某些实现类根本就不需要实现这个方法也被迫要写一个空实现,改动会非常大。
所以,接口默认方法就是为了解决这个问题,只要在一个接口添加了一个默认方法,所有的实现类就自动继承,不需要改动任何实现类,也不会影响业务,爽歪歪。
另外,接口默认方法可以被接口实现类重写。
为什么要有接口静态方法?
接口静态方法和默认方法类似,只是接口静态方法不可以被接口实现类重写。
接口静态方法只可以直接通过静态方法所在的接口名.静态方法名来调用。
注意点
在接口多继承的情况下,被继承的接口如果存在相同的默认方法,是会引起编译报错的,如果在继承接口类中不重写此默认方法是会报错的;
如果需要调用父类的方法可以通过 被继承类的类名.super.默认方法名 的形式调用父类默认方法;
有一种情况下例外:就是多继承的接口有相同的默认方法,也就是其中一个接口重写了父类的默认方法,这种情况下不需要重写默认方法;
默认方法与接口抽象方法定义相同:默认方法会优先于接口抽象方法,接口定义的方法会被忽略;