黑马程序员技术交流社区
标题:
关于final型修饰的编程问题
[打印本页]
作者:
漫步人
时间:
2013-10-25 09:41
标题:
关于final型修饰的编程问题
class Printer implements Runnable {
private static int taskCount;
private final int id = taskCount++;
Printer() {
System.out.println("Printer started, ID = " + id);
}
public void run() {
System.out.println("Stage 1..., ID = " + id); 这里的id应该如何理解啊??final型不是只能赋一次值嘛,怎么结果会显示0,1,2,3,??
Thread.yield();
System.out.println("Stage 2..., ID = " + id);
Thread.yield();
System.out.println("Stage 3..., ID = " + id);
Thread.yield();
System.out.println("Printer ended, ID = " + id);
}
}
public class E01_Runnable {
public static void main(String[] args) {
for(int i = 1; i < 5; i++)
new Thread(new Printer()).start();
}
}
复制代码
作者:
孙涛00
时间:
2013-10-25 10:01
因为static的关系,static为静态修饰符,静态变量static taskCount 在第一个线程启用后,其taskCount 的值并不是零,应为在给id 赋值的时候taskCount++ 了。虽然id为最终常量值,但每次线程启动,就重新又生成 final int id ,所以并不是id的值改变了,而是新的常量id
作者:
未知数|X|
时间:
2013-10-25 10:16
其实原因就在你的for循环上
for(int i = 1; i < 5; i++)
new Thread(new Printer()).start();
}
你在这里连续开启了四个线程而且是针对不同对象,也就是你开启四个线程时是针对的四个不同对象,被static修饰的变量是被对象所共享的,当你第四次循环时,那 taskCount也累加了四次,并不是你对final,重新赋值了而是你在四个对象中,对id赋值了四次,而final在这四个对象中的值是不同的,你的这个id分别属于,四个不同对象而且相互直接没有影响,所以不存在重新赋值的问题,你把程序改成下面那样
Printer p=new Printer();
for(int i = 1; i < 5; i++)
new Thread(p).start();
}
针对一个对象操作,id的值肯定是同一个,或者你把id也用static修饰,那它的值也会是相同的
作者:
qixing0918
时间:
2013-10-25 14:14
本帖最后由 qixing0918 于 2013-10-25 14:16 编辑
for(int i = 1; i < 5; i++)
new Thread(new Printer()).start();
}
这句是建5个printer 类
5个类都有final final 是不变的
只是 static 全局变量给他赋不同的值而已(final 初始化赋值)
作者:
王飚
时间:
2013-10-25 17:07
这里是由于每次main函数进行一次for循环,都会启动一个新的线程(new Printer()),所以,对应的对象调用final的值(id的值)其实一直是唯一的,所以final int id在同一个对象的调用中并没有改变;
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2