写出以下程序的运行结果。
class StaticTest
 {
static int x=1;
int y;
StaticTest()
{
 y++;
}
public static void main(String args[ ])
{
  StaticTest st=new StaticTest();
  System.out.println("x=" + x);    //  2
System.out.println("st.y=" + st.y);  // 1
st=new StaticTest();
System.out.println("st.y=" + st.y); //  为何这个地方 y为 1 而不是2 呢?
}
static { x++;}
}帮忙解释下  为何第二次new 对象时 y的值是在0基础上+1,而不是1的基础上加1. 
谢谢!

解决方案 »

  1.   

    static int x = 1 x是属于所有StaticTest对象共享的成员变量只初始化一次
    int y y变量是属于每个StaticTest对象的成员变量,对于每个对象来说y初始都是0的,所以你new出来以后都是1
      

  2.   

    如果可以运行     那么每new一次y都要初始化的
      

  3.   

    new StaticTest();是对StaticTest进行初始化,y属性是属于对象的,所以每次初始化一个对象的时候y的值都是0,然后再构造函数里面+了1,就变成了1.所以只有你是new对象然后打印都会是1,如果你想第二次new的时候y变成2的话,你应该像x一样定义成static的变量,你可以去了解下static的用法。
      

  4.   

    昨天还有个帖子,http://topic.csdn.net/u/20120707/18/e4311483-7ddd-4d2f-9e18-2a30cde72e2e.html?40358,和这个帖子的内容一样.     本质问题是静态属性是类属性,只第一次类加载时初始化一次.对所有对象来说,那个x是一样的。(静态代码块也是只在第一次类加载时执行一次。)
        而y是成员属性,每个对象有一个自己的y.再创建对象时,先默认初始化为0,执行完构造方法后,变成1。 
        你第二次new 时是产生了一个新的对象,这个对象的"y"和上一个对象的"y"是不一样的,属于两个对象。
      

  5.   

    因为你又new一个出来一个对象,还是从0开始。
      

  6.   

    y是属于每个对象的属于,你两次st=new StaticTest()都会初始化y,所以y不会累加
      

  7.   

    弱弱的问一句:里面 static {x++;}  这个怎么理解,怎么没见过呢?
      

  8.   

    弱弱的问一句:里面 static {x++;} 这个怎么理解,怎么没见过呢?