轉載請註明來自:黃朝輝的博客
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();
}
}