Java 对象,要求它们修改在其他位置使用的值
我目前已经在java文件中创建了一个新的CountDownTimer对象,然后我让该计时器具有一个onFinish()方法,在该方法中,它生成另一个新的CountDownTimer对象,该对象在其自己的onFinish()方法中具有所需的功能 但是,当我在第二个计时器之外创建一个布尔值(并将其保持为false),然后尝试在第二个计时器的onFinish()方法中将此布尔值修改为true时,它会给我一个错误:“变量[boolean Variable name]是从内部类中访问的,需要声明为final” 当我声明变量final时,尽管我绝对不能修改它 那么,解决这个问题最有效的方法是什么呢?我不能失去计时器的功能,但我对java的经验非常肤浅。如果这个问题看起来很愚蠢,我道歉 我也希望使用getter/setter方法,但对于计时器,我不确定这是否有效 谢谢大家提前回复!非常感谢!:) 为了清楚起见:我要求计时器设置一个布尔标志,用于检测第二个计时器是否确实已完成。这将把布尔标志设置为true,然后用它修改我创建的按钮的功能。以类似的方式,我还希望第二个计时器初始化一个长值,以便在其外部引用 如果布尔值=false,则该按钮将导致拒绝用户。Java 对象,要求它们修改在其他位置使用的值,java,Java,我目前已经在java文件中创建了一个新的CountDownTimer对象,然后我让该计时器具有一个onFinish()方法,在该方法中,它生成另一个新的CountDownTimer对象,该对象在其自己的onFinish()方法中具有所需的功能 但是,当我在第二个计时器之外创建一个布尔值(并将其保持为false),然后尝试在第二个计时器的onFinish()方法中将此布尔值修改为true时,它会给我一个错误:“变量[boolean Variable name]是从内部类中访问的,需要声明为fina
如果布尔值为true,则按钮接受用户。
然后我使用下面得到的长数 按要求编码:
boolean clickAppropriate = false;
new CountDownTimer(t1, t2) {
public void onTick(long millisUntilFinished) {
}
public void onFinish() {
mTextField.setText("text");
new CountDownTimer(t3, t4) {
public void onTick(long millisUntilFinished) {
public void onFinish() {
long startTime = System.nanoTime();
clickAppropriate = true;
}
}.start();
}
}.start();
在不修改解决方案结构的情况下,我在这里看到的最简单的修复方法是选择“final boolean[]clickproperty=new boolean[1]”,然后使用“clickproperty[0]”元素。如果您使用多线程环境,选择AtomicBoolean可能会带来额外的好处 您可以将
this
关键字与外部类(声明布尔值的类)名称一起使用来访问其成员
例如:
public class Outer {
public boolean bool = false;
public class Inner {
public void displayOuterClassVariable () {
System.out.println(Outer.this.bool);
}
}
}
在您的情况下,您需要将外部类名与
单击appriate
一起使用。但看起来您的变量是在方法中声明的。您必须将该变量放入类中才能使用此语法。这是一个有趣的问题。按照当前代码的结构方式,您将无法从匿名倒计时
类声明中更改单击适当的
变量的内容
这是Oracle编写的关于从匿名类中访问局部变量的内容:
“匿名类无法访问其封闭作用域中未声明为final
或有效为final的局部变量。”
这就是编译器给您这个错误的原因
从匿名类中访问和更改ClickApprovare
变量的一种方法是将该变量从局部变量更改为类变量
我能够成功地编译下面的代码,没有任何错误
public class Main
{
static boolean clickAppropriate;
public static void main(String args[])
{
clickAppropriate = false;
new CountDownTimer()
{
public void onFinish()
{
clickAppropriate = true;
};
}.start();
}
}
我要指出的一件事是不明显的——匿名类的使用实际上覆盖了类文件中声明的任何代码。例如,每次声明匿名类CountDownTimer
时,如下所示:
new CountDownTimer(t1, t2) {
public void onTick(long millisUntilFinished) {
}
};
这将覆盖onTick()
方法中可能存在于CountDownTimer
类文件中的任何代码。当onTick()
方法是抽象的时,这是正确的,但如果此方法是常规类方法,则可能不是您想要的。祝您好运。在列表中显示与代码相关的代码