在 Java 中修改上层变量

Modifying a variable in the upper levels in Java

我需要在嵌套的上层class中改一个变量(我猜可以这样调用,我是java新手,我搜索了没找到它)

代码:

public class mainClass {
   public static void main(String[] args) {
      boolean variableToChange = false;
      Timer myTimer = new Timer();
      TimerTask myTimerTask= new TimerTask() {
         public void run() {
            if(variableToChange==false) {    //it can read the variable
               variableToChange = true;         //but it can't change it?! 
                                                //it triggers and error here
            }
         }
      };
      myTimer.scheduleAtFixedRate(myTimerTask, 0, 100);
   }
}

尝试:

public static boolean variableToChange = false;

    public static void main(String[] args) {
        // TODO Auto-generated method stub

              Timer myTimer = new Timer();
              TimerTask myTimerTask= new TimerTask() {
                 public void run() {
                    if(mainClass .variableToChange==false) {    //it can read the variable
                        mainClass .variableToChange = true;         //but it can't change it?! 
                                                        //it triggers and error here
                    }
                 }
              };
              myTimer.scheduleAtFixedRate(myTimerTask, 0, 100);
           }

变量必须在 class 中,而不是在方法中,因为您要从其他对象更改它。

您可以访问,但不能更改variableToChange,因为它位于匿名内部-class 内并在其外部声明。

来自JLS 8.1.3

Any local variable, formal method parameter or exception handler parameter used but not declared in an inner class must be declared final. Any local variable, used but not declared in an inner class must be definitely assigned before the body of the inner class.

在匿名内部-class 之外声明的变量在其中被视为 final。 您可能正在使用 Java 8,其中 final 可以是隐式的。

"dirty" 解决方法(由于同步问题不推荐,但有效)声明:

final boolean[] variableToChange = new boolean[1];

然后你就可以在里面改了:

variableToChange[0] = true;

这是解决方案:

package com.example;

import java.util.Timer;
import java.util.TimerTask;

public class mainClass {

    public static class MyBoolean {
        public boolean value;
    };

   public static void main(String[] args) {
      final MyBoolean variableToChange = new MyBoolean();
      Timer myTimer = new Timer();
      TimerTask myTimerTask= new TimerTask() {
         public void run() {
            if(variableToChange.value==false) {    //it can read the variable
                variableToChange.value = true;         //but it can't change it?! 
                                                //it triggers and error here
            }
         }
      };
      myTimer.scheduleAtFixedRate(myTimerTask, 0, 100);
   }
}

您必须将 variableToChange 声明为 final,以允许其在内部 class 中进行修改。你不能修改它,因为你声明为最终变量。所以需要把它封装在一个对象中,然后修改它的属性。