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
}
}
{
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
}
}
都执行了,而int b = ++i; 是在产生对象时执行的。
{
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呢?
问题3,注释掉9和11行,也就是没有生成类TT的对象,也就不会执行int b = ++i; 这一句,所以只执行了static int i = 1; static int c = ++i; 所以i的值为2,不是3
问题一:执行了main方法,所以类被加载了,所以此时i和c都变为2,然后执行到第9行 TT tt = new TT(); 创建TT对象时实例变量int b = ++i;也创建了,说明i有递增了变为3后赋值给了b,那么b就输出3了。
问题二和问题三你参考上面的解释。
static int i = 1;
int b = ++i;
static int c = ++i; 后,i的值为3,而b是指向静态变量i的,所以,当i的值变化的话b的值也发生变化,好像有点内存的学问吧。我觉得应该从深层来理解这个问题比较好理解。可以看看尚学堂讲的java基础,对内存的分析,你听了后如同在吸收甘露,我是深有感触的,可不是尚学堂的宣传员哈,呵呵。java
注释掉9.11,相当于
static int i=1;
static int c=++i;
i自然是2
i->c->b..好理解了吧??