http://liusu.iteye.com/blog/136690java
某一天,某一個需求修改完成以後,提交代碼。我修改了一個接口,在接口文件中添加了一個方法,而且在實現類中實現。但運維同事編譯時告訴我出錯了,爲何呢,由於不知道誰在代碼路徑中把這個接口的實現類作了一個備份,我沒有在備份文件中實現添加的方法,從而報錯。在這個問題上,忽然發現本身只是瞭解一個接口多個實現類,可是歷來沒有深刻了解過,顧藉此機會整理一些東西吧。歡迎補充編程
1.一個接口,多個類implements該接口運維
public class Main { public static void main(String[] args) { InterfaceTest a = new AImpl(); InterfaceTest b = new BImpl(); InterfaceTest c = new CImpl(); a.toPrint(); b.toPrint(); c.toPrint(); } } public interface InterfaceTest { public void toPrint(); } public class AImpl implements InterfaceTest { public void toPrint(){ System.out.println("A toPrint function()"); } } public class BImpl implements InterfaceTest { public void toPrint(){ System.out.println("B toPrint function()"); } } public class CImpl implements InterfaceTest { public void toPrint(){ System.out.println("C toPrint function()"); } }
運行輸出結果爲:測試
A toPrint function()
B toPrint function()
C toPrint function()
測試代表,多個實現類的狀況下,具體調用哪一個實現類,是經過實現類的實例來區分的。spa
2.利用instanceof關鍵字code
public class Main { public static void main(String[] args) { InterfaceTest a = new AImpl(); InterfaceTest b = new BImpl(); InterfaceTest c = new CImpl(); checkFun(a); checkFun(b); checkFun(c); } public static void checkFun(InterfaceTest test){ if(test instanceof AImpl){ System.out.println("from AImpl"); }else if(test instanceof BImpl){ System.out.println("from BImpl"); }else if(test instanceof CImpl){ System.out.println("from CImpl"); } } }
將接口實例做爲參數,利用instanceof來判斷是類型,而後執行不一樣的操做。對象
可是呢,這樣有很差地方,若是有多個類型,就得寫多個判斷。種作法一般被認爲是沒有好好利用面向對象中的多態性。其實上面的功能要求用方法重載徹底能夠實現,這是面向對象變成應有的作法,避免回到結構化編程模式。只要提供兩個名字和返回值都相同,接受參數類型不一樣的方法就能夠了。blog
若是實現方法特別多的時候,能夠考慮利用工廠模式,利用反射來實例化衆多實現類。接口