为什么它被称为“匿名”内部阶级?
就在今天,我需要一种在不同对象之间传递函数的方法。 我很快就知道你不能直接用Java做到这一点,但是你可以传递一个显然被称为“匿名内部类”的wht实例,如下所示:
要定义类:
interface MyCallback { public int execute(int i1, int i2); }
要创建它的实例:
MyCallback callback = new MyCallback() { public int execute(int i1, int i2) { return i1 + i2; } };
并称之为:
int sum = callback.execute(1, 2); // Sets sum to 3.
很简单。 但我不明白为什么它被称为“匿名”。 我不是只给它起名字MyCallback吗? 一个被命名的东西不能匿名,对吗? 请帮助我摆脱对这个术语的困惑。
不,你说那是MyCallback()接口的一个实例。 使用您提供的方法逻辑实现该接口的类被动态赋予名称,并且它不是您可以真正确定或使用的名称…所以是的,就您的源代码而言,它真的是匿名的。
(通常,名称是通过在封闭类的名称的末尾附加数字后缀来构造的 – 但是您无法知道将使用哪个后缀,并且不知道该名称对于该单词的大多数用途而言是足够匿名的。)
不, 匿名类是该类型的子类型,其名称用于实例化它。
Java编译器自动从类实例创建表达式派生匿名类声明。
MyCallback
是超类型的名称。 您的匿名子类没有在编译时对开发人员有用的名称。
实际的类将有一个名称 ,如MyCallback$1
,但您将无法在源代码中使用它。 例如,你做不到
MyCallback$1 anonymousClassInstance = ...;
不是我只是给它起名字
MyCallback
?
不,你没有:名称MyCallback
属于你在顶部声明的interface
。 可能只有一种名为MyCallback
类型。
实现 MyCallback
的类没有程序员可见的名称(因此,它被称为“匿名”)。 但是,该类在字节码中有一个名称,因为JVM要求所有类都有一个名称。 通常,此隐藏名称是特定于环境的。 编译器选择它的方式是不与其他类的名称冲突。 例如,如果在Windows上使用Oracle的JVM,则可以看到.class
文件中生成的匿名类的代码,其名称中包含美元符号和数字。
它被称为匿名,仅仅因为它没有名称。
在您的情况下,您提供了一个未命名的MyCallback
实现 (子类)。
一个匿名的内部类将是
public class OuterClass { public OuterClass() { MyCallback annoInnerClass = new MyCallback(){ public int execute(int i1, int i2) { return i1 + i2; } }; .... } }
我知道Wicket,你知道匿名的内部课程;)
它被称为匿名,因为您没有提供类的实现名称。 它称为内部类,因为您在内联中定义。