修改Java中较高级别的变量

时间:2016-02-13 10:15:56

标签: java class variables inner-classes

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

3 个答案:

答案 0 :(得分:2)

您可以访问,但无法更改$tablez_col = " <table border=0 width=99% id=table2> <tr> <td width=299 align=center><b> <font face=Verdana size=2 color=#808080>Full Name</font></b></td> <td width=171 align=center><b> <font face=Verdana size=2 color=#808080>studentNo</font></b></td> <td width=276 align=center><b> <font face=Verdana size=2 color=#808080>SubjectName</font></b></td> <td width=106 align=center><b> <font face=Verdana size=2 color=#808080>GPA</font></b></td> <td width=176 align=center><b> <font face=Verdana size=2 color=#808080>CGPA</font></b></td> <td align=center><b> <font face=Verdana size=2 color=#808080>SCORE</font></b> </td> </tr>"; echo $tablez_col; // print columns // your loop start while( $row = mysqli_fetch_array( $result, MYSQLI_ASSOC ) ) { echo " <tr> <td width=299 align=center>" . $row['Fullname'] . "</td> <td width=171 align=center>". $row['studentNo']. "</td> <td width=276 align=center>". $row['SubjectName']."</td> <td width=106 align=center>" .$row['GPA']. "</td> <td width=176 align=center>".$row['CGPA']. "</td> <td align=center>" .$row['SCORE']."</td> </tr> </table>"; } // loop end ,因为它在匿名内部类中并在其外部声明。

来自JLS 8.1.3

  

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

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

A&#34;脏&#34;解决方法(由于同步问题而不推荐,但有效)是声明:

final

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

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

答案 1 :(得分:1)

这是解决方案:

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

答案 2 :(得分:0)

尝试:

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

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