1. 程式人生 > 其它 >JAVA 引用物件時應該用介面型別還是實現類的型別

JAVA 引用物件時應該用介面型別還是實現類的型別

先上程式碼把標題的問題說清楚,下面兩種接收物件的方式選擇哪一種?

//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()即類來引用是更好的。

總而言之,使用介面類去引用物件是有前提條件的——即實現類中全是介面類的方法的實現,沒有自己單獨的方法。當實現類存在自己的方法時,使用實現類來宣告變數。