Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 接口重写的方法不会被继承_Java_Inheritance_Interface - Fatal编程技术网

Java 接口重写的方法不会被继承

Java 接口重写的方法不会被继承,java,inheritance,interface,Java,Inheritance,Interface,我在读Khalid A.Mughal(为JE6)写的Java SCJP书,在主题7.6接口和第313页中,给出了 子接口可以从其超级接口重写抽象方法声明。重写的方法不会被继承 我不太明白什么是“重写的方法不会被继承。”的意思。我试着这样做: interface A { void abc(); } interface B extends A { @Override void abc(); } interface C extends B { void abc();

我在读Khalid A.Mughal(为JE6)写的Java SCJP书,在主题7.6接口和第313页中,给出了

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

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

interface A
{
    void abc();
}

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

interface C extends B
{
    void abc();
}

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

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

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();
  }
}
该程序只会输出:


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

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