更新時(shí)間:2020-10-16 17:32:52 來源:動(dòng)力節(jié)點(diǎn) 瀏覽1504次
說到Java接口繼承,我們必須先說說接口,接口是一種高度的抽象,里面會(huì)規(guī)定一些將要實(shí)現(xiàn)的行為或只作為一種標(biāo)記,如Java中的Serializable接口,它比抽象類更加抽象。
然后說一說對繼承的理解,繼承就是泛化。在由接口組成的繼承層級中,從上往下看,是由抽象到具體的過程。通過繼承我們可以保留父接口中定義的行為,同時(shí)可以對其進(jìn)行擴(kuò)展。整個(gè)繼承層級,其實(shí)是類似樹結(jié)構(gòu)的,樹的層級越深,行為就越復(fù)雜,能做的事情就更多。
上一層是對下一層共性的抽象,下層是對上層不同維度的演進(jìn)。以Java的集合框架為例,如下圖:
最開始只有一個(gè)Iterable,這里只是要返回一個(gè)迭代器,它可以用來處理一些可以迭代的對象,可以在foreach或者while循環(huán)中迭代。那么哪些對象是可以迭代的呢,于是就有了第二層接口,Collection、Directory Stream(JDK1.7新增nio模塊中)都是可以迭代的。
接下來再往深層考慮,什么樣的算是Collection, JDK中給出定義Collection表示一組對象,稱之為元素,有些集合允許重復(fù),有些不允許,有些無序,有些有序。原文中這樣描述:
A collection represents a group of objects, known as its elements. Some collections allow duplicate elements and others do not. Some are ordered and others unordered.
根據(jù)這些描述又有了下一層,Set、List、Queue, 這是針對Collection中不同類型的集合的抽象,其內(nèi)部會(huì)聲明一些特定的方法:
我們發(fā)現(xiàn)有很多不同的方法,這個(gè)就是對Collection不同維度的演進(jìn)。職責(zé)不斷的細(xì)化,對于其他的接口,情況也是一樣的。這點(diǎn)和畫家在創(chuàng)作時(shí)先畫出輪廓,然后再一點(diǎn)一點(diǎn)的勾勒細(xì)節(jié)有異曲同工之妙。
那么接口繼承有什么意義呢?不妨這樣考慮,加入假如沒有接口繼承,會(huì)變成什么樣子?假如不讓接口繼承,那么所有接口的方法都放在一個(gè)接口中,這時(shí)只有一個(gè)接口,那么這個(gè)接口規(guī)定的行為不覺得有點(diǎn)太多了么,既要負(fù)責(zé)返回一個(gè)迭代器,又要是一個(gè)集合,而且既要定義有序集合的行為,又要定義無序集合的行為,既要定義有重復(fù)元素的集合的行為,又要定義無重復(fù)元素集合的行為。
假設(shè)只有一個(gè)方法來定義集合的行為,請問這個(gè)方法該怎么實(shí)現(xiàn)。千萬不要說加上一大堆if else的判斷語句,如果這時(shí)候有新的集合類型加入了,難道再加上一個(gè)if else語句么?無疑這是一種糟爛的設(shè)計(jì)。反觀通過接口繼承產(chǎn)生的層級接口,層次分析,職責(zé)分明,Set就是Set,List就是List,想要實(shí)現(xiàn)那種結(jié)構(gòu)直接實(shí)現(xiàn)對應(yīng)的接口即可。換個(gè)角度看,通過接口繼承,可以重新定義上層已經(jīng)定義的行為,也不會(huì)影響到同一層級的其他接口中的行為。
在簡單的系統(tǒng)中,當(dāng)然并不一定用到接口繼承,但一個(gè)相對復(fù)雜的系統(tǒng)中,如JDK的集合框架,通過接口繼承可以稱得上是一種良好的設(shè)計(jì),也是對整個(gè)系統(tǒng)結(jié)構(gòu)的一個(gè)提升。
好了,對Java接口繼承的相關(guān)知識就先講解就到這里,欲知后事如何,請觀看本站的Java零基礎(chǔ)教程,帶你全方位學(xué)習(xí)Java基礎(chǔ),為你的Java夢想揚(yáng)帆起航!
初級 202925
初級 203221
初級 202629
初級 203743