Java中默认关键字的用途是什么?

Java中的接口与类相似,但接口的主体只能包含抽象方法final字段(常量)。

最近我看到一个问题,看起来像这样

 interface AnInterface { public default void myMethod() { System.out.println("D"); } } 

根据接口定义, 允许抽象方法 。 为什么它允许我编译上面的代码? 什么是default关键字?

另一方面,当我试图写下面的代码,然后说modifier default not allowed here

 default class MyClass{ } 

代替

 class MyClass { } 

任何人都可以告诉我的default关键字的目的? 是否只允许在一个界面内? 它与default (没有访问修饰符)有什么不同?

这是Java 8中的一个新特性,它允许一个interface提供一个实现。 在Java 8 JLS-13.5.6中描述。 接口方法声明读取(部分)

添加default方法或将方法从abstract更改为default方法不会中断与预先存在的二进制文件的兼容性,但如果预先存在的二进制文件试图调用方法,则可能会导致IncompatibleClassChangeError 。 如果限定typesT是两个接口IJ的子types,则IJ都声明具有相同签名和结果的default方法, IJ都不是另一个的子接口。

JDK 8的新增内容 (部分)

默认的方法使新的function被添加到库的接口,并确保二进制兼容性为这些接口的旧版本编写的代码。

Java 8中添加了默认方法,主要是为了支持lambdaexpression式。 devise者(巧妙地,在我看来)决定创build一个接口的匿名实现的lambdas语法。 但是,由于lambdas只能实现一个单一的方法,他们将被限制在一个单一的方法,这将是一个非常严格的限制接口。 相反,添加了默认方法以允许使用更复杂的接口。

如果您需要说服一些关于由于lambda导致default的说法,请注意,Mark Reinhold在2009年提出的许多 “Lambda项目”的提案中都提到“扩展方法”作为支持lambda的强制性function。

下面是一个演示这个概念的例子:

 interface Operator { int operate(int n); default int inverse(int n) { return -operate(n); } } public int applyInverse(int n, Operator operator) { return operator.inverse(n); } applyInverse(3, n -> n * n + 7); 

我意识到,但是应该说明default如何支持lambdas。 由于inverse是默认的,所以如果需要的话可以很容易地被实现类重写。

Java 8中引入了一个新的概念,称为默认方法。 默认方法是那些有一些默认实现的方法,并有助于在不破坏现有代码的情况下演化接口。 让我们看一个例子:

  public interface SimpleInterface { public void doSomeWork(); //A default method in the interface created using "default" keyword default public void doSomeOtherWork(){ System.out.println("DoSomeOtherWork implementation in the interface"); } } class SimpleInterfaceImpl implements SimpleInterface{ @Override public void doSomeWork() { System.out.println("Do Some Work implementation in the class"); } /* * Not required to override to provide an implementation * for doSomeOtherWork. */ public static void main(String[] args) { SimpleInterfaceImpl simpObj = new SimpleInterfaceImpl(); simpObj.doSomeWork(); simpObj.doSomeOtherWork(); } } 

输出是:

做一些工作在课堂上的实施
DoSomeOtherWork在界面中执行

默认方法使您可以将新function添加到应用程序的界面。 它也可以用来有一个多inheritance 。 除了默认方法之外,您还可以在接口中定义静态方法。 这使您更容易组织帮助方法

Java™教程中有一个非常好的解释,部分解释如下:

考虑一个涉及电脑控制汽车制造商的例子,他们发布了行业标准接口,描述哪些方法可以用来操作汽车。 如果这些计算机控制的汽车制造商为他们的汽车增加新的function,如飞行? 这些制造商将需要指定新的方法,使其他公司(如电子制导仪器制造商)能够将其软件适用于飞行汽车。 这些汽车制造商将在哪里宣布这些与飞行有关的新方法? 如果将它们添加到原始接口中,那么实现这些接口的程序员将不得不重写它们的实现。 如果将它们作为静态方法添加,那么程序员会将它们视为效用方法,而不是作为必要的核心方法。

默认方法使您能够为库的接口添加新function,并确保与为这些接口的旧版本编写的代码的二进制兼容性。

新的Java 8function( 默认方法 )允许接口在使用default关键字进行标记时提供实现。

例如:

 interface Test { default double getAvg(int avg) { return avg; } } class Tester implements Test{ //compiles just fine } 

Interface Test使用default关键字,它允许接口提供方法的默认实现,而不需要在使用接口的类中实现这些方法。

向后兼容性:假设你的接口是由数百个类来实现的,修改这个接口将迫使所有的用户实现新添加的方法,尽pipe它对于许多实现你的接口的类来说并不是必不可less的。

事实与限制:

1 – 只能在接口中声明,不能在类或抽象类中声明。

2 – 必须提供一个机构

3-不作为接口中使用的其他常规方法被假定为公共或抽象。