c++背景下的Java范围问题



我正在开发我的第一个Android应用程序,这是我在学校学习了2年的c++。

代码如下:

double total = 100000000000L;
for(long i = 0L; i < diff; i++) {
    total += 1.8;
}
countView.setText(NumberFormat.getInstance().format(total));
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
     @Override
     public void run() {
         if (total += 1.8 < 200000000000L) {
            handler.postDelayed(this, 1000L);
            return;
         }
         handler.removeCallbacks(this);
     }
 }, 1000L);

在c++中,我可以毫无问题地重用total变量——它在相同的作用域中。但是在Java中,我得到一个错误消息,我试图访问一个内部类。如果尝试将total声明为public或static,则会产生一个错误,即此处不允许使用该修饰符。

为什么我可以在声明的下面使用total,而不能在下面几行使用total ?

在Java中,如果你想从本地类(如Runnable)访问封闭类的成员(即total),这些成员必须声明为final

https://docs.oracle.com/javase/tutorial/java/javaOO/localclasses.html

对于您的代码,而不是double total,重写代码(如果可以的话),使total成为一个整数,并使用final AtomicInteger total。如果您不能重写,我将查看AtomicDouble替代方案。

如果total是调用处理程序的类字段,它应该可以正常工作,没有任何问题。如果它是在调用处理程序的函数中声明的,请尝试将其声明为"final"。唯一的问题是,通过将其声明为final,您将无法像在run()方法中那样修改它的值。

最新更新