界面定义(见下文)让我困惑:
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
?答案 0 :(得分:14)
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
:类型及其声明的所有方法都是隐式抽象的。这些方法也是隐式公共的(并且不能用任何其他访问修饰符声明),因为接口的目的恰恰是声明对象的公共接口&#34;,即保证哪些方法实现该接口的任何对象都可以公开。
最后,上面描述的一些概念在Java 8中稍作修改:在该版本中,您将能够提供&#34;默认实现&#34;接口中的方法,以防实现接口的类不实现它们。事情将更类似于&#34;类多重继承&#34;:一个类将能够从多个源继承已实现的方法,这在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++; }
}
这样做是为了让你在不想要的时候忽略实施某些方法,同时仍然能够实现更好的&#34;可能/需要时的版本。例如:
class HighPerformanceNaturalNumberImplementation implements NaturalNumber {
private int n = 0;
@Override public void increment() { n++; }
@Override public void add(int n) { this.n += n; }
}
答案 1 :(得分:2)
回答1。
Java类只能扩展一个父类。多重继承是 不允许。但是,接口不是类,接口可以 扩展多个父接口。
回答2。
当存在父子关系时,应始终扩展类/接口。扩展类或接口应该没有其他原因。
答案 2 :(得分:0)
接口扩展接口。
接口可以扩展多个接口。
Clases扩展类。
一个类只能扩展一个类。
只有类可以实现接口。
一个类可以实现多个接口。