【发布时间】:2013-05-20 23:42:25
【问题描述】:
我有这个界面:
public interface Animal {
void Eat(String name);
}
而这里的代码实现了接口:
public class Dog implements Animal {
public void Eat(String food_name) {
System.out.printf(food_name);
}
public static void main(String args[]) {
Animal baby2 = new Dog(); // <- this line
baby2.Eat("Meat");
}
}
我的问题是,为什么代码有效?无法实例化接口。然而在这种情况下,接口被实例化(用注释标记)。
这里发生了什么?
【问题讨论】:
-
注意:按照惯例,方法应该以小写字母开头
-
A) 实际上,一个接口可以被实例化......匿名。 B)您不是在实例化接口,而是在实例化
Dog -
@BrianRoach 你在 A 点是什么意思?匿名类是扩展其他类或实现接口的类(不是接口)。它与 OP 示例或instantiating an abstract class 中的情况相同。还是我错过了什么?
-
@Pshemo
Runnable r = new Runnable() { public void run() { System.out.println("hi!"); }};;) (是的......它是语法糖......它实际上是一个实现Runnable的匿名类) -
@BrianRoach 这将生成实现 Runnable 的匿名类的实例。如果您编译您的代码,您将看到名为
xxx$1.class的附加文件。所以它不会实例化接口,而是实现该接口的匿名类。也尝试打印System.out.println(r.getClass());。