作者TKB5566 (蔡英文還我七天假!!)
看板java
標題Re: [問題] 面試時被問到介面功能
時間Mon May 1 21:15:57 2023
介面第一個功能,
大家都說是
可避免多重繼承,那麼首先要回答,為何多重繼承在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://webptt.com/m.aspx?n=bbs/java/M.1682946959.A.916.html
1F:推 Isaea: 推,講解的很透徹 05/03 00:38
2F:推 Hsieh455125: 推優文 05/04 13:22
3F:推 andytung444: 推,寫得很容易懂 05/16 19:52
4F:推 ywk: 好文推 05/29 06:51
5F:推 xrururururu: 好奇問 第一項 多重繼承取不同方法名字不就可以避免 06/06 15:16
6F:→ xrururururu: ? 06/06 15:16
7F:推 Jichang: 多重繼承的意思是 你想要 爸爸的功能 也要媽媽的功能 jav 06/14 12:15
8F:→ Jichang: a 無同時繼承兩個 但是可以用介面搭配 Delegation 來實現 06/14 12:15
9F:推 chyl13579: 好文堆堆 09/24 13:20
10F:推 goodice: 好文 10/08 23:01
11F:推 chyl13579: 推 12/03 08:15