Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对象,要求它们修改在其他位置使用的值_Java - Fatal编程技术网

Java 对象,要求它们修改在其他位置使用的值

Java 对象,要求它们修改在其他位置使用的值,java,Java,我目前已经在java文件中创建了一个新的CountDownTimer对象,然后我让该计时器具有一个onFinish()方法,在该方法中,它生成另一个新的CountDownTimer对象,该对象在其自己的onFinish()方法中具有所需的功能 但是,当我在第二个计时器之外创建一个布尔值(并将其保持为false),然后尝试在第二个计时器的onFinish()方法中将此布尔值修改为true时,它会给我一个错误:“变量[boolean Variable name]是从内部类中访问的,需要声明为fina

我目前已经在java文件中创建了一个新的CountDownTimer对象,然后我让该计时器具有一个onFinish()方法,在该方法中,它生成另一个新的CountDownTimer对象,该对象在其自己的onFinish()方法中具有所需的功能

但是,当我在第二个计时器之外创建一个布尔值(并将其保持为false),然后尝试在第二个计时器的onFinish()方法中将此布尔值修改为true时,它会给我一个错误:“变量[boolean Variable name]是从内部类中访问的,需要声明为final”

当我声明变量final时,尽管我绝对不能修改它

那么,解决这个问题最有效的方法是什么呢?我不能失去计时器的功能,但我对java的经验非常肤浅。如果这个问题看起来很愚蠢,我道歉

我也希望使用getter/setter方法,但对于计时器,我不确定这是否有效

谢谢大家提前回复!非常感谢!:)

为了清楚起见:我要求计时器设置一个布尔标志,用于检测第二个计时器是否确实已完成。这将把布尔标志设置为true,然后用它修改我创建的按钮的功能。以类似的方式,我还希望第二个计时器初始化一个长值,以便在其外部引用

如果布尔值=false,则该按钮将导致拒绝用户。
如果布尔值为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()
方法是抽象的时,这是正确的,但如果此方法是常规类方法,则可能不是您想要的。祝您好运。

在列表中显示与代码相关的代码