为什么它被称为“匿名”内部阶级?

就在今天,我需要一种在不同对象之间传递函数的方法。 我很快就知道你不能直接用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,你知道匿名的内部课程;)

它被称为匿名,因为您没有提供类的实现名称。 它称为内部类,因为您在内联中定义。