Spring 5企业级开发实战
上QQ阅读APP看书,第一时间看更新

5.2 接口默认方法

在Java 8之前,interface之中可以定义变量和方法,接口中的变量必须是被public static final修饰的,接口中的方法必须是被public abstract修饰的。由于这些修饰符都是默认的,所以在Java 8之前,以下的写法都是等价的:

在Java 8之前的版本中,接口是一柄双刃剑,优点是接口是面向抽象而不是面向具体编程的;缺陷是当需要修改接口时,需要修改全部实现该接口的类,修改成本高。

Java 8及以上版本中,Java允许在接口中定义static方法和default方法。Java 8通过默认方法解决了这个旧接口升级带来的成本过高的问题,在Java 8接口中可以添加新的方法,却不会破坏已有的接口实现,这个特性为旧接口升级提供了兼容性。

下面通过一个简单的案例阐述抽象方法的使用,案例中定义了一个Vehicle接口,其中包含一个抽象方法drive()方法和默认方法print(),接口如下:

Car实现了Vehicle接口:

下面测试类DefaultMethodDemo中,通过Car对象分别调用两个方法:

当两个接口中有两个相同的默认方法时,子类如果同时实现这两个接口,将会出现编译错误,需要在子类中重写默认方法。

Java 8的接口除了可以声明默认方法,还可以声明并且实现静态方法。

在下面的案例代码中创建了Whistle接口并声明默认方法print()和静态方法horn(),Whistle代码如下:

创建Bus类实现Vehicle接口和Whistle接口,Bus代码如下:

测试代码中创建Bus对象,并调用各个方法:

     Bus bus = new Bus();
     bus.print();
     bus.drive();
     Whistle.horn();

执行测试代码,得到如下输出:

     我是一辆巴士
     开一辆巴士
     按喇叭~