Java default方法

转载请注明来自:黄朝辉的博客

1.前言

今天在Iterable接口中看见了一个“新方法”forEach,在它的前面有个default关键字。所以特意查了下它的用法。

2.示例与说明

下面是一个小例子:

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();
    }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章