2014-10-22 26 views
0

如果下面是一個奇怪的行爲,我只是在漫遊。Java實例化界面結果奇怪行爲

public interface TestInterfaceTwo {   
    public void sayBye(); 
} 


public interface TestInterfaceOne {   
    public void sayHI(); 
} 


public abstract class TestIntefaceClass implements TestInterfaceOne, TestInterfaceTwo { 
    @Override 
    public void sayHI() {  
     System.out.println("HI"); 
    } 

    @Override 
    public void sayBye() { 
     System.out.println("Bye"); 
    } 
} 


public class InterfaceImplementer extends TestIntefaceClass{  
    @Override 
    public void sayHI() { 
     System.out.println("SAY HI"); 
    } 
} 

public static void main(String[] args) { 
    InterfaceImplementer impl = new InterfaceImplementer(); 
    TestInterfaceOne impl1 = new InterfaceImplementer(); 
    TestInterfaceTwo impl2 = new InterfaceImplementer(); 
    TestIntefaceClass impl3 = new InterfaceImplementer();  

    impl.sayHI(); 
    impl.sayBye(); 
    impl1.sayHI(); 
    impl2.sayBye(); 
    impl.sayBye(); 
    impl3.sayBye(); 
    impl3.sayHI(); 
} 

這些調用導致以下

SAY HI 
Bye 
SAY HI 
Bye 
Bye 
Bye 
SAY HI 

我需要知道,如果接口實例從接口繼承只有預期的行爲,或者如果它繼承抽象類。它似乎是後者,我想知道這個解釋,如果它是錯誤或功能。 :)

+0

1.讓你的代碼可讀,每行1個命令!!! 2.添加你的問題,我不明白你問什麼 – Dima 2014-10-22 10:44:58

+0

只是.. :)意識到我使用了錯誤的按鈕感謝評論 – Tharanga 2014-10-22 10:46:10

+1

它從抽象類繼承。所以AbstractClass就像Parent,而你的InterfaceImplementer是你抽象類的孩子。所以它的孩子(比如說人類孩子)從他/她的父母身上繼承基因和一些特徵。 – SMA 2014-10-22 10:49:51

回答

2

可正常工作。我不完全確定那是什麼讓你感到困惑。

我需要知道接口實例是否從接口繼承了預期的行爲,或者它是否繼承了抽象類。它似乎是後者,我想知道這個解釋,如果它是錯誤或功能。 :)

接口不執行任何'行爲'(儘管Java 8提供了default methods),並且您不能實例化一個。所有你創建的實例都是類實例 - 在你的情況下,實例爲InterfaceImplementer。那麼讓我們來看看這個類和它的父代:

TestIntefaceClass實現兩個接口及其方法。沒什麼特別的。

InterfaceImplementer延伸TestIntefaceClass類,它繼承了sayBye()的實現,但它提供了自己的實現sayHi()

下面的配置(和你的代碼中的其他類似的例子)

TestInterfaceOne impl = new InterfaceImplementer(); 

創建的InterfaceImplementer一個實例,你可以在右側看到的。因此,調用sayHi()sayBye()時將使用的實現將是Interfaceimplementer覆蓋/繼承的實現。

LE:This link可能對您有用。它討論使用接口作爲類型,這就是你正在做的事情。

1

「新InterfaceImplementer()」是給你正是......它只是你decalring它們作爲各種方式....它的工作如預期