黑马程序员技术交流社区

标题: 关于final型修饰的编程问题 [打印本页]

作者: 漫步人    时间: 2013-10-25 09:41
标题: 关于final型修饰的编程问题

  1. class Printer implements Runnable {
  2.   private static int taskCount;
  3.   private final int id = taskCount++;
  4.   Printer() {
  5.     System.out.println("Printer started, ID = " + id);
  6.   }
  7.   public void run() {
  8.     System.out.println("Stage 1..., ID = " + id);   这里的id应该如何理解啊??final型不是只能赋一次值嘛,怎么结果会显示0,1,2,3,??
  9.     Thread.yield();
  10.     System.out.println("Stage 2..., ID = " + id);
  11.     Thread.yield();
  12.     System.out.println("Stage 3..., ID = " + id);
  13.     Thread.yield();
  14.     System.out.println("Printer ended, ID = " + id);
  15.   }
  16. }

  17. public class E01_Runnable {
  18.   public static void main(String[] args) {
  19.     for(int i = 1; i < 5; i++)
  20.       new Thread(new Printer()).start();
  21.   }
  22. }
复制代码

作者: 孙涛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