为什么不能从Interface继承

时间:2013-10-22 13:11:16

标签: java inheritance interface

在Java中,为什么我不能继承Interfaces?

如果情况是接口没有提供方法的实现,那么我们如何能够从Abstract Classes继承。

4 个答案:

答案 0 :(得分:13)

简单地说,你不能从接口继承,因为接口只提供抽象,而不是功能

以下评论中的注释(感谢@Mark Peters和@qqilihq):

  • Interfaces can inherit from interfaces
  • 抽象类和接口都是继承形式,但目前只有抽象类支持代码继承。接口提供类型继承。在Java 8中,接口也将提供代码继承。

您还可以查看Official Java Tutorials,这是Java知识的良好起点。

答案 1 :(得分:3)

这是因为抽象类和接口本质上是不同类型的对象。抽象类定义功能,而继承作为框架。

编辑:正如我在上面发布的那样,您可以继承任意数量的接口,但只能继承一个抽象类

答案 2 :(得分:0)

Java仅通过EXTENDS关键字支持单继承。这个想法是你可以从同一个类的多个接口“继承”。

因此IMPLEMENTS关键字用于“继承”接口。

一个IMPLEMENTS接口可以访问接口中所有声明的类。

答案 3 :(得分:0)

事实上,你可以继承接口 - 但只是为了扩展他们的接口。

您可以创建abstract个类来完成接口所需的部分或全部工作。

然后,您可以extend您的abstract课程来制作真正的课程。如果愿意,甚至可以覆盖抽象类的功能。

// close
interface Closeable {
  public void close();

}

// open and close
interface Openable extends Closeable {
  public void open();

}

// Simplistic implementation
abstract class AbstractCloseable implements Closeable {

  @Override
  public void close() {
    System.out.println(this.getClass().getSimpleName() + "-close");
  }

}

// Simplistic implementation
abstract class AbstractOpenable extends AbstractCloseable implements Openable {
  boolean open = false;

  @Override
  public void open() {
    System.out.println(this.getClass().getSimpleName() + "-open");
    open = true;
  }

  @Override
  public void close() {
    super.close();
    open = false;
  }

}

class PortHole extends AbstractOpenable implements Openable {

  public void clean() {
    if (!open) {
      System.out.println(this.getClass().getSimpleName() + "-clean");
    } else {
      System.out.println(this.getClass().getSimpleName() + "-fall out");

    }
  }

}

public void test() {
  System.out.println("Hello");
  PortHole p = new PortHole();
  p.open();
  p.clean();
  p.close();
  p.clean();
}

打印:

PortHole-open
PortHole-fall out
PortHole-close
PortHole-clean