作者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/cn.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