原文
6.1.2 接口的属性
接口不是类。具体来说,不能使用 new 操作符实例化一个接口:
x = new Comparable(...) ;// error
?不过,尽管不能构造接口对象,但仍然能声明接口变量:
Comparable x;// OK
?接口变量必须引用实现了这个接口的一个类对象:
x= new Employee(...); // OK provided Employee implements Comparable
?接下来,如同使用 instanceof检查一个对象是否属于某个特定类一样,也可以使用instanceof 检查一个对象是否实现了某个特定的接口:
if(anObject instanceof Comparable){ ...}
?与建立类的继承层次结构一样,也可以扩展接口。这里允许有多条接口链,从通用性较高的接口扩展到专用性较高的接口。例如,假设有一个名为 Moveable 的接口:
public interface Moveable{
void move(double x, double y);
}
然后,可以假设一个名为 Powered 的接口扩展了以上 Moveable 接口:
public interface Powered extends Moveable{
double milesPerGallon();
}
虽然接口中不能包含实例字段,但是可以包含常量。例如:
public interface Powered extends Moveable{
double milesPerGallon();
double SPEED_LIMIT = 95;// a public static final constant
}
接口中的方法都自动为 public,类似地,接口中的字段总是 public static final。
注释:可以将接口方法显式标记为 public,将字段标记为 public static final,这是合法的。有些程序员出于习惯或者提高清晰度的考虑,可能会这样做。但Java 语言规范建议不要提供冗余的关键字,本书也采纳了这个建议。
?尽管每个类只能有一个超类,但可以实现多个接口。这就为定义类的行为提供了极大的灵活性。例如,Java 程序设计语言有一个非常重要的内置接口,名为 Cloneable (将在 6.1.9节中详细讨论)。如果你的类实现了这个 Cloneable 接口,Object 类中的 clone 方法就可以创建你的类对象的一个完全副本。如果你希望自已设计的类既能够克隆又能够比较,只要实现这两个接口就可以了。可以使用逗号将想要实现的各个接口分隔开。
class Employee implements Cloneable, Comparable
?注释: 记录和枚举类不能扩展其他类(因为它们隐式地扩展了 Record 和 Enum类)。不过,它们可以实现接口。
?注释: 接口可以是密封的 (sealed.)。与密封类一样,直接子类型(可以是类或接口)必须在 permits 子句中声明,或者要放在同一个源文件中。
本文暂时没有评论,来添加一个吧(●'◡'●)