如果跟随是一种奇怪的行为,我只是在徘徊。
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
我需要知道接口(interface)实例是否仅继承接口(interface)的预期行为,或者是否继承抽象类。似乎是后者,我想知道对此的解释以及它是否是错误或功能。 :)
最佳答案
这按预期工作。我不完全确定是什么让您感到困惑。
I needed to know if interface instances inherit only the expected behavior from the interface or if it inherits the abstract class. It seems it does the latter and I would like to know an explanation for this and if it is bug Or a feature. :)
接口(interface)不实现任何“行为”(尽管 Java 8 提供 default methods )并且您无法实例化接口(interface)。您创建的所有这些实例都是类实例 - 在您的例子中,是 InterfaceImplementer 的实例。那么让我们看看这个类及其父类:
TestIntefaceClass
实现两个接口(interface)及其方法。这里没什么特别的。
InterfaceImplementer
扩展了 TestIntefaceClass
类,它继承了 sayBye()
的实现,但它提供了自己的 sayHi() 实现
。
现在是以下内容(以及代码中的其他类似示例)
TestInterfaceOne impl = new InterfaceImplementer();
创建一个InterfaceImplementer
实例,如右侧所示。因此,调用 sayHi()
和 sayBye()
时将使用的实现将是 Interfaceimplementer
重写/继承的实现。
LE:This link可能对你有用。它讨论了使用接口(interface)作为类型,这就是您正在做的事情。
关于Java 实例化接口(interface)会导致奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26505624/