java无法在用其他方法定义的内部类中引用非final变量?
我需要更改几个变量的值,因为它们在计时器中运行了几次。我需要通过计时器在每次迭代中不断更新值。我无法将值设置为final,因为这将阻止我更新值,但是我遇到了在下面的的错误:
无法引用用其他方法定义的内部类内部的非最终变量
public static void main(String args[]) { int period = 2000;
int delay = 2000;
double lastPrice = 0;
Price priceObject = new Price();
double price = 0;
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
public void run() {
price = priceObject.getNextPrice(lastPrice);
System.out.println();
lastPrice = price;
}
}, delay, period);
}
回答:
Java不支持真正的闭包,即使使用像你在此使用的匿名类(new TimerTask() { ... }
)看起来就像一种闭包。
这就是为什么它不起作用的原因:
变量lastPrice
和价格是main()
方法中的局部变量。你使用匿名类创建的对象可能会持续到该main()
方法返回之后。
当main()
方法返回时,局部变量(如lastPrice
和price
)从栈中清除,因此他们将不再存在后main()
回报。
但是匿名类对象引用了这些变量。如果匿名类对象在清除变量后尝试访问变量,则事情将变得非常糟糕。
通过lastPrice
和price final
,它们不再是真正的变量,而是常量。然后,编译器就可以使用常量的值(当然是在编译时)来替换匿名类中对lastPrice
和的使用price
(当然,在编译时),再也不用访问不存在的变量了。
其他支持闭包的编程语言通过特殊对待那些变量来做到这一点-确保方法结束时它们不会被破坏,以便闭包仍然可以访问变量。
你可以这样做:
public static void main(String args[]) { int period = 2000;
int delay = 2000;
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
// Variables as member variables instead of local variables in main()
private double lastPrice = 0;
private Price priceObject = new Price();
private double price = 0;
public void run() {
price = priceObject.getNextPrice(lastPrice);
System.out.println();
lastPrice = price;
}
}, delay, period);
}
以上是 java无法在用其他方法定义的内部类中引用非final变量? 的全部内容, 来源链接: utcz.com/qa/420515.html