【问题标题】:interface - Overridden methods are not inherited接口 - 被覆盖的方法不被继承
【发布时间】:2015-08-02 17:39:24
【问题描述】:

我正在阅读 Khalid A. Mughal 的 Java SCJP 书(针对 JE6),在主题 7.6 接口和第 313 页中,给出了这一点

子接口可以覆盖其超接口的抽象方法声明。被覆盖的方法不会被继承。

我不太明白“重写的方法不会被继承。” 是什么意思。我试着这样做:

interface A
{
    void abc();
}

interface B extends A
{
    @Override
    void abc();
}

interface C extends B
{
    void abc();
}

我没有收到任何错误。我不明白什么?

【问题讨论】:

  • 覆盖方法不适用于接口,仅适用于类。
  • 但是在书中它是在interfaces的上下文中说的
  • 在 Java 8 中,接口可以有方法的默认实现,但在早期版本中,覆盖的概念对接口没有意义。
  • @MickMnemonic 你可以用另一个抽象方法声明覆盖一个抽象方法声明。这可能涉及使返回类型更具限制性或更改抛出的异常列表。
  • 返回类型不是方法签名的一部分

标签: java inheritance interface


【解决方案1】:

这仅仅意味着被覆盖的方法可以具有与超级接口的方法略有不同的签名。例如:

public interface Foo {
    Object doSomething(String input) throws IOException;
}

public interface Bar extends Foo {
    @Override
    String doSomething(String input);
}

如您所见,在子接口中,我不再抛出已检查异常,并且我保证返回的对象是更具体的类型。 确实抛出检查异常的方法没有被继承,因为它被覆盖了。


我没有整个段落的上下文,但还有一些相关的内容仅适用于实现而不适用于接口,即如果您重写方法而不显式调用super 超类的实现不会发生。

例如,如果我有:

public class Example {
  public static class Foo {
    public void printSomething() {
      System.out.println("Foo");
    }
  }

  public static class Bar extends Foo {
    @Override
    public void printSomething() {
      System.out.println("Bar");
    }
  }

  public static void main(String[] args) {
    Bar bar = new Bar();
    bar.printSomething();
  }
}

这个程序将简单地输出:

Bar

但不是Foo。如果我添加对super.printSomething() 的调用,那么它将同时打印两者。

【讨论】:

    猜你喜欢
    • 2012-07-28
    • 2021-08-12
    • 2016-08-29
    • 2015-10-07
    • 1970-01-01
    • 1970-01-01
    • 2016-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多