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

时间:2014-02-04 16:23:44

标签: java

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

5 个答案:

答案 0 :(得分:10)

不,an anonymous class is a sub type of the type whose name you use to instantiate it.

  

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

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

The actual class will have a name,类似于MyCallback$1,但您无法在源代码中使用它。例如,你做不到

MyCallback$1 anonymousClassInstance = ...;

答案 1 :(得分:4)

  

我不是只给它起名MyCallback

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

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

答案 2 :(得分:3)

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

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

答案 3 :(得分:2)

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

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

答案 4 :(得分:0)

匿名内部类将是

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

        ....
   }
}

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

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