一、基本概念
default methods enable you to add new functionality to the interfaces of your libraries and ensure binary compatibility with code written for older versions of those interfaces.
默认方法使您能够添加新的功能到你现有库的接口中,并确保与采用老版本接口编写的代码的二进制兼容性。
什么是默认方法(default methods)
即接口可以有实现方法,而且不需要实现类去实现其方法。只需在方法名前面加个default关键字即可,这些方法默认是
为什么要有默认方法
为什么要有这个特性?首先,之前的接口是个双刃剑,好处是面向抽象而不是面向具体编程,缺陷是,当需要修改接口时候,需要修改全部实现该接口的类,目前的java 8之前的集合框架没有foreach方法,通常能想到的解决办法是在jdk里给相关的接口添加新的方法及实现。然而,对于已经发布的版本,是没法在给接口添加新方法的同时不影响已有的实现。所以引进的默认方法。他们的目的是为了解决接口的修改与现有的实现不兼容的问题
二、 java 8抽象类与接口的区别
相同点:
1.都是抽象类型;
2.都可以有实现方法(java8才可以)
3.都可以不需要实现类或者继承者去实现所有方法
不同点
1.抽象类不可以多重继承,接口可以(无论是多重类型继承还是多重行为继承);
2.抽象类和接口所反映出的设计理念不同。其实抽象类表示的是"is-a"关系,接口表示的是"like-a"关系;
3.接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值;抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值。
三、多重继承的冲突说明
由于同一个方法可以从不同接口引入,自然而然的会有冲突的现象,默认方法判断冲突的规则如下:
1.一个声明在类里面的方法优先于任何默认方法(classes always win)
2.否则,则会优先选取最具体的实现,比如下面的例子 b重写了a的hello方法。
四、如何扩展或实现带有默认方法的接口?
当前扩展一个默认方法的接口时,你可以采用以下三种方式:
1:让扩展类继承默认方法,根据不管是否存在默认方法
2:重新声明默认方法,使其变为一个抽象方法(注意,扩展类的实现类必须实现此方法)
3:重新定义默认方法,覆盖(override)父类的默认方法
五、默认方法样例代码
六、整合默认方法、静态方法到已经存在的接口
下面的代码是有关扑克牌游戏中的洗牌,针对牌排序,打散,发牌的部分源代码