0

在 Java 中,为什么我不能从接口继承?

如果情况是接口不提供方法的实现,那么我们如何能够从抽象类继承。

4

4 回答 4

13

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

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

  • 接口可以从接口继承
  • 抽象类和接口都是继承的形式,但目前只有抽象类支持代码继承。接口提供类型继承。在 Java 8 中,接口也将提供代码继承。

您也可以查看官方 Java 教程,这是一个很好的 Java 知识起点。

于 2013-10-22T13:12:48.520 回答
3

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

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

于 2013-10-22T13:13:16.407 回答
0

EXTENDSJava 仅支持通过关键字进行单继承。这个想法是您可以从同一个类中的多个接口“继承”。

因此,该IMPLEMENTS关键字用于“继承”一个接口。

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

于 2013-10-22T13:17:58.527 回答
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
于 2013-10-22T13:24:41.730 回答