之前看一段java8的代码,发现接口都可以实现方法了,当然在老的教程里面是会告诉我们接口只是定义了方法的,为什么Java8要这样设计呢?看到一句话,既在不破坏java现有实现架构的情况下能往接口里增加新方法,引入Default方法到Java8,正是为了这个目的:优化接口的同时,避免跟现有实现架构的兼容问题。
看java8比较大的改动就是引入Lambdas表达式,很多接口中加入了相应的方法,比如下面的Iterable接口中增加了foreach的实现。如果在java之前的版本,在接口中定义了方法,我们实现接口的类,必须要实现,否则编译会报错,所以要想在某个接口中增加方法,而不修改现该接口现有的实现类,这是不可能做到的。但是按照我们Lambdas的编写,Default应时而生。
当然在collection接口有我们一直用的Stream操作。
然后用起来就很神奇了,如果我定义了两个接口都是default方法,那么写个类实现这两个方法,这不就是多继承吗?其中如果有相同的方法,那么这个类是要重新实现以下。其实我觉得我们在正常使用中,还是按照java7之前的原则写吧,因为一般业务我们没有很复杂的这种设计和关系。而在但是对于Java集合API的优化升级,并达到无缝地结合Lambda表达式来说,Default 方法是至关重要的特性。
如果不是考虑兼容,那么留着抽象类还有什么用呢?因为抽象类还可以有状态呀,还暂时无法完全替代抽象类。可以发现在Java9中不用default,也可以定义非公有的方法,下面我随便写了一个,还不知道java9中的目的是什么。未来的Java版本的接口可能会有更强的功能,或许能更大程度地替代原本需要使用抽象类的场景。
接口这是要上天呀!