首页 > 代码库 > 默认方法

默认方法

  Java程序的接口是将相关方法按照约定组合到一起的方式,实现接口的类必须为接口中定义的每个方法提供一个实现,或从父类中继承它的实现。

  Java8允许接口内声明静态方法,还引入了默认方法的功能。默认方法用default修饰。

  变更对Java程序的影响大体可以分成三种类型的兼容性:二进制级的兼容,源代码级的兼容以及函数行为的兼容。向接口中添加新方法是二进制级的兼容。二进制级的兼容表示现有的二进制执行文件能无缝持续链接。源代码级的兼容性表示引入变化后,现有的程序依然能成功编译通过。函数行为的兼容性表示变更发生后,程序接受同样的输入能得到同样的结果。

  

  接口包含的方法签名在它的实现类中也可以不提供实现。实际上,缺失的方法实现会作为接口的一部分由实现类继承,而无需由实现类提供。

  抽象类和抽象接口的区别

    一个类只能继承一个抽象类,但是一个类可以实现多个接口

    一个抽象类可以通过实例变量保存一个通用状态,而接口是不可以有实例变量的

  默认方法的两种应用场景:可选方法和行为的多继承。

    在Java8中,Iterator接口为remobe方法提供了一个默认的实现

 

  代理是创建一个类,通过该类的成员变量直接调用该类的方法。

  声明为final的类不能被其它的类继承。

 

  若一个类使用相同的函数签名从多个地方继承了方法,此时应按照如下规则:

    类或父类中显式声明的方法优先级最高

    若类或父类中没有声明方法,则提供最具体实现的默认方法的接口优先级最高

    若冲突依旧无法解决,则只能显示地指定在类中应使用哪个接口中的方法(Java引入了Class.super.method()方法调用父类接口中的方法)

public interface A{
  default void hello(){
     System.out.println("Hello from A");
  }
}

public interface B{
  default void hello(){
    System.out.println("Hello from B")
  }
}

public class C implements B, A{
  void hello(){
    B.super.hello();  
  }
}

 

默认方法