默认方法

背景

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”。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 传统上,Java程序的接口是将相关方法按照约定组合到一起的方式。实现接口的类必须为接口中定义的每个方法提供一个实现...
    后端小哥阅读 358评论 0 0
  • 1.简述 在Java8之前,Java程序接口是将相关方法按照约定组合到一起的方式。实现接口的类必须为接口中定义的每...
    50fc16abfd49阅读 670评论 0 0
  • 默认方法Java 8中的接口现在支持在声明方法的同时提供实现。通过两种方式可以完成这种操作。其一,Java 8允许...
    PawsUp阅读 613评论 0 0
  • 默认方法是啥 默认方法是由default修饰符修饰,并像类中声明的其他方法一样包含方法体。是Java8中新添加的能...
    野狗道人闯红灯阅读 823评论 0 0
  • 在前面的文章中,我们学习了 Lambda 表达式和函数式接口。接下来我们继续讨论与之相关的特性 --- 默认方法。...
    懒癌正患者阅读 537评论 1 2