Java 7及以下的类/接口继承和实现规则如下:
- 一个类只能从一个类继承(单继承)
- 一个类可能实现一个或多个接口(多接口实现)
- 一个接口可能继承自一个或多个接口(多接口继承)
extends
继承时,无论是类从一个类继承还是一个接口从一个或多个接口继承时,都使用关键字。该术语extends
应理解如下:此类/接口是其父类/接口的扩展——它是父类或父类的一切,可能还有更多。
当一个类实现一个接口(或多个接口)时,您使用关键字implements
。该术语implements
应理解如下:保证此类的实例为父接口的方法提供实现。
另外,请注意,即使抽象类本身没有实现接口方法,an 在引用父接口时也abstract class
使用关键字。implements
这并不违反上述原则:只能有具体类的实例,必须实现每个声明的方法;因此,该抽象类的任何实例实际上都必须是实现接口方法的子类的实例。例如,这是完全有效的:abstract class AnAbstractClass implements Cursor {}
,即使 Cursor 声明了很多方法。
在您的示例中,该接口Foo<T extends Bar>
继承自其他两个接口,即Cursor
and 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; }
}