就在今天,我需要一种在不同对象之间传递函数的方法。我很快就知道你不能直接在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吗?一个被命名的东西不能匿名,对吗?请帮助我摆脱对这个术语的困惑。
答案 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,你知道匿名的内部课程;)
它被称为匿名,因为您没有提供该类的实现名称。它称为内部类,因为您在内联中定义。