ThinkSSL🔒 一键申购 5分钟快速签发 30天无理由退款 购买更放心 广告
### [默认方法](https://lingcoder.gitee.io/onjava8/#/book/10-Interfaces?id=%e9%bb%98%e8%ae%a4%e6%96%b9%e6%b3%95) Java 8 为关键字**default**增加了一个新的用途(之前只用于**switch**语句和注解中)。当在接口中使用它时,任何实现接口却没有定义方法的时候可以使用**default**创建的方法体。默认方法比抽象类中的方法受到更多的限制,但是非常有用,我们将在“流式编程”一章中看到。现在让我们看下如何使用: ~~~ // interfaces/AnInterface.java interface AnInterface { void firstMethod(); void secondMethod(); } ~~~ 我们可以像这样实现接口: ~~~ // interfaces/AnImplementation.java public class AnImplementation implements AnInterface { public void firstMethod() { System.out.println("firstMethod"); } public void secondMethod() { System.out.println("secondMethod"); } public static void main(String[] args) { AnInterface i = new AnImplementation(); i.firstMethod(); i.secondMethod(); } } ~~~ 输出: ~~~ firstMethod secondMethod ~~~ 如果我们在**AnInterface**中增加一个新方法`newMethod()`,而在**AnImplementation**中没有实现它,编译器就会报错: ~~~ AnImplementation.java:3:error: AnImplementation is not abstract and does not override abstract method newMethod() in AnInterface public class AnImplementation implements AnInterface { ^ 1 error ~~~ 如果我们使用关键字**default**为`newMethod()`方法提供默认的实现,那么所有与接口有关的代码能正常工作,不受影响,而且这些代码还可以调用新的方法`newMethod()`: ~~~ // interfaces/InterfaceWithDefault.java interface InterfaceWithDefault { void firstMethod(); void secondMethod(); default void newMethod() { System.out.println("newMethod"); } } ~~~ 关键字**default**允许在接口中提供方法实现——在 Java 8 之前被禁止。 ~~~ // interfaces/Implementation2.java public class Implementation2 implements InterfaceWithDefault { @Override public void firstMethod() { System.out.println("firstMethod"); } @Override public void secondMethod() { System.out.println("secondMethod") } public static void main(String[] args) { InterfaceWithDefault i = new Implementation2(); i.firstMethod(); i.secondMethod(); i.newMethod(); } } ~~~ 输出: ~~~ firstMethod secondMethod newMethod ~~~ 尽管**Implementation2**中未定义`newMethod()`,但是可以使用`newMethod()`了。 增加默认方法的极具说服力的理由是它允许在不破坏已使用接口的代码的情况下,在接口中增加新的方法。默认方法有时也被称为*守卫方法*或*虚拟扩展方法*。