如何解决如何增加最终的整数变量?
| 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。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。