大家好idea快速定位到錯(cuò)誤,我是小刀,今天和大家討論一下接口實(shí)現(xiàn)的兩個(gè)問(wèn)題,眾所周知,接口是設(shè)計(jì)模式的基石,所以了解接口的一些實(shí)現(xiàn)對(duì)理解設(shè)計(jì)模式,源碼都大有裨益!
接口圈真亂
之所以會(huì)提出如標(biāo)題中的問(wèn)題, 是因?yàn)樵诳磿r(shí),發(fā)現(xiàn)接口實(shí)現(xiàn)好像有點(diǎn)混亂
如上圖所示,其實(shí)是有兩個(gè)問(wèn)題
實(shí)現(xiàn)了List接口, 然后又實(shí)現(xiàn)了List接口. 這樣有問(wèn)題嗎?
接口中有個(gè)size()方法,List接口中也有一個(gè)size()方法. 如果有某個(gè)類同時(shí)實(shí)現(xiàn)和List接口, 會(huì)不會(huì)報(bào)錯(cuò)?
實(shí)踐出真知
首先,我們能正常使用說(shuō)明上面兩個(gè)問(wèn)題應(yīng)該是不成問(wèn)題的.對(duì)于問(wèn)題1. 大家糾結(jié)的點(diǎn)應(yīng)該是在于, 對(duì)于接口A, 如果抽象類B實(shí)現(xiàn)了接口,那么子類C在實(shí)現(xiàn)接口時(shí),還要不要重寫方法
接口Greet
/** * @author lixiang * @date 2020/6/16 **/public interface Greet { /** * 加油的接口定義 */ void cheer();}
抽象實(shí)現(xiàn)類
/** * @author lixiang * @date 2020/6/18 **/public abstract class AbstractGreet implements Greet { }
這里我們看到抽象類實(shí)現(xiàn)接口,要不要去重寫方法都不會(huì)報(bào)錯(cuò)但是通用來(lái)說(shuō), 抽象類的作用就是,要有一個(gè)通用的實(shí)現(xiàn),所以一般來(lái)說(shuō),還是實(shí)現(xiàn)方法比較好, 然后再拋一個(gè)抽象的具體實(shí)現(xiàn), 如下所示:
/** * @author lixiang * @date 2020/6/18 **/public abstract class AbstractGreet implements Greet { /** * 加油的接口定義 */ @Override public void cheer() { System.out.println("這里通常會(huì)做一些通用的處理,比如資源初始化,賦初值之類的"); doCheer(); } /** * 留給子類去實(shí)現(xiàn) */ public abstract void doCheer();}
真正的子類
/** * @author lixiang * @date 2020/6/17 **/public class TrueGreet extends AbstractGreet implements Greet { /** * 留給子類去實(shí)現(xiàn) */ @Override public void doCheer() { System.out.println("加油加油"); }}
在這里可以看到,雖然我們也實(shí)現(xiàn)了Greet接口,但是因?yàn)橐呀?jīng)實(shí)現(xiàn)過(guò)了接口,所以這里就不用再實(shí)現(xiàn)接口的cheer方法, 只需要實(shí)現(xiàn)抽象類的()方法就可以了,當(dāng)然也可以實(shí)現(xiàn)
@Override public void cheer() { super.cheer(); System.out.println("子類自己的實(shí)現(xiàn)"); }
這樣加上自己的實(shí)現(xiàn)也是沒(méi)有問(wèn)題的,所以說(shuō), 像開頭實(shí)現(xiàn)了List接口后,是不用再實(shí)現(xiàn)List的接口的, 實(shí)現(xiàn)了不重寫其中的方法,編譯也不會(huì)報(bào)錯(cuò), 只能說(shuō)是讓結(jié)構(gòu)更清晰一些.
這里還有一個(gè)比較有趣的現(xiàn)象,就是在idea中, 要重寫方法時(shí), 提示的是覆寫抽象類的,而不是接口的,如下圖所示:
報(bào)錯(cuò)的場(chǎng)景
上面都是正確的idea快速定位到錯(cuò)誤,其實(shí)有一種報(bào)錯(cuò)的場(chǎng)景要注意, 就是當(dāng)兩個(gè)不同的接口定義的方法簽名不一致的時(shí)候(方法名,入?yún)⒁粯?返回值不一樣)的時(shí)候,對(duì)于實(shí)現(xiàn)類,就找不到該重寫哪個(gè)了,就會(huì)報(bào)錯(cuò),如下所示
接口
/** * @author lixiang * @date 2020/6/17 **/public interface GreetCopy { /** * 加油的接口定義 */ String cheer();}
和最開始我們定義的Greet接口不一樣的是, 返回值從void改成了,
如上圖所示, 這樣編譯都是通不過(guò)的, 但是如果簽名換成一樣的,就不成問(wèn)題了.
總結(jié)
其實(shí)在寫本文之前,小刀也是對(duì)這些實(shí)現(xiàn)關(guān)系不是很清楚, 這樣邊實(shí)踐邊寫下來(lái)就清晰多了.希望大家也能多實(shí)踐,也如我一直說(shuō)的,學(xué)編程其實(shí)就是多實(shí)踐,多思考. 大家一起加油!
原創(chuàng)不易,點(diǎn)個(gè)在看支持一下唄~