final int localVar = 5;
new Runnable() {
int innerVar = localVar; // <--- initialized here
public void run() {
System.out.println(innerVar);
}
}.run();
如果 localVar 是变异的(不是最终的),您可以使用
...
final int tmp = localVar;
new Runnable() {
int innerVar = tmp;
...
...
另请注意,如果需要调用方法或执行通常在构造函数中执行的其他初始化操作,则可以使用示例初始值设定项:
final int localVar = 5;
new Runnable() {
int innerVar;
// Initialization block executed upon construction of this class
{
System.out.println("Initializing an anonymous Runnable");
innerVar = localVar;
}
public void run() {
System.out.println(innerVar);
}
}.run();
public class Main {
public static class Razzy {
private final String name;
public Razzy(final String name) {
this.name = name;
}
public String getName() {
return name;
}
}
public static void main(final String[] args) {
final Razzy anonymous = new Razzy("Award") {
@Override
public String getName() {
return "Anonymous " + super.getName();
}
};
System.out.println(anonymous.getName());
}
}
public void enclosingMethod() {
final int localVariable = 42; // final is necessary
Runnable r = new Runnable() {
public void run() {
// look ma, no constructors!
System.out.println(localVariable);
}
};
r.run(); // prints 42
}
3条答案
按热度按时间cld4siwp1#
您可以执行以下操作:
如果
localVar
是变异的(不是最终的),您可以使用另请注意,如果需要调用方法或执行通常在构造函数中执行的其他初始化操作,则可以使用示例初始值设定项:
请参阅示例:为什么使用java示例初始值设定项?
ig9co6j12#
您认为我们不能使用构造函数来创建匿名类的假设是不完全正确的。只有从接口(不能有构造函数)创建匿名类时,才会出现这种情况。请看下面的示例:
在这里,类razzy有一个接受字符串的构造函数。在main方法中,使用这个单参数构造函数创建了razzy的匿名子类。
输出为:
匿名奖
这样就可以将局部变量传递到匿名类的构造函数中。
请注意,匿名类还可以访问其封闭类的字段:
具有相同的输出。
yrefmtwq3#
问题是,实际上不需要定义构造函数。匿名类隐式地可以访问封闭方法范围内的任何变量。它们只需要声明为final(在java8中,final关键字是不需要的,但是您仍然不能为它们重新赋值)。