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

标签 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

我需要知道接口(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/

相关文章:

interface - 去编译错误 "undefined function"

java - 如何检查 qsub 作业的命运

java - Java 中的 BigDecimal 加法

java - 在 Java 中创建受密码保护的 zip 文件,而无需在磁盘上创建它

java - Apache Isis jdoqlFromClause 多级继承验证错误

c++ - 在 C++ 中是否可以定义一个纯虚函数?

java - 根据从 Fragment A 收集的数据使用较少的样板代码从 Activity 启动 Fragment B

go - 多个数据库驱动程序场景 : passing interface as type

java - 通过 Java WebApp 使用 Runtime.exec 运行脚本

C++ 为什么要使用公共(public)、私有(private)或保护继承?