黑马程序员技术交流社区

标题: 关于线程售票例子的一点疑问 [打印本页]

作者: 周俊波    时间: 2014-5-22 15:31
标题: 关于线程售票例子的一点疑问
在下面的例子中,用到了static修饰票数,说明是静态的,我知道静态的东西不属于对象,但是new了4个对象以后4个对象共享这个k,那么这个静态值是属于谁的呢? 属于mian的 还是属于Ticket类的,要是属于Ticket类的,但是new了4次,是第一次new的时候给k分配空间,还是怎么的?我有点凌乱了..........
  1. class Ticket extends Thread {       
  2.        
  3.         static int k = 100;
  4.         public void run() {
  5.                 while(true) {
  6.                         if(k <= 0) {
  7.                                 break;
  8.                         }
  9.                         System.out.println(currentThread().getName() + ".....出售:" + k--);
  10.                 }
  11.         }
  12. }

  13. public class Test06 {
  14.         public static void main(String[] args) {
  15.                 Ticket t1 = new Ticket();
  16.                 Ticket t2 = new Ticket();
  17.                 Ticket t3 = new Ticket();
  18.                 Ticket t4 = new Ticket();
  19.                 t1.start();
  20.                 t2.start();
  21.                 t3.start();
  22.                 t4.start();
  23.         }
  24. }
复制代码

作者: never615    时间: 2014-5-22 15:38
应该是第一次new的时候分配空间,属于所有new的对象的。被static修饰了,在存储空间存在方法区,就像这个k,创建以后就在那里了,然后乱七八糟怎么调用都是操作的这个k。
作者: Sevenette    时间: 2014-5-22 19:49
静态是在第一次执行方法的时候就加载进了静态区,并且只加载一次
之后再怎么new都是在使用静态区的k;
它是属于ticket类的啊,但是和new了几次没有关系。只加载一次0.0
作者: 周俊波    时间: 2014-5-22 19:50
Sevenette 发表于 2014-5-22 19:49
静态是在第一次执行方法的时候就加载进了静态区,并且只加载一次
之后再怎么new都是在使用静态区的k;
它是 ...

的确,我仔细去百度终于弄清了 谢了啊
作者: BigKarel    时间: 2014-5-22 22:09
static 修饰的类变量存在于方法区(共享区),相当于将ticket全局共享
作者: gentleman    时间: 2014-5-24 08:10
静态成员在共享区,优先于对象,所以不属于哪个对象,并且和new对象没关系





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2