interface - 不会继承重写的方法

Shu*_*tra 6 java inheritance interface

我正在阅读Khalid A. Mughal的Java SCJP书(JE6),主题7.6 Interfaces和Page number 313,它给出了

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

我不太明白"重写的方法不会被继承".手段.我试着这样做:

interface A
{
    void abc();
}

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

interface C extends B
{
    void abc();
}
Run Code Online (Sandbox Code Playgroud)

我没有得到任何错误.我不明白的是什么?

dur*_*597 2

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

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

public interface Bar extends Foo {
    @Override
    String doSomething(String input);
}
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,在子接口中,我不再抛出受检查的异常,并且我保证返回的对象是更具体的类型。确实抛出检查异常的方法不会被继承,因为它被重写了。


我没有整个段落的上下文,但还有一些相关的内容仅适用于实现而不适用于接口,也就是说,如果您在没有显式调用的情况下重写方法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();
  }
}
Run Code Online (Sandbox Code Playgroud)

该程序将简单地输出:

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

public interface Bar extends Foo {
    @Override
    String doSomething(String input);
}
Run Code Online (Sandbox Code Playgroud)

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