2013-02-21 53 views
0

引用變量可以聲明爲類類型或接口類型。如果該變量被聲明爲接口類型,則它可以引用實現該接口的任何類的任何對象。參照接口創建對象

根據上述說明,我已經編寫了一個關於理解的代碼。如上所述,聲明爲接口類型,它可以引用實現接口的任何類的任何對象。

但在我的代碼顯示displayName()方法undefined在objParent.displayName();.

public class OverridenClass 
{ 
    public static void main(String[] args) 
    { 
    Pritable objParent = new Parent(); 
    objParent.sysout(); 
    objParent.displayName();  
    } 
} 

interface Pritable 
{ 
    void sysout(); 
} 

class Parent implements Pritable 
{ 
    public void displayName() 
    { 
    System.out.println("This is Parent Name"); 
    } 

    public void sysout() 
    { 
     System.out.println("I am Printable Interfacein Parent Class"); 
    } 
} 

我相信我已經理解了錯誤的方法。

有人可以解釋相同。

感謝您的回覆。

回答

4

但在我的代碼顯示displayName()方法undefined。

對,因爲displayName沒有在Pritable接口中定義。您只能通過聲明爲具有該接口的變量來訪問在接口上定義的方法,即使具體類具有其他方法。這就是爲什麼你可以撥打sysout,但不是displayName

這樣做的原因是比較明顯的,如果你考慮這樣一個例子:

class Bar { 
    public static void foo(Pritable p) { 
     p.sysout(); 
     p.displayName(); 
    } 
} 

class Test { 
    public static final void main(String[] args) { 
     Bar.foo(new Parent()); 
    } 
} 

foo不得代碼依靠比在Pritable接口功能的其他任何東西,因爲我們有在編譯時不知道具體的類可能是什麼。

接口的要點是僅使用接口引用來定義代碼可用的特性,而不考慮所使用的具體類。

+0

但是在kathy bates中它的樣子如果變量被聲明爲接口類型,它可以引用實現該接口的任何類的任何對象。它們究竟是什麼意思,由任何實現接口的類的任何對象 – 2013-02-21 08:02:57

+1

由此它們意味着它可以包含實現該接口的任何對象,但要訪問在實現者中定義的其他方法,則需要對其進行類型化。看到我的回答 – asifsid88 2013-02-21 08:04:30

+1

@JavaBeginner:它*可以*引用實現該接口的任何對象,但它只能*使用該接口定義的該對象的特性。這是接口引用的要點:避免耦合到任何特定的具體類。 – 2013-02-21 08:06:49

1

編譯器不關心運行時間。就編譯器而言,它會檢查引用類型是否在接口類型中有一個稱爲display的方法。在你的子類或實現類中聲明

方法是不是你的超類/接口的一部分 。因此您無法調用在超類/接口參考 類型的子類中聲明的方法 。

1

需要鍵入強制轉換,以獲得訪問Parent方法

((Parent)objParent).displayName(); 
+0

謝謝你的回覆Eclipse建議同樣的 – 2013-02-21 08:03:33

+0

歡迎:)希望可以幫助 – asifsid88 2013-02-21 08:04:52

+3

@JavaBeginner:有**沒有**指向這樣做。你也可以簡單地將'objParent'聲明爲'Parent'。 – 2013-02-21 08:07:14

0

displayName()方法顯示爲不確定,因爲聲明爲PritableobjParent和接口沒有這樣的方法。爲了能夠使用方法displayName(),就可以在界面Pritable聲明它:

interface Pritable 
{ 
    void sysout(); 
    void displayName(); 
} 

或鑄objParent調用方法displayName()之前鍵入Parent第一:

Pritable objParent = new Parent(); 
objParent = (Parent)objParent; 
objParent.displayName(); 
0

接口基本上都是另一種方式 - 突破單一繼承的規則。

通過使用接口,子類可以繼承它的父類方法並被迫實現它的接口方法。導致易於擴展和維護繼承樹等。

然而,捕獲的是,當父項引用子項時,您只能訪問父項方法。要訪問接口方法,您需要在接口引用類型下強制轉換或創建子進程。

接口還允許在接口類型下收集多個不同族的類。我還沒有發現什麼好處。

在我看來,這是毫無意義的,因爲無論如何我仍然無法實現全面的多態 - 只使用父引用類型,仍然可以訪問接口實現。