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