![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=1739124646-ER6yATo2VPL16SzeQcj6ZoeNLBjxa7te-0-62acc659d4dacb666a1c3af333ad405e)
在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=1739124646-1i8WRKrKxKnYKaU56gSTMlRi2mujFO5R-0-566ec4a18bbd1460d42806fdb231ba07)
Car实现了Vehicle接口:
![](https://epubservercos.yuewen.com/45D01C/15056703904176006/epubprivate/OEBPS/Images/Figure-P145_96186.jpg?sign=1739124646-JDdzoLNfUj9APyODRnfncVkZNXJf2yuO-0-066fcf854fe7df5846083711908fa969)
下面测试类DefaultMethodDemo中,通过Car对象分别调用两个方法:
![](https://epubservercos.yuewen.com/45D01C/15056703904176006/epubprivate/OEBPS/Images/Figure-P146_96184.jpg?sign=1739124646-Pcv6AWtSVuUOil9MqVI5FSHIUheAIN0n-0-403a377121f1c852cd6edb234e979206)
当两个接口中有两个相同的默认方法时,子类如果同时实现这两个接口,将会出现编译错误,需要在子类中重写默认方法。
Java 8的接口除了可以声明默认方法,还可以声明并且实现静态方法。
在下面的案例代码中创建了Whistle接口并声明默认方法print()和静态方法horn(),Whistle代码如下:
![](https://epubservercos.yuewen.com/45D01C/15056703904176006/epubprivate/OEBPS/Images/Figure-P146_96183.jpg?sign=1739124646-x4EihOQZm1690b8tD7SBuSTPva0VeVH7-0-6a10e41da93ce8440d2777adbc40a676)
创建Bus类实现Vehicle接口和Whistle接口,Bus代码如下:
![](https://epubservercos.yuewen.com/45D01C/15056703904176006/epubprivate/OEBPS/Images/Figure-P147_96179.jpg?sign=1739124646-HNz9QvnDXrHNjcX3sSBJg6OUYP8IPhPU-0-318737df49f4b61fe7bc51dcdb5011ba)
测试代码中创建Bus对象,并调用各个方法:
Bus bus = new Bus(); bus.print(); bus.drive(); Whistle.horn();
执行测试代码,得到如下输出:
我是一辆巴士 开一辆巴士 按喇叭~