public class TT 
{
static int i = 1;
int b = ++i;
static int c = ++i;

public static void main(String[] args) 
{
第9行  TT tt = new TT();
 System.out.println(i);
第11行           System.out.println(tt.b);//问题1:为什么输出的b是3而不是4
 System.out.println(i); //问题2:为什么输出的i是3不是4

 //问题3:如果把第9行语句和第11行的语句注释掉那么输出的i为什么是2不是3
}
}

解决方案 »

  1.   

    静态变量是在对象产生前就有了,也就是说在   TT tt = new TT(); 之前,static int i = 1; static int c = ++i; 
    都执行了,而int b = ++i; 是在产生对象时执行的。
      

  2.   

    看下这个帖子 对static的介绍http://topic.csdn.net/u/20081028/17/f2993356-f89b-4dde-a94f-9ec5821c5ac3.html
      

  3.   

    public class TT 

    static int i = 1; 
    int b = ++i; 
    static int c = ++i;  public static void main(String[] args) {
    TT tt = new TT();
    System.out.println(i);
    System.out.println(tt.b);//问题1:为什么输出的b是3而不是4 
    System.out.println(i); //问题2:为什么输出的i是3不是4 
    //问题3:如果把第9行语句和第11行的语句注释掉那么输出的i为什么是2不是3

    }
    //因为static 修饰的类成员是加载时初时化的,加载后c=2,i=2,这就是问题3的原因,
    //当你new TT()后,执行了int b = ++i; i自加后变为3,b=3,c仍然是2
    //不明白楼主认为会输出4呢?
      

  4.   

    问题1,问题2,i的初始值为1,执行了2次++i,自然是3,怎么会是4?
    问题3,注释掉9和11行,也就是没有生成类TT的对象,也就不会执行int b = ++i; 这一句,所以只执行了static int i = 1; static int c = ++i; 所以i的值为2,不是3
      

  5.   

    首先说明静态属性(也叫类属性)和静态方法(当然这里没有类方法了,也叫类方法)是类第一次被加载时执行的且jvm未重新启动的情况下是紧执行一次的。而实例属性和实例方法是对象创建时一起创建的,他们属于对象,而不属于类。
    问题一:执行了main方法,所以类被加载了,所以此时i和c都变为2,然后执行到第9行 TT tt = new TT(); 创建TT对象时实例变量int b = ++i;也创建了,说明i有递增了变为3后赋值给了b,那么b就输出3了。
    问题二和问题三你参考上面的解释。
      

  6.   

    不知道我的解释对不,i是静态的,经过
    static int i = 1; 
    int b = ++i; 
    static int c = ++i; 后,i的值为3,而b是指向静态变量i的,所以,当i的值变化的话b的值也发生变化,好像有点内存的学问吧。我觉得应该从深层来理解这个问题比较好理解。可以看看尚学堂讲的java基础,对内存的分析,你听了后如同在吸收甘露,我是深有感触的,可不是尚学堂的宣传员哈,呵呵。java
      

  7.   

    正解,注意c的值是2而不是3
    注释掉9.11,相当于
    static int i=1;
    static int c=++i;
    i自然是2
      

  8.   

    初始化顺序:
    i->c->b..好理解了吧??