转载请注明来自:黄朝辉的博客
今天在Iterable
接口中看见了一个“新方法”forEach
,在它的前面有个default
关键字。所以特意查了下它的用法。
下面是一个小例子:
package cn.sehzh;public class Main implements B{ public static void main(String[] args) { } @Override public void run() { System.out.PRintln("I'm running..."); }}interface B{ public void run();}在上面的例子中,Main类实现了接口B中的run方法。现在我们想在接口B中增加一个方法,但是又不影响到Main类,这时就要用到default方法了。 修改接口B如下:
interface B{ public void run(); default public void sleep(){ System.out.println("I'm sleep..."); }}我们在接口B中增加了一个sleep方法,在Main类里不需要修改任何代码。如果去掉default,那么就需要在所有实现了接口B的类中增加相应sleep方法的实现。 接口中有了default方法后,与抽象类更像了。(个人观点) 这样一来就有了一个问题,请看下面的例子:
package cn.sehzh;public class Main implements B, C { public static void main(String[] args) { } @Override public void run() { System.out.println("I'm running..."); }}interface B { public void run(); default public void sleep() { System.out.println("I'm sleep..."); }}interface C { default public void sleep() { System.out.println("I'm sleep in C..."); }}Main类既实现了接口B又实现了接口C,现在接口B和接口C中都有一个sleep方法。 这时就会报下面的错误:
Duplicate default methods named sleep with the parameters () and () are inherited from the types C and B
解决方法也很简单,在Main类中重写sleep方法即可。
public class Main implements B, C { public static void main(String[] args) { } @Override public void run() { System.out.println("I'm running..."); } @Override public void sleep() { B.super.sleep(); }}新闻热点
疑难解答