A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 邵阳 中级黑马   /  2012-7-9 15:20  /  2932 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 邵阳 于 2012-7-9 20:32 编辑

毕老师讲那个卖票例子,为什么加个static就卖100张票,不加卖44张票。很不理解啊。有没有详细解释啊。不甚感激

11 个回复

倒序浏览
买票的问题中关于static 你是不是记错了呢  由于如果不加static会使每个窗口的卖票数都是100  所以加入是正确的 几个窗口一共就卖100张 但是static的周期太长不提倡 直接就私有化票数就行private int tic=100; 我的代码

class Ticket  implements Runnable //        extends Thread
{  
        //private static int tic=100;
        private int tic=100;
        public void run(){
                while(true){
                        if(tic>0){
                        //System.out.println(currentThread().getName()+"......."+tic--);
                        System.out.println(Thread.currentThread().getName()+"......."+tic--);
                        }
                }
        }
}

class  TicketDemo
{
        public static void main(String[] args)
        {

                Ticket t=new Ticket();//创建线程
                Thread t1=new Thread(t);
                Thread t2=new Thread(t);
                Thread t3=new Thread(t);
                Thread t4=new Thread(t);
                t1.start();
                t2.start();
                t3.start();
                t4.start();

        }
}
回复 使用道具 举报
上面代码//private static int tic=100;
        private int tic=100; 这两行哪个都会正常运行 但是更提倡私有化的  这么做是为了让几个线程同时用一个tic
回复 使用道具 举报
不加static修饰时,创建几个线程,就卖多少票!比如说创建两个线程,那么就要卖200张票,而加了static修饰时,相当于一共就100张票,要求两个线程去完成!这是我的理解!{:soso_e100:}
回复 使用道具 举报
必须加上static 以表明自己总票数是属于整个类而不是属于每个对象的……也只有这样才符合逻辑
回复 使用道具 举报
被static修饰后的成员,在编译时由内存分配一块内存空间,直到程序停止运行才会释放,那么就是说该类的所有对象都会共享这块内存空间,static修饰ticket,类初始化时就分配了100张票,所有对象共享这一百张票。最终卖的票就会是100张,不加static修饰,则每new一个线程对象,就会有一个自己的成员变量ticket,导致会卖100*线程数量的票。
回复 使用道具 举报
赵倩倩 发表于 2012-7-9 15:59
上面代码//private static int tic=100;
        private int tic=100; 这两行哪个都会正常运行 但是更提倡 ...

为什么加个static就同时用一个tic,就是这里不懂。毕老师也没讲
回复 使用道具 举报

被static修饰的成员随着成员的加载而存在于内存的共享区,该成员在本类中被所有对象共享,直到所在类结束才消失。
在本例中如果没加static,就是说每个线程都将分配100张票,但由于static周期过长,要实现此种方法建议用私有化,可以这样写private static int tic=100;
class Ticket  implements Runnable  
{  
        //private static int tic=100;
        private int tic=100;   ///这两种方法都会正常运行 一般情况下建议用私有化, 这样比较节省内存  
        public void run(){
                while(true){
                    if(tic>0){
                               System.out.println(Thread.currentThread().getName()+"......."+tic--);
                        }
                }
        }
}
class  TicketDemo
{
        public static void main(String[] args)
        {
                Ticket t=new Ticket();//创建线程
                Thread t1=new Thread(t);
                Thread t2=new Thread(t);
                Thread t3=new Thread(t);
                Thread t4=new Thread(t);
                t1.start();//运行线程
                t2.start();
                t3.start();
                t4.start();

回复 使用道具 举报
007lzg 发表于 2012-7-9 16:46
不加static修饰时,创建几个线程,就卖多少票!比如说创建两个线程,那么就要卖200张票,而加了static修饰 ...

我问的是为啥是这样
回复 使用道具 举报
孙胜录 发表于 2012-7-9 16:53
必须加上static 以表明自己总票数是属于整个类而不是属于每个对象的……也只有这样才符合逻辑 ...

加上static为啥属于整个类啊?郁闷
回复 使用道具 举报
邵阳 发表于 2012-7-9 20:01
加上static为啥属于整个类啊?郁闷

static特点:
1,随着类的加载而加载。
2,优先于对象存在。
3,被所有对象共享。
4,可直接被类名调用。
实例变量和类变量(静态变量)区别:
1,类变量随着类的加载存在于方法区中。
2,实例变量随着对象的建立存在于堆内存中。
什么时候定义静态变量呢?
当对象中出现共享数据时,这个变量应该被定义为静态的。

你加了static 这个变量就会被所有对象共享,不加的话每个对象都有自己的实例变量!
回复 使用道具 举报
加static 数据就共享了, 明白?    就是那两个用的都是一个窗口了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马