背景
java中实现接口的类必须为接口中定义的每个方法提供一个实现,或者从父类中继承它的实现。这样就导致了一个问题,一旦接口更新,那么所有实现类为了适配新的接口也必须进行修改。
为解决这一问题,Java 8允许在接口内声明静态方法,其二,Java 8引入了一个新功能,叫默认方法。
使用
如何判别一个方法来源于何处?
如果一个类使用相同的函数签名从多个地方(比如另一个类或接口)继承了方法,通过三条规则可以进行判断。
(1) 类中的方法优先级最高。类或父类中声明的方法的优先级高于任何声明为默认方法的优 先级。
(2) 如果无法依据第一条进行判断,那么子接口的优先级更高:函数签名相同时,优先选择 拥有最具体实现的默认方法的接口,即如果B继承了A,那么B就比A更加具体。
(3) 最后,如果还是无法判断,继承了多个接口的类必须通过显式覆盖和调用期望的方法,显式地选择使用哪一个默认方法的实现。
例:下面代码会打印什么
public interface A {
default void hello() {
System.out.println("Hello from A");
}
}
public interface B extends A {
default void hello() {
System.out.println("Hello from B");
}
}
public class C implements B, A {
public static void main(String... args) {
new C().hello();
}
}
类C没有提供hello的实现,所以按照规则(2),应该选择的是提供了最具体实现的 默认方法的接口。由于B比A更具体,所以应该选择B的hello方法。所以,程序会打印输出“Hello from B”。
网友评论