class Z {
static int peek() { return j; }
static int i = peek();
static int j = 1;
}

public class Test08 {

public static void main(String[] args) {
System.out.println(Z.i);
}}为什么输出结果会是 0    能解释下吗??

解决方案 »

  1.   

    很简单,程序是按顺序执行的,在执行peek()的时候,j=1还没被执行,所以就返回0的结果。
    如果将类Z修改如下:
    class Z {
        static int j = 1;
        static int peek() { return j; }
        static int i = peek();
    }
    输出结果就是1了,因为这回事j=1先执行。
      

  2.   


    类的初始化顺序:父静子静,父构子构
    这样也输出1
     int peek() { return j; }
      int i = peek();
    //静态的先初始所以int peek() { return j; } j==1
        static int j = 1;
      

  3.   

    这个涉及到类装载时的初始化顺序
    首先将所有的声明的值域赋值成default(即0, false, or null).
    然后再执行值域的显示初始化动作和初始化块的执行
    那么来看看执行顺序
    1.i,j被赋值为0
    2.初始化i,而i=peek();调用peek方法返回j,而此时j的值是0(还未执行显示初始化)
    3.初始化j,此时j才=1如果调用Z.Peek()那么结果就是1不错的问题~我以前也搞不明白呵呵,后来研究了他的初始化的动作就明白了~
      

  4.   

    4楼正解。当调用Z.i的时候,检查Z中是否有静态变量,有则初始化所有的静态变量;
    然后,初始化Z的非静态变量;
    最后调用构造函数,在调用本类之前,首先初始化父类,又回到开头。在初始化的时候,首先将所有的值赋初值(0,0.0,0L, false, null);
    然后按照先后顺序一一赋值。
      

  5.   

    ]
    class Z {
        static int peek() { return j; }
        static int i = peek();
        static int j = 1;
    }
        
    public class Test {
            
        public static void main(String[] args) {
            System.out.println(Z.i);  //1
            System.out.println(Z.i);  //2
        }}
    为什么 2这个位置输出的也是0,按按理说1已经把j初始化了并赋了值,为什么在调用次会重新初始化??
    搞不懂