Java 问题-无法指定最终局部变量od,因为它是在封闭类型中定义的
当我试图在方法内部或花括号中声明一个变量(如int)时,然后我想稍后在花括号之外更改变量的值,这似乎不起作用。我做错了什么吗?我如何让它起作用?我对Java比较陌生,如果这似乎是一个非常基本的问题,那么很抱歉Java 问题-无法指定最终局部变量od,因为它是在封闭类型中定义的,java,Java,当我试图在方法内部或花括号中声明一个变量(如int)时,然后我想稍后在花括号之外更改变量的值,这似乎不起作用。我做错了什么吗?我如何让它起作用?我对Java比较陌生,如果这似乎是一个非常基本的问题,那么很抱歉 Timer t = new Timer(); t.schedule(new TimerTask(){ public void run(){ double od = 0.5
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你一定是做错了什么,请把你的密码贴出来。这只是代码的一部分,但它包含了我提到的所有元素。