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
是两个接口I
和J
的子types,则I
和J
都声明具有相同签名和结果的default
方法,I
和J
都不是另一个的子接口。
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-不作为接口中使用的其他常规方法被假定为公共或抽象。