java - Java 中的接口(interface)继承什么时候有用?

标签 java oop inheritance

让我们看一下下面的 Java 代码。

interface FirstInaterface
{
    public void show();
}

interface SecondInterface extends FirstInaterface
{
    @Override
    public void show();

    public void someConcreteMethod();
}

interface ThirdInterface extends SecondInterface
{
    @Override
    public void show();
}

final class Demo implements ThirdInterface
{
    @Override
    public void show()
    {
        System.out.println("The show() method invoked");
    }

    @Override
    public void someConcreteMethod()
    {
        System.out.println("The someConcreteMethod() method invoked");
    }

}

final public class Main
{
    public static void main(String[] args)
    {
        Demo demo=new Demo();
        demo.show();
        demo.someConcreteMethod();
    }
}

上面的 Java 代码显示了接口(interface)的多级继承,其中 ThirdInterface 在它上面有两个接口(interface)。 show() 方法首先在接口(interface) SecondInaterface 中被覆盖,然后在接口(interface) ThirdInterface 中再次被覆盖,这个接口(interface)最终被类 Demo.


在这种情况下,类 Demo 将合并上述接口(interface)中哪个版本的 show() 方法?编译器如何能够在运行时动态解析特定版本的 show() 方法?


感觉上面的接口(interface)继承层次结构中最后一个接口(interface)(即ThirdInterface)中的show()方法会被编译器调用。如果是这样,则上述两个接口(interface)(即 FirstInaterface、SecondInaterface)中的 show() 方法毫无用处,毫无用处,因为它们是在接口(interface)内声明的,它们本身never在任何地方都有自己的实现。这种接口(interface)继承什么时候有用?

最佳答案

只有方法实现可以覆盖,不能覆盖接口(interface)中的方法规范。

In such a scenario, which version of the show() methods from the above interfaces will be incorporated by the class Demo? How is the compiler able to resolve a specific version of the show() method dynamically at run time?

什么“版本”?方法签名是相同的,所以实际上只有一个方法规范。在运行时,会有一个实现类,只有那个类中的方法实现才是真正被调用的。

If it is so then, the show() methods in the above two interfaces (namely, FirstInaterface, SecondInaterface) are useless and serve no purpose at all, since they are declared within interfaces, they themselves can never have their own implementations anywhere.

嗯,直接实现 FirstInterface 的类呢?如果有的话,没有(技术)目的的是子接口(interface)中的“覆盖”方法。如果 SecondInterfaceThirdInterface 没有 show() 方法,它的语法效果将完全相同。

但是,覆盖子接口(interface)中的方法可能有正当理由:提供不同的注释来解释方法契约中的语义变化。这方面的示例可以在 Java API 的集合框架中看到:Set.add()Collection.add() 具有不同的契约,因为它添加了限制不应添加重复元素。

关于java - Java 中的接口(interface)继承什么时候有用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8007806/

相关文章:

wpf - 将窗口继承到另一个窗口xaml

c++ - 模板继承和抽象类

java - Android + WS-* 服务?

java - 在 Java 中管理具有几乎相同属性的 2 个类的最佳方法

PHP[OOP] - 如何手动调用类构造函数?

Java - 如何为类外变量抛出 IllegalArgumentException

java - 安卓构建标志?

java - 如何在 JPQL 中使用通用实体名称

java - 适用于 Windows 7 x64 的 Java EE 6 SDK 在哪里?

C# 创建一个列表来保存基类的任何派生子项