Java实例化接口会导致奇怪的行为

时间:2014-10-22 10:41:30

标签: java inheritance interface abstract-class

如果跟随是一种奇怪的行为,我只是在徘徊。

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

我需要知道接口实例是否只从接口继承了预期的行为,或者它是否继承了抽象类。它似乎是后者,我想知道对此的解释,如果它是bug或功能。 :)

2 个答案:

答案 0 :(得分:2)

这可以按预期工作。我不完全确定是什么让你感到困惑。

  

我需要知道接口实例是否只从接口继承了预期的行为,或者它是否继承了抽象类。它似乎是后者,我想知道对此的解释,如果它是bug或功能。 :)

接口不会实现任何行为' (尽管Java 8提供了default methods),但您无法实例化它。您正在创建的所有实例都是类实例 - 在您的情况下,是InterfaceImplementer的实例。所以,让我们来看看这个班级及其家长:

TestIntefaceClass实现了两个接口及其方法。这里没什么特别的。

InterfaceImplementer扩展TestIntefaceClass类,它继承了sayBye()的实现,但它提供了自己的sayHi()实现。

现在以下(以及您的代码中的其他类似示例)

TestInterfaceOne impl = new InterfaceImplementer();

创建InterfaceImplementer的实例,如右侧所示。因此,在调用sayHi()sayBye()时将使用的实现将是Interfaceimplementer覆盖/继承的实现。

LE:This link可能对您有用。它讨论了使用接口作为类型,这就是你正在做的事情。

答案 1 :(得分:1)

“新的接口实施者()”正在为您提供......它只是您以各种方式声明它们......它按预期工作