看板 java 關於我們 聯絡資訊
介面第一個功能, 大家都說是可避免多重繼承,那麼首先要回答,為何多重繼承在Java是必須避免的呢? 若是現有A、B、C三個類別,然後這三個類別關係是:C is a A;C is also a B。 那麼萬一A、B類別有一模一樣名稱的方法,C類別要繼承的是哪個方法呢?? 這樣就不能確定了,所以這是Java必須避免多重繼承的原因。 而又為何介面可以避免掉多重繼承這個問題呢?介面不是可以被多重實作,萬一某類別 多重實作不同介面,而不同介面又有相同名稱的方法呢?? 不同介面若有相同名稱的方法,在Java中會被當作是擁有相同功能、行為之方法。 因為介面內定義的方法,本來就是用一種名稱去對應一種行為的, 例如swim就只會是游泳,不會是別的行為;run就只會是跑,不會是別的行為; attack就只會是攻擊,也不會是別的行為。 既然這樣,若不同介面擁有相同名稱之方法,那就會被Java認為是相同的方法,既然方法都一樣,那類別實作介面的方法時,實作一個就好了,因為都是一樣的方法。 所以,若是多重實作介面的類別遇到需實作相同名稱之方法,實作其中一個方法即可。 因此,介面透過這個「相同名稱就是相同行為,實作一遍就好」的方式,避開了 多重繼承會出現的問題,也就是說介面確實是可以取代多重繼承的。 ----------------------------------------------------------- 介面的第二個功能,是詳開規格書。最著名的例子就是JDBC API與Servlet API。 Java官方利用介面去規定以上的API必須實作那些功能,各家資料庫與Web container廠商 實作後,將實作後的結果打包成jar檔,jar檔被使用者使用,可以直接透過 事先規定之介面,也就是JDBC、Servlet API, 來使用各家資料庫與Web container廠商實作之結果。 也就是說使用者使用相同/一種的API,即可使用多種不同的資料庫與Web container。 ---------------------------------------------------------------- 介面的第三個功能,是貼標籤,著名的例子是runnable介面跟serialize介面。 透過對類別貼上這樣的標籤,即可給這些類別增加特殊功能。 ------------------------------------------------------------- 介面的第四個功能,是提供多型。 因為介面型別的reference,與實作該介面的類別之物件,兩者關係是 該類別物件擁有該介面所定義的行為。因此該reference可以直接指向該物件。 也就實現了多型的效果。而多型又可以大幅降低程式的複雜程度。 ------------------------------------------------------------- 介面的第五個功能,是降低程式相依性,進而好維護。 因為類別是依賴於介面而非依賴於實作後的類別,如果類別是依賴於某個實作的類別, 萬一被依賴的類別有所修改,依賴的類別很可能也會跟著被變化。這樣 一個類別被改動,其他類別也要因此做出改變,要改變很多類別,程式就不易維護, 若類別是依賴於介面,因為介面本身並不含實際的code,因此 修改介面並不會直接造成類別被變化,也就能降低程式相依性,進而好維護。 ---------------------------------------------------- 總結之上討論,介面共有五個功能, 而這也是介面之所以在Java專案架構中十分重要之原因。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 101.12.22.85 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/java/M.1682946959.A.916.html
Isaea: 推,講解的很透徹 05/03 00:38
Hsieh455125: 推優文 05/04 13:22
andytung444: 推,寫得很容易懂 05/16 19:52
ywk: 好文推 05/29 06:51
xrururururu: 好奇問 第一項 多重繼承取不同方法名字不就可以避免 06/06 15:16
xrururururu: ? 06/06 15:16
Jichang: 多重繼承的意思是 你想要 爸爸的功能 也要媽媽的功能 jav 06/14 12:15
Jichang: a 無同時繼承兩個 但是可以用介面搭配 Delegation 來實現 06/14 12:15
chyl13579: 好文堆堆 09/24 13:20
goodice: 好文 10/08 23:01
chyl13579: 推 12/03 08:15