哪個網站的體驗做的最好搜索推廣渠道
default 關鍵字:是在 Java 8 中引入的新概念,也可稱為 Virtual extension methods——虛擬擴展方法與public、private等都屬于修飾符關鍵字,與其它兩個關鍵字不同之處在于default關鍵字大部分都用于修飾接口。
default 修飾方法時只能在接口類中使用,在接口中被 default 標記的方法可以直接寫方法體,而無需修改所有實現了此接口的類。
接口默認方法
我們都知道 Java 中的接口是用來實現的,接口中是沒有實現的方法。
使用 default 關鍵字可以打破這個限制,當定義了一個接口,但是我們接口中的方法用了 default 關鍵字,我們就可以在這個方法中進行實現了。
這時,我們不需要再定義一個實現類類實現接口中的所有方法。
之前的接口是個雙刃劍,好處是面向抽象而不是面向具體編程,缺陷是,當需要修改接口時候,需要修改該接口的全部實現類。
同時因為設計實現的問題,我們通過設計接口來進行不同的實現,在基礎框架曾經,這個設計是有很多好處的。
但,在實際業(yè)務層,一個接口多個實現的方法反而誰增加很多復雜度。
使用 Default 關鍵字
用 default 關鍵字定義的方法是全局的,你可以在不同接口中定義一個相同的方法,這個沒有問題。
如下圖,我們在代碼中定義了 2 個接口,這 2 個接口都有一個相同的 default 方法。
實現類中只實現一個接口
如果在實現類中我們只實現一個接口。
例如下圖,我們修改了我們的方法,我們在實現中只實現了 TestInterface1
上面的程序也是可以運行的沒有問題。
實現類中實現 2 個接口
問題就是在這里了。
如果我們在實現類中同時實現了 2 個接口,但這 2 個接口都有一個相同方法名的 default 方法。
編譯器會在這里報錯,簡單來說就是默認的方法沖突,程序不知道應該用哪個實現方法。
這個應該很好理解,因為這 2 個接口中都有相同的方法名,而且這個方面都是默認的,程序運行的時候確實不知道應該是用 TestInterface1 還是 TestInterface2 的默認方法。
所以可以在這里用一個?@Override?來告訴實現類,我們是用的那個實現方法。
甚至
@Overridepublic void show() {TestInterface1.super.show();TestInterface2.super.show();}
這樣寫都是沒有問題的。
運行的結果為:
Default TestInterface - 1
Default TestInterface - 2
總結
Default 方法通常用在接口中,用于為接口中定義的方法提供一個默認的實現。
當我們使用了 default 關鍵字修飾了方法后,我們可以不為接口定義實現,而直接使用接口中定義的默認方法來處理邏輯。
我們測試的代碼網站邏輯如上圖。
下面為文本的代碼,供大家拷貝和在本地進行的是
interface TestInterface1 {// default methoddefault void show() {System.out.println("Default TestInterface - 1 ");}
}interface TestInterface2 {// Default methoddefault void show() {System.out.println("Default TestInterface - 2");}
}public class Main implements TestInterface1, TestInterface2 {private static final Logger logger = LoggerFactory.getLogger(Main.class);public static void main(String[] args) {new Main().show();}@Overridepublic void show() {TestInterface1.super.show();TestInterface2.super.show();}
}
因為 default 這個關鍵字還比較新,在 JDK 8 以后才有的,因此有必要在面試之前了解下,在實際的項目上,可能用的情況不多。
Java 中的 Default 關鍵字 - Java - iSharkFly