如何增加最终的整数变量?

| Eclipse提供了“ 0”,但是我不能增加“ 1”变量。
@Override
public void onClick(View v) {
    final TextView tv = (TextView) findViewById(R.id.tvSayac);

    int i = 1;
    do {
        try {
            new Thread(new Runnable() {
                public void run() {
                    tv.post(new Runnable() {
                        public void run() {
                            tv.setText(Integer.toString(i));
                        }
                    });
                }
            });
            i++;
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    } while (i < 16);
}
    
已邀请:
        final是初始化后无法更改的实体。 最终版(Java) 您可以做的是在do / while循环范围内创建一个变量,该变量最后为
i
的值并将其发送到函数中。     
        这里最简单的解决方案是创建一个类:
public class FinalCounter {

    private int val;

    public FinalCounter(int intialVal) {
        val=intialVal;
    }
    public void increment(){
        val++;
    }
    public void decrement(){
        val--;
    }
    public int getVal(){
        return val;
    }

    public static void main(String[] arg){
        final FinalCounter test = new FinalCounter(0);
        test.increment(); // 1
        test.increment(); // 2
        test.increment(); // 3
        test.increment(); // 4
        test.increment(); // 5
        test.decrement(); // 4
        System.out.println(test.getVal());  // prints 4
    }
}
    
        最终变量只能在定义一次时初始化一次。可以在构造函数中随时设置它,但只能设置一次。在您使用i ++递增i的情况下,您尝试再次将递增的值分配给i,这是不允许的。     
        我认为可以创建变量“ 1”的本地副本。尝试这个:
@Override
public void onClick(View v) {
    final TextView tv = (TextView) findViewById(R.id.tvSayac);

    int i = 1;
    do {
        final int localCopy = i; // Create here a final copy of i
        try {
            new Thread(new Runnable() {

                public void run() {
                    tv.post(new Runnable() {
                        public void run() {
                            // use here the copy
                            tv.setText(Integer.toString(localCopy));
                        }
                    });
                }
            }).start(); // Don\'t forget to start the Thread!
            i++;
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    } while (i < 16);
}
通过创建最终的本地副本: 编译器不会再抱怨了 由于按值复制Java复制代码,您只会增加
i
而不会增加
localCopy
。 我想你也想启动线程... 编辑:的确,你是对的。您必须在循环内创建本地最终副本。检查新代码。     
        您可以像这样创建一个计数器类并对其进行递增。这样,Counter对象的引用可能是最终的,但您仍可以设置其值?     
        我所做的是添加一个:
private int i;
在这之前:
@Override
public void onClick(View v) {
    final TextView tv = (TextView) findViewById(R.id.tvSayac);

    i = 1;
    do {
        try {
            new Thread(new Runnable() {
                public void run() {
                    tv.post(new Runnable() {
                        public void run() {
                            tv.setText(Integer.toString(i));
                        }
                    });
                }
            });
            i++;
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    } while (i < 16);
}
之后,您将可以照常使用变量,而不必将其标记为final。     

要回复问题请先登录注册