![Spring 5企业级开发实战](https://wfqqreader-1252317822.image.myqcloud.com/cover/807/26542807/b_26542807.jpg)
上QQ阅读APP看书,第一时间看更新
5.2 接口默认方法
在Java 8之前,interface之中可以定义变量和方法,接口中的变量必须是被public static final修饰的,接口中的方法必须是被public abstract修饰的。由于这些修饰符都是默认的,所以在Java 8之前,以下的写法都是等价的:
![](https://epubservercos.yuewen.com/45D01C/15056703904176006/epubprivate/OEBPS/Images/Figure-P144_96189.jpg?sign=1739361058-Zmrf5mES7cTrekooae3AiXLJlH2UIHTc-0-b090ff95f232cb1823914277ac4e8889)
在Java 8之前的版本中,接口是一柄双刃剑,优点是接口是面向抽象而不是面向具体编程的;缺陷是当需要修改接口时,需要修改全部实现该接口的类,修改成本高。
Java 8及以上版本中,Java允许在接口中定义static方法和default方法。Java 8通过默认方法解决了这个旧接口升级带来的成本过高的问题,在Java 8接口中可以添加新的方法,却不会破坏已有的接口实现,这个特性为旧接口升级提供了兼容性。
下面通过一个简单的案例阐述抽象方法的使用,案例中定义了一个Vehicle接口,其中包含一个抽象方法drive()方法和默认方法print(),接口如下:
![](https://epubservercos.yuewen.com/45D01C/15056703904176006/epubprivate/OEBPS/Images/Figure-P145_96185.jpg?sign=1739361058-9QqnhBdJpOLHjdmyU42nh1rtNbocIMIF-0-b987d3db11291369d09ef710b02b06a0)
Car实现了Vehicle接口:
![](https://epubservercos.yuewen.com/45D01C/15056703904176006/epubprivate/OEBPS/Images/Figure-P145_96186.jpg?sign=1739361058-uH2GAM9YCnzEIqek25zpKNfOQExT8IWk-0-65920743e144e2da909fee905f31bee0)
下面测试类DefaultMethodDemo中,通过Car对象分别调用两个方法:
![](https://epubservercos.yuewen.com/45D01C/15056703904176006/epubprivate/OEBPS/Images/Figure-P146_96184.jpg?sign=1739361058-jqTqeqDM7cBNwC6kPUXgl0WiPjqCgnsE-0-f721d9e23060e54d234a7a009bcbfc31)
当两个接口中有两个相同的默认方法时,子类如果同时实现这两个接口,将会出现编译错误,需要在子类中重写默认方法。
Java 8的接口除了可以声明默认方法,还可以声明并且实现静态方法。
在下面的案例代码中创建了Whistle接口并声明默认方法print()和静态方法horn(),Whistle代码如下:
![](https://epubservercos.yuewen.com/45D01C/15056703904176006/epubprivate/OEBPS/Images/Figure-P146_96183.jpg?sign=1739361058-9lx0emUQOHvcCWlnJhCY3IVUTG9WGlAt-0-85beba471a1dc9f2d700ab8f2a5cbaed)
创建Bus类实现Vehicle接口和Whistle接口,Bus代码如下:
![](https://epubservercos.yuewen.com/45D01C/15056703904176006/epubprivate/OEBPS/Images/Figure-P147_96179.jpg?sign=1739361058-62g6F4zH2zY5LNuMBySFEzErcDJgOZML-0-9f1c245cd8c6e4af66c827bbc965c5e6)
测试代码中创建Bus对象,并调用各个方法:
Bus bus = new Bus(); bus.print(); bus.drive(); Whistle.horn();
执行测试代码,得到如下输出:
我是一辆巴士 开一辆巴士 按喇叭~