新聞中心
介紹

成都創(chuàng)新互聯(lián)是專業(yè)的崇左網(wǎng)站建設(shè)公司,崇左接單;提供成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè),網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行崇左網(wǎng)站開(kāi)發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!
我一看到 Java 8 發(fā)布了,就決定開(kāi)始深入看看對(duì)于這門(mén)編程語(yǔ)言新的增強(qiáng)功能。 我承認(rèn),自己并沒(méi)有像對(duì)待 7 那樣對(duì)這個(gè)版本進(jìn)行跟進(jìn),所以我所知道的唯一的增強(qiáng)功能只是lambda表達(dá)式而已。 在我通讀文檔,并寫(xiě)下一些示例程序來(lái)確保自己對(duì)這些新的特性有一個(gè)良好的理解是,有一個(gè)特性引起了我特別的注意: 默認(rèn)方法,首先,讓我們來(lái)看一看它們到底是什么。
先認(rèn)識(shí)認(rèn)識(shí)
從本質(zhì)上講,默認(rèn)方法就是一個(gè)在接口里面有了一個(gè)實(shí)現(xiàn)的方法。 傳統(tǒng)的接口只是簡(jiǎn)單的由抽象方法和公共靜態(tài)的并且是final的變量構(gòu)成。 那么考慮看看下面這個(gè):
- public interface ExampleInterface {
- public void exampleMethod();
- default public void exampleDefaultMethod() {
- // Some implementation code here
- }
- }
如果一個(gè)類決定去實(shí)現(xiàn) ExampleInterface,它只需要去實(shí)現(xiàn) exampleMethod,并且它可以簡(jiǎn)單地采用 exampleDefaultMethod的默認(rèn)實(shí)現(xiàn)。 現(xiàn)在,讓我們來(lái)看看Oracle打算讓我們?cè)鯓尤ナ褂盟鼈儭?/p>
它們應(yīng)該怎么被使用
這個(gè)想法不是讓你在設(shè)計(jì)時(shí)考慮使用默認(rèn)方法作為解決方案,而是它們只是一個(gè)事后的考慮。 在Oracle的跟蹤報(bào)道上他們稱述的意圖是去“確保為那些老版本接口寫(xiě)的代碼的二進(jìn)制兼容性”(1)。 從本質(zhì)上講,你和你的開(kāi)發(fā)人員編寫(xiě)了對(duì)某些接口的多個(gè)實(shí)現(xiàn),但是你想要添加新的一塊東西。 然而,這樣做就意味著對(duì)所有那些實(shí)現(xiàn)了這個(gè)接口的類進(jìn)行重新構(gòu)建都將失敗,除非你為它們每一個(gè)都補(bǔ)上新增的那一塊的實(shí)現(xiàn)。 默認(rèn)方法的想法是你可以在不改變現(xiàn)有實(shí)現(xiàn)并且再也不用變更它們的前提下加入對(duì)接口的新需求。
但是讓我們退后一步想想。 這里面還是有些問(wèn)題的吧。 首先,讓我們接受有時(shí)高級(jí)別 的變更(比如變更你的接口)行將發(fā)生的這一事實(shí)。 然而,讓我們也不要忘了接口的存在的目的是什么。 理想情況下一個(gè)接口鎖定一些高級(jí)別的對(duì)象,或者說(shuō)你是在創(chuàng)造一些特殊功能部分的API。 如果一些類只需要去實(shí)現(xiàn)接口功能 的某些部分,而不是全部的話,那么那會(huì)是一個(gè)好的設(shè)計(jì)嗎? 那不就是抽象類被設(shè)計(jì)出來(lái)的原因么?
其次,這會(huì)引入對(duì)于處理多重繼承的需求。 而現(xiàn)在謝天謝地,如果你有兩個(gè)擁有一個(gè)對(duì)于單個(gè)方法簽名的默認(rèn)實(shí)現(xiàn)的接口,而你嘗試去擁有一個(gè)同時(shí)實(shí)現(xiàn)這兩個(gè)接口的類, Java將拒絕編譯這個(gè)類。 許多人抱怨接口中允許公共靜態(tài)變量的不確定性,說(shuō)如果兩個(gè)接口中有同一個(gè)變量就會(huì)有些模棱兩可(因此像 C# 這樣的編程語(yǔ)言就會(huì)禁止諸如此類的事情),而這是有一些難以對(duì)付的。
我看到這個(gè)功能是如何在這個(gè)問(wèn)題上起作用的,而我不準(zhǔn)備在這里闡述它,直到我看到它被應(yīng)用在實(shí)踐中,但是我必須強(qiáng)調(diào)它使我感到緊張。 話雖這么說(shuō),讓我們還是來(lái)更多的看看這個(gè)功能可能會(huì)被運(yùn)用到的地方,而不是它的這個(gè)目的。
可能的誤用
前面我們談到引入多重繼承后模棱兩可的問(wèn)題,那么編譯器不會(huì)捕捉到的會(huì)是什么情況呢? 什么才會(huì)使我停止像我使用一個(gè)抽象類(通常是一些抽象方法和一些實(shí)現(xiàn))那樣,簡(jiǎn)單的使用接口的做法,而去利用繼承多個(gè)接口的好處呢? 這沒(méi)有怎么不好,但是究其自身而言,它將會(huì)鼓勵(lì)使用Java努力避免的復(fù)雜設(shè)計(jì)。 有些情況是在你實(shí)際需要多繼承來(lái)解決你在構(gòu)建一個(gè)抽象類的框架中使用單個(gè)繼承類型所不能解決的問(wèn)題。
總結(jié)
總的來(lái)說(shuō),Java8還是提供了許多很酷的新東西的,有些看起來(lái)同Java早期的基礎(chǔ)知識(shí)相悖。 不管是好是壞,時(shí)間會(huì)證明一切。 如果你有任何建議,請(qǐng)自由的分享他們。 此外,任何時(shí)候開(kāi)始在你的項(xiàng)目中使用Java 8,請(qǐng)自由分享你的成功或恐怖故事。 可以通過(guò)ryan。kenney@coveros。com聯(lián)系我。
參考
1 – http://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html
英文原文:Java 8 Default Methods and Multiple Inheritance
譯文鏈接:http://www.oschina.net/translate/java-8-default-methods-and-multiple-inheritance
本文題目:Java8的默認(rèn)方法和多重繼承
分享地址:http://m.5511xx.com/article/cccejgh.html


咨詢
建站咨詢
