关于静态成员的初始化和静态代码块的初始化

 public class B {
    public static int Y = A.X+1;
    static{
        System.out.println(A.X);
    }

    public static void main(String[] args) {
        System.out.println("X:"+A.X + "Y:"+B.Y);
    }

}
class A{
    public static int X ;
    static{
//      B.Y = 0;为什么。。
//      先走静态成员的初始化,再走静态代码块
        X = B.Y + 1;
        System.out.println("*********"+B.Y);
    }
}

代码如上,运行结果为:
*********0
1
X:1Y:2
不理解为什么A中静态代码块的B.Y为0

main(String[] args)方法是java程序入口对吧,
那么第一个加载的类就是B,而且初始化(这里Y=0,因为先初始化,然后才赋值),
好了,有static关键字描述的代码在类加载的时候要执行一次,
执行到public static int Y = A.X+1;
此时去加载A类并初始化,执行static描述的代码,
到了X = B.Y + 1;这一步,B.Y=?,因为之前初始化B.Y = 0;
所以X = 0 + 1;,后面的看输出。

这里的关键是什么呢?答案是代码是按**顺!序!执!行!**的
你可以在B类的public static int Y = A.X+1;语句上面添加

static {
    System.out.println("B static 代码块");
}

再看下输出,或许你就明白了。

http://www.cnblogs.com/100thMountain/p/5374423.html
http://blog.csdn.net/deadpanda/article/details/5307932