[英]extending an interface instead of implementing it
接口定义(见下文)让我感到困惑:
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
};
extends
多个类。 extends
而不是implements
呢? Java 7及以下版中的类/接口继承和实现规则如下:
继承时,使用关键字extends
,当类继承自类或接口继承自一个或多个接口时。 术语extends
应理解如下: 此类/接口是其父类/接口的扩展 - 它是父或父的所有内容,甚至可能更多 。
当类实现接口(或多个接口)时,使用关键字implements
。 术语implements
将被理解如下: 保证该类的实例提供父接口的方法的实现 。
另外,还要注意一个abstract class
使用关键字implements
指父接口时,即使抽象类本身不实现接口的方法。 这并不违反上述原则:只能有具体类的实例,必须实现每个声明的方法; 因此,该抽象类的任何实例实际上必须是从接口实现方法的子类的实例。 例如,这是完全有效的: abstract class AnAbstractClass implements Cursor {}
,即使Cursor声明了很多方法。
在您的示例中,接口Foo<T extends Bar>
继承自另外两个接口,即Cursor
和Parcelable
,这是上面第3点的示例。 你使用关键字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; }
}
答案1。
Java类只能扩展一个父类。 不允许多重继承。 但是,接口不是类,接口可以扩展多个父接口。
答案2。
当存在父子关系时,应始终扩展类/接口。 扩展类或接口应该没有其他原因。
接口扩展接口。
接口可以扩展多个接口。
Clases扩展了类。
一个类只能扩展一个类。
只有类可以实现接口。
一个类可以实现多个接口。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.