2

接口定义(见下文)让我感到困惑:

public abstract interface Cursor {
    // hide details
}

public abstract interface Parcelable {
    // hide details
}

public interface Foo<T extends Bar> extends Cursor, Parcelable {
    // details omitted for brevity
};
  1. 我认为Java没有多重继承,所以一个类不能extends超过一个类。
  2. 另一方面,一个类/接口可以实现多个接口。那么为什么要使用extends而不是 implements呢?
4

3 回答 3

14

Java 7及以下的类/接口继承和实现规则如下:

  1. 一个类只能从一个类继承(单继承)
  2. 一个类可能实现一个或多个接口(多接口实现)
  3. 一个接口可能继承自一个或多个接口(多接口继承)

extends继承时,无论是类从一个类继承还是一个接口从一个或多个接口继承时,都使用关键字。该术语extends应理解如下:此类/接口是其父类/接口的扩展——它是父类或父类的一切,可能还有更多

当一个类实现一个接口(或多个接口)时,您使用关键字implements。该术语implements应理解如下:保证此类的实例为父接口的方法提供实现

另外,请注意,即使抽象类本身没有实现接口方法,an 在引用父接口时也abstract class使用关键字。implements这并不违反上述原则:只能有具体类的实例,必须实现每个声明的方法;因此,该抽象类的任何实例实际上都必须是实现接口方法的子类的实例。例如,这是完全有效的:abstract class AnAbstractClass implements Cursor {},即使 Cursor 声明了很多方法。

在您的示例中,该接口Foo<T extends Bar>继承自其他两个接口,即Cursorand Parcelable,这是上面第三点的示例。你使用关键字extends并不是implements因为接口Foo没有实现任何东西:父接口的方法体仍然没有定义!如果您有一个实现这两个父接口的类,您将执行以下操作:

class AClass implements Cursor, Parcelable {
  @Override public // ... method signature and implementation
                   // for every method in Cursor and Parcelable
}

另外,请注意,声明接口时不需要使用关键字abstract:类型及其声明的所有方法都是隐式抽象的。这些方法也是隐式公共的(并且不能用任何其他访问修饰符声明),因为接口的目的正是声明“对象的公共接口”,即保证任何方法都可以公开使用实现该接口的对象。


最后,上面描述的一些概念在 Java 8 中会略有改变:在该版本中,您将能够在接口中提供方法的“默认实现”,以防实现接口的类不实现它们. 事情将更类似于“类多重继承”:一个类将能够从多个来源继承实现的方法,这在 Java 7 或更低版本中是不可能的。例如(语法尚未固定):

interface NaturalNumber {
  void increment();
  default void add(int n) {
    for (int i = 0; i < n; i++) {
      increment();
    }
  }
}

class NaturalNumberImplementation implements NaturalNumber {
  private int n = 0;
  @Override public void increment() { n++; }
}

这样做是为了让您在不希望时忽略实现某些方法,同时在可能/需要时仍然能够实现它们的“更好”版本。例如:

class HighPerformanceNaturalNumberImplementation implements NaturalNumber {
  private int n = 0;
  @Override public void increment() { n++; }
  @Override public void add(int n) { this.n += n; }
}
于 2013-06-21T05:07:06.317 回答
2

回答 1。

Java 类只能扩展一个父类。不允许多重继承。然而,接口不是类,一个接口可以扩展多个父接口。

回答 2。

当存在父子关系时,您应该始终扩展类/接口。扩展类或接口应该没有其他理由。

于 2013-06-21T05:06:49.183 回答
0

接口:

  • 接口扩展接口。

  • 一个接口可以扩展多个接口。

课程:

  • 类扩展类。

  • 一个类只能扩展一个类。

  • 只有类可以实现接口。

  • 一个类可以实现多个接口。

于 2013-06-21T05:11:25.350 回答