问题 - 无法分配最终的局部变量od,因为它是在封闭类型中定义的

时间:2014-07-21 19:51:50

标签: java

当我尝试在方法内或大括号中声明变量(如int),然后我想在大括号之外更改变量的值时,它似乎不起作用。我做错了什么?我如何让它工作?我对Java相对较新,很抱歉,如果这看起来像一个非常基本的问题。

            Timer t = new Timer();
            t.schedule(new TimerTask(){
                public void run(){
                    double od = 0.5;
                }
            },30000);}

我想稍后在大括号外更改od的值。我该怎么做?

2 个答案:

答案 0 :(得分:3)

代码中的变量od是一个局部变量。就其本质而言,它不能从课外改变。

有几种方法可以达到你想要的效果。一个是使用命名类替换您定义的匿名类(即大括号内的匿名类),并替换od变量的setter:

class MyTimerTask extends TimerTask {
    private double od = 0.5;
    public void run(){
        System.out.println(od);
    }
    public double getOd() {return od;}
    public void setOd(double val) {od = val;}
}
...
MyTimerTask task = new MyTimerTask();
t.schedule(task, 30000);
...
// At this point you can change od
task.setOd(2.3);

答案 1 :(得分:1)

变量仅在声明的范围内可用。在您的情况下,范围在run()方法内。如果你想在外面使用它 - 它应该在外面声明。

 public static void main(String[] args) {
    final MyObj  obj = new MyObj();
    Timer t = new Timer();
    t.schedule(new TimerTask(){
        public void run(){
            obj.set(0.5);
        }
    },500);

    System.out.println(obj.get());

}

private static class MyObj {
    private double od;
    public void set(double val) {
        od = val;
    }
    public double get() {
        return od;
    }
}

<强>注:
一个好的经验法则是在较小(最具体)范围内声明变量,以帮助GC处理未使用的对象。