JAVA 引用物件時應該用介面型別還是實現類的型別
阿新 • • 發佈:2021-06-22
先上程式碼把標題的問題說清楚,下面兩種接收物件的方式選擇哪一種?
//implA 為介面 ClassB為其實現類 implA A=new ClassB(); //介面型別的引用變數A 去接收物件地址 or ClassB A=new ClassB(); //類型別的引用變數A 去接收物件地址
先丟擲結論:應該優先使用介面而不是類來引用物件,但只有存在適當的介面型別時。
《Effective Java》中說到:
“如果存在適當的介面型別,那麼引數,返回值和欄位都應該使用介面型別。
如果你養成使用介面型別的習慣,你的程式將更加靈活。 如果沒有合適的介面存在,則通過類來引用物件是完全合適的。”
那麼什麼時候不存在適當的介面型別呢?看看下面的例子:
public class InterfaceTest { public static void main(String[] args) { PetInterface p = new Cat(); p.talk(); p.batheSelf();//無法呼叫 ,報錯The method batheSelf() is undefined for the type PetInterface } } interface PetInterface { public void talk(); }class Dog implements PetInterface { @Override public void talk() { System.out.println("Bark!"); } } class Cat implements PetInterface { @Override public void talk() { System.out.println("Meow!"); } public void batheSelf() { System.out.println("Cat bathing"); } }
我們看到,方法batheSelf()僅僅存在實現類中時,若我們仍然使用介面來引用物件時PetInterface p = new Cat(),那些僅僅存在實現類中的方法,是無法直接呼叫的即p.batheSelf()無法呼叫會報錯。所以這時使用Cat p = new Cat()即類來引用是更好的。
總而言之,使用介面類去引用物件是有前提條件的——即實現類中全是介面類的方法的實現,沒有自己單獨的方法。當實現類存在自己的方法時,使用實現類來宣告變數。