- Spring 5企业级开发实战
- 周冠亚 黄文毅
- 547字
- 2025-02-17 15:01:12
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();
执行测试代码,得到如下输出:
我是一辆巴士 开一辆巴士 按喇叭~