2013-08-25 62 views
4
class inher1 
    { 

    public static void main(String...args) 
    { 

    eat i = new ursus(); 


     if(i instanceof eat) System.out.println("Instance of eat"); 

//Line 1 
if((omnivora)i instanceof eat) System.out.println("Instance of eat"); 
//Line 2 
if((omnivora)i instanceof omnivora) System.out.println("Instance of omnivora"); 

if(((omnivora)i).like_honey)System.out.println("Like Honey Obtained"); 

    } 

    } 

    interface eat //Interface 1 
    { 
     public void eat(); 
    } 

    interface omnivora //Interface 2 
    { 
     final public static boolean like_honey = true; 
    } 
    abstract class mammalia implements eat 
    { 
     abstract public void makenoise(); 
     public void eat(){System.out.println("Yummy");} 
    } 

    class ursus extends mammalia implements omnivora 
    { 
     public void makenoise(){System.out.println("Growl");} 


    } 

    class felidae extends mammalia 
    { 
     public void makenoise(){System.out.println("Roar");} 
    } 

對象,這是我的層次鑄造上實現無關的接口的Java

吃,Omnivora無關接口

哺乳實現多吃接口

Ursus的延伸哺乳實現Omnivora接口

貓科動物延伸哺乳動物

因爲它可以看到omnivora和吃是不相關的接口,但是1號線和2號線分別打印「實例吃」和「實例omnivora」。

有人能告訴我爲什麼嗎?

+2

請記住,接口名稱和類名應該以大寫字母開頭;不是小寫。 – blackpanther

+0

因爲「熊熊延伸哺乳動物實現Omnivora接口」(哺乳動物實現吃) –

回答

4

由於可以看到omnivora和eat是不相關的界面,但是第一行和第二行分別打印出「吃飯實例」和「雜食實例」。

有人能告訴我爲什麼嗎?

因爲你正在測試的對象是ursus,它實現omnivora,也實現了eat(由mammalia繼承)。

接口的關鍵之處在於一個類可以實現多個不相關的接口,並且它的實例被認爲是每個接口的「實例」。

一個具體的例子是FileReader,其延伸Reader,但也實施Readable,CloseableAutoCloseable。最後兩個與讀數本身無關,但類的實例是所有這些接口的實例。

+0

非常好的解釋..感謝 – UnderDog

1

Mammalia實現了eatomnivora,這意味着Mammalia的任何子類都是這兩個接口的子類型。因此,任何ursus對象都是eatomnivora

1

運算符instanceof不針對對象的static類型,而針對其dynamic類型進行檢查。 (omnivora)i instanceof eati instanceof eat完全相同。

無論你投多少錢,動態類型iursus,這是eatomnivora的子類。結果與您所獲得的結果不同。

請尊重Java的命名約定。您的程序非常難以閱讀。

+0

優秀的解釋! –