【问题标题】:Modifying a variable in the upper levels in Java在Java中修改上层变量
【发布时间】:2016-05-24 13:08:54
【问题描述】:

我需要从嵌套更改上层类中的一个变量(我猜它可以这样调用,我是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);
   }
}

【问题讨论】:

    标签: java class variables inner-classes


    【解决方案1】:

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

    来自JLS 8.1.3

    任何使用但未在内部类中声明的局部变量、形式方法参数或异常处理程序参数都必须声明为 final。任何在内部类中使用但未声明的局部变量必须在内部类的主体之前明确分配。

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

    一个“肮脏”的解决方法(由于同步问题不推荐,但有效)是声明:

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

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

    variableToChange[0] = true;
    

    【讨论】:

    • @JohnRW,不,因为您不能在不重新分配布尔值(大类型)的情况下更改它。而且,您不能这样做,因为您将其声明为 final
    【解决方案2】:

    这是解决方案:

    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,以允许在内部类中对其进行修改。您不能修改它,因为您声明为最终变量。所以你需要把它封装在一个对象中,然后修改它的属性。

    【讨论】:

    • 我知道这是这样做的方法,但我对 Java 太陌生,我无法选择正确的标签静态、最终、公共私有等。它总是给我一些错误那些标签。
    • 可能你从 MyBoolean 定义中删除了静态。我在发布之前编译了这段代码,它可以工作。
    • 好的!谢谢!我会再试一次。
    【解决方案3】:

    试试:

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

    变量必须在类中,而不是在方法中,因为您想从另一个对象中更改它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-07
      • 2016-04-17
      • 2015-01-21
      • 1970-01-01
      • 2017-01-16
      • 2020-04-27
      • 1970-01-01
      • 2011-11-08
      相关资源
      最近更新 更多