有关static的问题,求解啊!!!!

下面的程序能通过编译吗?如果能,说出结果并解释,不能编译,请说明错误原因
class A
{
public static int X; // ------ 1
static {X=B.Y+1;} // -------2
}
public class B

{
public static int Y=A.X+1; //------3
static{} //------4
public static void main(String[] args){
System.out.println("X = "+A.X+",Y = "+B.Y); //-----------5
}
}

静态可以这样使用?static {X=B.Y+1;}?好像有问题吧

亲测,可以通过编译,结果是:X = 1,Y = 2

结果:X = 1,Y = 2
原理分析:
首先加载class b,运行b的静态代码块
y=a.x+1 实际是运行:
y=0 ;
y=a.x+1;

运行y=a.x+1这一句时,因为用到a的非final static 属性,所以要先加载class a
a.x=0;
a.x=b.y+1=0+1=1
class a加载完

那么y=a.x+1=1+1=2
class b加载完

运行main 方法
输出X = 1,Y = 2

这个问题好,关键看对类的加载顺序了解不了解

 class A {
    public static int X; // 步骤2:X=0
    static {
        X = B.Y + 1; //步骤3:依赖了B,取B的值;步骤5,X = 0+1
    } 
}
public class B{
    public static int Y = A.X + 1; //步骤1:依赖了A,加载A  //步骤4:Y=1+1 
    static {//步骤6
    } 
    public static void main(String[] args) {
        System.out.println("X = " + A.X + ",Y = " + B.Y); //编译期间加载完毕,运行,结果 X=1,Y=2
    }
}

仅供参考比较

 public class BTest {
    public static void main(String[] args) {
        //A.X 和  B.Y 是不一样的,加载顺序不同
        System.out.println(A.X); //步骤6 ,X=2
    }
}

class A {
    public static int X; // 步骤1:X=0
    static {
        X = B.Y + 1; //步骤2:依赖了B,加载B;   //步骤5,X = 1+1 
    } 
}
class B{
    public static int Y = A.X + 1; //步骤3:Y=0+1 
    static {//步骤4
        System.out.println("X = " + A.X + ",Y = " + B.Y); //X=0,Y=1
    } 
}

X = 1,Y = 2