繁体   English   中英

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

[英]Why is it called an “anonymous” inner class?

就在今天,我需要一种在不同对象之间传递函数的方法。 我很快就知道你不能直接用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吗? 一个被命名的东西不能匿名,对吗? 请帮助我摆脱对这个术语的困惑。

不, 匿名类是该类型的子类型,其名称用于实例化它。

Java编译器自动从类实例创建表达式派生匿名类声明。

MyCallback是超类型的名称。 您的匿名子类没有在编译时对开发人员有用的名称。

实际的类将有一个名称 ,如MyCallback$1 ,但您将无法在源代码中使用它。 例如,你做不到

MyCallback$1 anonymousClassInstance = ...;

不是我只是给它起名字MyCallback

不,你没有:名称MyCallback属于你在顶部声明的interface 可能只有一种名为MyCallback类型。

实现 MyCallback的类没有程序员可见的名称(因此,它被称为“匿名”)。 但是,该类在字节码中有一个名称,因为JVM要求所有类都有一个名称。 通常,此隐藏名称是特定于环境的。 编译器选择它的方式是不与其他类的名称冲突。 例如,如果在Windows上使用Oracle的JVM,则可以看到.class文件中生成的匿名类的代码,其名称中包含美元符号和数字。

不,你说那是MyCallback()接口的一个实例。 使用您提供的方法逻辑实现该接口的类被动态命名,并且它不是您可以真正确定或使用的名称...所以是的,就您的源代码而言,它真的是匿名的。

(通常,名称是通过在封闭类的名称末尾附加数字后缀来构造的 - 但是您无法知道将使用哪个后缀,并且不知道该名称对于该单词的大多数用途而言是足够匿名的。)

它被称为匿名,仅仅因为它没有名称。

在您的情况下,您提供了一个未命名的MyCallback 实现 (子类)。

一个匿名的内部类将是

public class OuterClass
{
   public OuterClass()
   {
       MyCallback annoInnerClass = new MyCallback(){
             public int execute(int i1, int i2)
             {
                return i1 + i2;
             }
       };

        ....
   }
}

我知道Wicket,你知道匿名的内部课程;)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM