首頁>Club>
47
回覆列表
  • 1 # ProblemBoy

    這個問題很有意思。雖然有一些場景,使用繼承和介面都可以實現,但是介面的存在絕對不僅僅是代替類的繼承。

    首先繼承和介面的區別很明顯,用通俗的話來講,介面好比一個人的老師,會告訴你要做什麼(實現介面要實現介面中的方法),而繼承就好比是親爹,會把所有的都給你(子類可以呼叫父類提供的方法),一個人可以有多個老師,但是隻有一個親爹(介面可以實現多個,類只可以繼承一個)。

    那麼再來說說介面存在的意義。簡單的理解在Java中介面相當於是定義了規範,而這些規範可以嚴格控制每個實現的功能。最明顯的應用就是JavaEE,JavaEE中只定義了各種介面,並沒有實現,而我們平時所使用的基本都是一些實現了這些介面的第三方類,比如tomcat的。

    另外介面的存在也使得應用的可維護性和擴充套件性變得更強,比如,在一個應用中使用了MySQL資料庫,然後未來某一時間想要更換成其他資料庫,那麼就只需要學一個其他資料庫的類實現資料庫介面就可以無縫切換了。

    此外還有一個很重要的點,介面是Java程式中解耦的重要手段。相反的類的繼承是確實增加了耦合度。

    所以說,Java中介面的存在是很有必要的。

  • 2 # 佛系觀影

    interface是定義介面,建立interface其實就是為了降低耦合度

    舉個例子:

    一個學校裡邊,有兩種人:學生、老師。他們都要吃飯和睡覺。

    public interface 人{

    void 吃飯();

    void 睡覺(); }

    public class 學生 implements 人{

    public void 吃飯(){

    //去食堂吃飯 }

    public void 睡覺(){

    //回寢室睡覺 }

    //其他特有方法,比如泡妞、打遊戲 }

    public class 老師 implements 人{

    public void 吃飯(){

    //回家吃飯 }

    public void 睡覺(){

    //回家睡覺 }

    //其它特有方法,比如為生兒育女傳宗接代的歷史使命努力等不足為外人道的事情 }

    public class 學校{

    public void 開飯(人 ren){

    ren.吃飯(); }

    public void 放學(人 ren){

    ren.睡覺(); } }

    這裡就用到了里氏代換原則,"開飯()"和"放學()"的引數都是人,那麼這個地方如果換成學生和老師肯定也可以。

    人 a = new 學生();

    學校.開飯(a); 學校.放學(a);

    這樣執行的結果就是學生回寢室吃飯。

    人 b = new 老師();

    學校.開飯(b); 學校.放學(b);

    這樣執行的結果就是老師回家吃飯。

    為什麼要這樣寫呢?這樣寫有什麼好處呢? 我在開飯的時候完全可以直接呼叫"學生.吃飯();"、"老師.吃飯();"啊。 接著看。 有一天,學校裡來了第三種人,家長。 家長既不是去寢室睡覺也不是回家睡覺,而是旅館睡覺,既不是去食堂吃飯也不是回家吃飯,而是去下館子。 這個時候學校這個系統該怎麼處理呢? 如果原來沒有定義"人"這個介面那就麻煩啦,所有用到人的地方程式碼都要改。 現在不一樣了,我可以直接定義一個類:家長,這個類實現人這個介面就可以了。

    public class 家長 implements 人{

    public void 吃飯(){

    //下館子 }

    public void 睡覺(){

    //去旅館睡覺 }

    //其它特有方法,比如會見老師,曉之以錢,動之以利等等,不一而足 }

    在呼叫的時候不需要修改任何程式碼,還和原來一樣:

    人 c=new 家長();

    學校.開飯(c);

    學校.放學(c);

    輕鬆搞定家長的食宿問題!

    這樣一來學校來再多的客人都沒關係啊,絕對可以應付自如,這也就是傳說中的可擴充套件性! 不知道初學者看到這裡是不是能夠明白介面的作用。如果你還不明白,那麼你把人這個介面去掉,自己寫一個學校開飯和放學的類,然後再加一個家長這個新新人類進去,看看你的程式碼是什麼樣子的,再想一下在人口這麼多的中國,萬一哪天你的學校裡來了成千上萬個新新人類你該怎麼辦! 先宣告一下,這個案例可不是我想出來的~~ 然後我們就很好理解了,為什麼用別人的東西要實現介面呢?很直接的一個原因是這樣一來,程式設計的複雜度就可能會大大降低了。

  • 3 # 遊戲迷阿戰

    沒有介面一樣可以實現功能,但是隨著業務的複雜,會導致耦合性很高,程式碼臃腫,給後期維護增加了難度,一旦後期有業務上的修改會很困難。Java的三大特性是繼承、封裝、多型。使用介面就是為了實現多型。

  • 4 # 首席程式碼執行官

    明顯不是。你的問題本質是面向物件的問題,我當年上大學,只知道書中說有好處,但也沒搞明白到底哪裡好了。工作幾年才徹底明白。

    如果你明白介面和類的本質區別,這個問題就自然明白了。類是一個範疇的東西,你是一個人,還是一個動物,是一個具體的什麼動物,貓還是狗,這就是類。頂層的動物是抽象的東西,而底層的貓啊狗啊是具體的東西。也就是說類是屬於某個範疇的東西,這個範疇相對明確,雖然也有一定的抽象。

    而介面呢,是一個標準,一個規範,實現了這個介面,就意味著肯定有了相應的功能。這就是我們經常提到的實現一個介面,必須要實現介面中的所有方法。怎麼理解呢?我不管你屬於什麼類,貓啊,狗啊之類的,你只要實現了我的alive(活著)介面,我就知道你肯定有吃eat(),喝drink(),拉crap,撒pee()這些方法。介面不關係你是什麼類,它關心的是隻要是實現了這個介面,肯定會實現介面中的方法,也就是說有了相應的功能。

    說了這麼多,在具體實踐中如何運用呢?我舉個實際例子來說吧,JDBC驅動,資料庫有好多種,mysql,oracle,等等,那麼作為程式設計師連線不同的資料庫,是不是寫的程式碼不一樣呢?比如連線mysql用方法connectMysql()而連線oracle用方法connectOracle?這時候,介面的作用就體現出來了。我剛才說,介面是一種規範,一種標準,那麼我定義一系列的介面,別管你什麼mysql,oracle之類,要連線資料庫,都需要實現我定義的介面,並實現connect方法;包括取資料庫之類的,也是一樣的。用介面來處理這種標準,不管具體的資料庫是什麼。

    在看看jdk自身的類,HashMap和HashTable,他們不是一個範疇:一個是Map,一個是Dictionary,但是他們都實現了Map介面,所以他們的功能或者能力基本相同。

    那麼回到你的 問題本身,類繼承幹嘛用的呢。其實這源於一種設計思想:面向抽象程式設計,比如我剛才提到的,你的程式中有狗,貓,還有 人這些類,他們肯定有相識的東西,你如果面向具體程式設計,那麼貓和狗肯定有些功能或者程式碼是重複的,比如吼叫bellow(),那麼完全可以抽象出來,把bellow這個方法放到貓和狗的父類,避免程式碼重複或者耦合,你要考慮如果有100個貓或者狗之類的類,如果不 放到父類中,修改這個bellow方法可能涉及100個類。

    仔細琢磨琢磨吧,我也是思索了好多年才體會出來的。讓你寫一個程式,如果你能熟練且正確運用介面,類,繼承等,說明你真的有了面向物件思想了。

  • 5 # 網路老鼠Sunny

    介面是單根繼承體系必須具有的特性,正因為有了它,類似C++那種多繼承才能實現,既減少了語言的複雜性,又兼顧了實用性。

    不光是Java語言,現在很多流行程式語言都是設計成單根繼承+介面的方式。

    介面程式設計也是程式設計理論中存根(stub)程式設計的實現依據,RPC的呼叫實現就是以介面為契約的,面向介面程式設計和麵向物件程式設計是現代軟體工程的重要組成部分。

  • 6 # IT牛哥

    你好,你的問題包含了兩個小問題,①java設計interface的原因?②是不是為了儘可能替代類的繼承?

    介面與繼承分別是什麼?(定義)

    介面是一系列方法的宣告,比如方法名、引數、返回值等資訊,介面中的方法不實現,這些方法可以在不同的地方被不同的類實現。

    繼承就是子類繼承父類的特徵和行為,使得子類具有父類的例項域和方法。

    介面與繼承的設計原因是什麼?(用處)

    介面的主要作用在於降低程式碼的耦合度,遮蔽實現層,比如前後端介面互動的時候,大家約定好介面層就可以互不影響的幹活了,至於介面實現後端可以慢慢做。

    繼承的主要作用在於,在已有基礎上繼續進行功能的擴充①清晰體現相關類間的層次結構關係②減小程式碼的冗餘度,大大增加程式的重用性。

    介面與繼承有什麼區別?

    ①定義的修飾符不同(interface),(extends)

    ②介面中只能定義全域性常量和抽象方法,而在繼承中可以定義屬性方法,變數,常量等。

    ④繼承只能繼承一個類,但implements可以實現多個介面,用逗號分開就行了 。

    綜上所述,java中介面與類繼承各有自己存在的原因,有自己的適用場合,有區別也有一定的聯絡,可以根據自己的具體需求來選擇。

  • 7 # 大資料資深專家

    繼承代價太大,強制你把父類的所有東西都拿過來,不然就不準使用,這種將方法和屬性強耦合的方式容易導致類繼承多了到後面積重難返。使用鴨子型別(介面)能避免一部分繼承的缺陷,go裡甚至直接繼承都沒有了,只有介面。

    以前我們把物體抽象,大象抽象是動物,動物抽象是生物,這樣本身就把物件的內容和行為綁定了,比如大象會噴水,就給大象加個噴水的方法,但是如果魚也會噴水,噴水這個方法又不能放到動物類裡,那麼基於大象和魚的噴水方法實現的上層方法就無法複用,這兩個噴水在編譯器看來是沒有任何關係的。

    開始人們想到搞一個噴水動物類,繼承動物類,大象和魚再繼承噴水動物類。但是這樣終究治標不治本,再有其他的變化,繼承鏈又要修改。

    因為實際上我們使用物件,都是在使用其方法(屬性其實也應該算方法)。

    我對面向物件程式過程的理解,這個過程實際上就是讓物件之間使用方法互發訊息進行通訊和動作,最終完成工作。

    大家都知道的一句話,上層應該依賴抽象而不是依賴細節,然而依賴一個基類,本身已經依賴這個基類的實現細節,基類要求有個int成員,那麼任何子類無論如何都需要有個int成員。那麼理應將方法抽象出來,而不去關心其到底是什麼,因為我們並不使用物件內部的內容,我們只使用方法。

    比如有個iwriteable介面,表示物件可以按位元組寫入,那麼上層的程式碼就不用管寫的到底是什麼了,只要能寫就行,就可以基於這個iwriteable接口裡的方法,寫出例如寫字串,寫圖片等方法。任何實現了這個介面的類,都可以複用這些寫字串,寫圖片的程式碼。

    那麼就有人要問了,那如果我確實要求要有個int成員,因為我上層程式碼要使用呢?那麼根據前面說的,屬性也是方法,你應該再定義一個介面,比如這個int存的是年齡,那麼就來個haveage介面並實現它。呼叫的地方可以要求物件實現哪幾個介面,這樣也能獲取需要的屬性。

    這麼一來,連屬性都沒有了,那麼繼承也可以沒有了,畢竟你要求的不是基類了,是一個或多個介面的組合了,所以你可以看到,介面替代繼承是很自然的,而不是什麼刻意而為的,是更高階抽象的體現。事實上基於自然規則的那套大象是動物,動物是生物的那套面向物件規則,在程式設計裡並不好用。所以如果讓我介紹面向物件,我不會講這些例子。

  • 8 # 後婲緣

    介面定義的屬於規範,比如說,列印這一個動作,不同的印表機有不同的列印方式和指令,如果沒有規範,很難做到一種程式碼統一列印,如果有介面和規範就能做到相容多家印表機。USB介面,220v電源介面,就是一種規範,有了這些規範,裝置方,供電方就有了一套方法來約束自己,達到工程學上的通用,介面是工程學上一個很好的思想

  • 9 # 97654326464

    之所以設計介面,或者設計抽象類。是因為面向介面程式設計,面向抽象類程式設計,才能讓我們的程式碼可擴充套件性更強!(才能讓我們的程式碼更加的符合設計模式的開閉原則:對修改關閉,對擴充套件開放)

  • 10 # 小衚衕學SH

    首先多種不同的類實現了同樣的方法,一定程度上彌補了java單重繼承的不足。

    其次設計與實現相分離,設計人員編寫介面,程式人員實現介面。這樣程式碼看起來更加規範,在架構上更加合理。

    最後介面的最主要的作用是達到訪問統一。

  • 11 # 與自然做鬥爭

    inter face 類似於硬體USB !除非不對接通訊,那麼就無法編譯頂多算是個文件記事本。

    不過inter face 這個名稱隨便定義,不一定需要inter face ,只不過開方商建立的平臺命名為inter face ,這些東西由策劃者來決定,就好比我在地圖裡面隨便畫個圈叫什麼這個由你決定,那麼這個圈裡面任意發揮,類似分割槽一樣,你要跨過這個圈內部區域,你得透過海關認證,也可以說是跨省,那麼整張記憶體叫做國家,inter fface 是省名,內部還有省府,市,縣鎮,鄉等等分類,那麼你所寫程式只能在這個省內部操作,你要跨省就要省長簽字稽核,叫做編譯器,你才能正常跨省運送!

    那麼JAVA 為何設計inter face 不就清楚了

  • 12 # 王亮IT

    interface就是介面,介面其實就是定義規則,如果程式十分簡單或者說一個人開發的話,完全可以不用介面!但是如果專案十分大的話,涉及到多人協同合作開發,這時候軟體分層是很必要的,那麼層與層之間,介面定義就很有必要了,因為介面定義好,大家都會面向介面程式設計,不用相互直接有耦合!基本上就是這個意思

  • 13 # 人生路誰主沉浮

    介面具有松耦合的特性,介面主要是對方法的定義,抽象類趨向於同類屬性和方法執行邏輯的定義!而這也是面向物件設計方式的體現,同樣在JDK中就大量運用介面,抽象類來作為規約。因為具體的執行需要這些方法與執行邏輯!而在Spring中,AOP程式設計理念即是面向切面,模板方法,DI則使用面向介面來解耦,方法可以多實現!在策略設計模式中,介面就顯的尤其重要,而在模板設計模式中抽象類的定義也很重要!所以實際設計過程是兩者相結合使用來實現介面松耦合,又能透過委派來使用不同的策略完成介面方法的呼叫!

  • 14 # 想取個名咋就不過呢

    介面不可能替代抽象類。

    面向介面程式設計既可以透過介面來實現,也可以透過抽象類來實現,那為啥還需要有繼承呢?繼承的含義就是可以繼承父類的東西,即共性的東西,比如欄位、方法。而介面是做不到的,這在語言設計層面就已經區分了它們各自的使用場景。

  • 15 # 黑白謬1234567

    interface就是介面,在實現面向物件的多型功能方面,是一個重要的機制。這麼說吧,舉個形象一點的例子,手機充電口,以前有各種各樣的形狀,蘋果有蘋果的,三星有三星的,諾基亞有諾基亞的,那麼問題來了,我買三星手機,其配套的充電器就插不進蘋果的口子,蘋果手機,也插不進諾基亞的口子,於是充電器就得重複生產,造成資源浪費,不利於環保,這在軟體方面也稱為冗餘。

    於是乎,像歐盟這樣的經濟體就提出了統一標準,你蘋果的,我諾基亞也能插,三星的,蘋果也能用。否則將會被禁用你的手機。(難怪庫克表示遺憾)

    回到Java的Interface,我們知道軟體有很多模組組成,分工協作的話,不同模組由不同的人完成,模組之間怎樣聯絡呢,在沒有面相物件出來之前,是用函式引數來完成的,但那樣的話,聯絡太緊湊,不利於分工協作,於是出現了充分解耦的低烈度的面相物件技術,就像歐盟那樣,規定一個介面標準,你程式猿可以展現你的個性,但在介面方面不能胡來,這樣,你的個性與整個專案就能完整地整合起來,個性,也就是面相物件多型,這就是Java設計Interface的原因。

  • 16 # 程式設計師術與道

    interface是介面的意思。介面意味著一種契約,相對於類而言介面的抽象程度更高。介面更多的是抽象出統一的行為,是約定;而類的繼承是複用,兩者的功能和定位有區別,是互補的。

    介面定義了某些行為,而實現某個介面就必須實現這些行為。換句話說,某個類實現了介面,就必定具備介面所約定的功能。這樣的話,我們就可以採用面向介面程式設計的方式進行設計。我們看不到具體的類的實現,也不需要看到。我們只需要看到介面就可以了,然後就可以根據介面所提供的功能進行呼叫。

    更具體的推薦看下java 程式設計思想。

  • 17 # 記錄你的傳奇

    介面和繼承是完全兩個不同的東西,繼承只是子除了父類的所有方法外還有新的方法,避免重新再寫父類的方法。介面只是一個方法定義,並沒有方法實體,說白了就是定義一個標準,要以後實現的方法按這標準來,就是在設計階段還不知道這個地方怎麼實現,留給後面的人去用的,這樣我前面的設計可以繼續。

  • 中秋節和大豐收的關聯?
  • 勒布朗·詹姆斯出軌了,球迷該怎麼辦?