日期:2014-05-20  浏览次数:20679 次

JAVA向前引用的问题,郁闷死我了。
Java code
class Z {
    static int peek() { return j; }
    static int i = peek();
    static int j = 1;
}
class Test {
    public static void main(String[] args) {
        System.out.println(Z.i);//输出为0
    }
}

 先问各位大神一个问题:1.一个类(比如:Z)的静态变量什么时候初始化?
 2.上面代码的 peek() 方法 return j; 是哪里的 j ,是不是代码内部有个隐藏的 thisclass ,就像这样 return thisclass.j;
3.上面的代码到底是怎么执行的?为什么 i=0 而不是 1 呢?


------解决方案--------------------
这个问题基本上也是周周有啊。

1.一个类(比如:Z)的静态变量什么时候初始化?
——在类定义装载时就开始初始化;

2.上面代码的 peek() 方法 return j; 是哪里的 j ,是不是代码内部有个隐藏的 thisclass ,就像这样 return thisclass.j;
——return j;就是你下面定义的 static int j
——准确的说是:return Z.j;

3.上面的代码到底是怎么执行的?为什么 i=0 而不是 1 呢?
——因为初始化的过程是,先分配存储空间,再顺序执行初始化值的操作;
——所以一开始所有静态变量的存储空间都分配好了,然后再开始执行初始化值的操作。