Re: [問題] 面試時被問到介面功能

看板java作者 (蔡英文還我七天假!!)時間1年前 (2023/05/01 21:15), 編輯推噓9(902)
留言11則, 8人參與, 5月前最新討論串14/14 (看更多)
介面第一個功能, 大家都說是可避免多重繼承,那麼首先要回答,為何多重繼承在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

05/03 00:38, 1年前 , 1F
推,講解的很透徹
05/03 00:38, 1F

05/04 13:22, 1年前 , 2F
推優文
05/04 13:22, 2F

05/16 19:52, 11月前 , 3F
推,寫得很容易懂
05/16 19:52, 3F

05/29 06:51, 11月前 , 4F
好文推
05/29 06:51, 4F

06/06 15:16, 11月前 , 5F
好奇問 第一項 多重繼承取不同方法名字不就可以避免
06/06 15:16, 5F

06/06 15:16, 11月前 , 6F
06/06 15:16, 6F

06/14 12:15, 10月前 , 7F
多重繼承的意思是 你想要 爸爸的功能 也要媽媽的功能 jav
06/14 12:15, 7F

06/14 12:15, 10月前 , 8F
a 無同時繼承兩個 但是可以用介面搭配 Delegation 來實現
06/14 12:15, 8F

09/24 13:20, 7月前 , 9F
好文堆堆
09/24 13:20, 9F

10/08 23:01, 6月前 , 10F
好文
10/08 23:01, 10F

12/03 08:15, 5月前 , 11F
12/03 08:15, 11F
文章代碼(AID): #1aJxkFaM (java)
討論串 (同標題文章)
文章代碼(AID): #1aJxkFaM (java)