Java 8新特性——default方法(defender方法)介绍
轉載自?Java 8新特性——default方法(defender方法)介紹
?
我們都知道在Java語言的接口中只能定義方法名,而不能包含方法的具體實現(xiàn)代碼。接口中定義的方法必須在接口的非抽象子類中實現(xiàn)。下面就是關于接口的一個例子:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | publicinterface SimpleInterface { ??publicvoid doSomeWork(); } ? classSimpleInterfaceImpl implementsSimpleInterface{ ??@Override ??publicvoid doSomeWork() { ????System.out.println("Do Some Work implementation in the class"); ??} ? ??publicstatic void main(String[] args) { ????SimpleInterfaceImpl simpObj = newSimpleInterfaceImpl(); ????simpObj.doSomeWork(); ??} } |
那么,如果我們在SimpleInterface里面添加一個新方法,會怎樣呢?
| 1 2 3 4 | publicinterface SimpleInterface { ??publicvoid doSomeWork(); ??publicvoid doSomeOtherWork(); } |
如果我們嘗試編譯上面的這段代碼,會得到如下結果:
| 1 2 3 4 5 6 | $javac .\SimpleInterface.java .\SimpleInterface.java:18: error: SimpleInterfaceImpl is not abstract and does not override abstract method doSomeOtherWork() inSimpleInterface class SimpleInterfaceImpl implements SimpleInterface{ ^ 1 error |
因為接口有這個語法限制,所以要直接改變/擴展接口內的方法變得非常困難。我們在嘗試強化Java 8 Collections API,讓其支持lambda表達式的時候,就面臨了這樣的挑戰(zhàn)。為了克服這個困難,Java 8中引入了一個新的概念,叫做default方法,也可以稱為Defender方法,或者虛擬擴展方法(Virtual extension methods)。
Default方法是指,在接口內部包含了一些默認的方法實現(xiàn)(也就是接口中可以包含方法體,這打破了Java之前版本對接口的語法限制),從而使得接口在進行擴展的時候,不會破壞與接口相關的實現(xiàn)類代碼。接下來,讓我們看一個例子:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | publicinterface SimpleInterface { ??publicvoid doSomeWork(); ? ??//A default method in the interface created using "default" keyword ??//使用default關鍵字創(chuàng)在interface中直接創(chuàng)建一個default方法,該方法包含了具體的實現(xiàn)代碼 ??defaultpublic void doSomeOtherWork(){ ????System.out.println("DoSomeOtherWork implementation in the interface"); ??} } ? classSimpleInterfaceImpl implementsSimpleInterface{ ??@Override ??publicvoid doSomeWork() { ????System.out.println("Do Some Work implementation in the class"); ??} ??/* ???* Not required to override to provide an implementation ???* for doSomeOtherWork. ???* 在SimpleInterfaceImpl里,不需要再去實現(xiàn)接口中定義的doSomeOtherWork方法 ???*/ ? ??publicstatic void main(String[] args) { ????SimpleInterfaceImpl simpObj = newSimpleInterfaceImpl(); ????simpObj.doSomeWork(); ????simpObj.doSomeOtherWork(); ??} } |
該程序的輸出是:
| 1 2 | Do Some Work implementation inthe class DoSomeOtherWork implementation inthe interface |
以上是對default方法的一個非常簡要的介紹。如果有興趣的話,還可以通過看這篇文檔,來獲取更深層次的理解。
更新:
現(xiàn)在大家問得比較多的一個問題是:如果一個類實現(xiàn)了兩個接口(可以看做是“多繼承”),這兩個接口又同時都包含了一個名字相同的default方法,那么會發(fā)生什么情況? 在這樣的情況下,編譯器會報錯。讓我用例子來解釋一下:
| 1 2 3 4 5 6 7 8 9 10 11 | publicinterface InterfaceWithDefaultMethod { ??publicvoid someMethod(); ??defaultpublic void someOtherMethod(){ ????System.out.println("Default method implementation in the interface"); ??} } publicinterface InterfaceWithAnotherDefMethod { ??defaultpublic void someOtherMethod(){ ????System.out.println("Default method implementation in the interface"); ??} } |
然后我們定義一個類,同時實現(xiàn)以上兩個接口:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 | publicclass DefaultMethodSample implements ??InterfaceWithDefaultMethod, InterfaceWithAnotherDefMethod{ ? ??@Override ??publicvoid someMethod(){ ????System.out.println("Some method implementation in the class"); ??} ??publicstatic void main(String[] args) { ????DefaultMethodSample def1 = newDefaultMethodSample(); ????def1.someMethod(); ????def1.someOtherMethod(); ??}? } |
如果編譯以上的代碼,會得到一個編譯器錯誤,如下所示。因為編譯器不知道應該在兩個同名的default方法中選擇哪一個,因此產(chǎn)生了二義性。
原文鏈接:?blog.sanaulla.info?翻譯:?ImportNew.com?-?黃小非
譯文鏈接:?http://www.importnew.com/7302.html
總結
以上是生活随笔為你收集整理的Java 8新特性——default方法(defender方法)介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 为什么鲁大师说我的电脑型号是X64兼容台
- 下一篇: 如何让两台电脑的系统对拷?