如果跟随是一种奇怪的行为,我只是在徘徊。
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或功能。 :)
答案 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)
“新的接口实施者()”正在为您提供......它只是您以各种方式声明它们......它按预期工作