让我们考虑下面的代码:
interface Cookable {
public void cook();
}
class Food {
Cookable c = new Cookable() {
public void cook() {
System.out.println("anonymous cookable implementer");
}
};
}
前面的代码创建了一个匿名内部类的实例,但在这里,新的即时类是Cookable接口的实现者。请注意,这是您唯一一次看到语法:
new Cookable()
其中 Cookable 是一个接口而不是非抽象类类型。想一想:
你不能实例化一个 interface,但这就是代码看起来正在做的事情。但是,当然,它不是实例化 a Cookable object
- 它是创建一个 new 的实例anonymous implementer of Cookable
。
你可以阅读这一行:
Cookable c = new Cookable(){}
作为“声明一个 Cookable 类型的引用变量,显然,它将引用实现Cookable接口的类中的对象。但是,哦,是的,我们还没有实现Cookable的类,所以我们要现在就在这里做一个。我们不需要类的名称,但它将是一个实现Cookable的类,这个花括号开始定义新的实现类。
对于匿名接口实现者来说,记住这一点很重要——他们只能实现一个接口。根本没有任何机制可以说您的匿名内部类将实现多个接口。事实上,一个匿名内部类甚至不能同时扩展一个类和实现一个接口。innve 类必须选择作为命名类的子类并且根本不直接实现任何接口或实现单个接口。
所以不要被任何实例化接口的尝试所迷惑,除非是匿名内部类。以下是不合法的:
Runnable r = new Runnable(); // can't instantiate interface
而以下是合法的,因为它正在实例化 Runnable 接口的实现者(匿名实现类):
Runnable r = new Runnable() {
public void run(){ }
};
你可以在这里阅读我的文章。