2014-10-22 22 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它们作为各种方式....它的工作如预期