final 定义变量 java_java无法在用其他方法定义的内部类中引用非final变量?

小编典典

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);

}

2020-01-10

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值