下面的程序能通过编译吗?如果能,说出结果并解释,不能编译,请说明错误原因
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