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

Java 问题-无法指定最终局部变量od,因为它是在封闭类型中定义的,java,Java,当我试图在方法内部或花括号中声明一个变量(如int)时,然后我想稍后在花括号之外更改变量的值,这似乎不起作用。我做错了什么吗?我如何让它起作用?我对Java比较陌生,如果这似乎是一个非常基本的问题,那么很抱歉 Timer t = new Timer(); t.schedule(new TimerTask(){ public void run(){ double od = 0.5

当我试图在方法内部或花括号中声明一个变量(如int)时,然后我想稍后在花括号之外更改变量的值,这似乎不起作用。我做错了什么吗?我如何让它起作用?我对Java比较陌生,如果这似乎是一个非常基本的问题,那么很抱歉

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

稍后我想在花括号外更改od的值。我该如何做?

变量仅在声明的范围内可用。在本例中,作用域位于
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处理未使用的对象。

变量仅在声明的范围内可用。在本例中,作用域位于
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处理未使用的对象。

代码中的变量
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);

代码中的变量
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);

在运行块外部声明它。使其成为
实例
成员(变量)@Braj,但封闭类型的实例变量将为所有匿名计时器实例共享。在运行块外部声明它。使其成为
实例
成员(变量)@Braj但封闭类型的实例变量将为所有匿名计时器实例共享..我尝试了此操作,但仍然无效。我仍然无法在t.schedule()之外更改od的值代码块。@noobProgrammer您不能在外部更改值,因为它必须声明为
final
,以便内部类使用。也就是说,您可以创建一个对象来保存/设置该值:请参阅我回答中的编辑。我尝试使用getter和setter方法。在timertask内部,od将为0.5,但一旦超出timertask,od将更改为0。有什么原因吗that@noobProgrammer你一定是做错了什么,请把你的密码贴出来。这只是代码的一部分,但它包含了我提到的所有元素。我尝试了这个方法,但仍然不起作用。我仍然无法在t.schedule()代码块之外更改od的值。@noobProgrammer您不能在代码块之外更改od的值,因为它必须声明为
final
,以便内部类使用。也就是说,您可以创建一个对象来保存/设置该值:请参阅我回答中的编辑。我尝试使用getter和setter方法。在timertask内部,od将为0.5,但一旦超出timertask,od将更改为0。有什么原因吗that@noobProgrammer你一定是做错了什么,请把你的密码贴出来。这只是代码的一部分,但它包含了我提到的所有元素。