2 wuwenxiong12 wuwenxiong12 于 2016.09.23 20:35 提问

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

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

7个回答

u013096045
u013096045   2016.09.23 21:17

结果: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

mengxianghn
mengxianghn 回复wuwenxiong12: 我错了,java类的对象中确实是默认为0,和C++搞混掉了
大约一年之前 回复
mengxianghn
mengxianghn 回复wuwenxiong12: 这个是因为static int 默认初始为0 吧
大约一年之前 回复
wuwenxiong12
wuwenxiong12 回复菜鸟_闯江湖: 好的,谢谢,大概有点理解了!!!
大约一年之前 回复
wuwenxiong12
wuwenxiong12 回复wuwenxiong12: 是不是可以将public static int Y=A.X+1; static{} 等效理解为public static int Y;static{Y=A.X+1;}呢,这样就很好理解了
大约一年之前 回复
qq_34468883
qq_34468883 回复wuwenxiong12: int类型的值默认为0,在得到具体赋值之前都是以0存在的。
大约一年之前 回复
u013096045
u013096045 回复wuwenxiong12: int型 默认为0 class C{int i; } 你print new c().i 看看
大约一年之前 回复
wuwenxiong12
wuwenxiong12 y=a.x+1 实际是运行: y=0 ; y=a.x+1;这里有点不懂啊,y的值怎么就为0了呢!!!!
大约一年之前 回复
oSanYeCao1234567
oSanYeCao1234567   Ds   Rxr 2016.09.23 21:06

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

wuwenxiong12
wuwenxiong12 我也测过了啊,不过不懂原理啊,debug都搞不出来
大约一年之前 回复
feng1790291543
feng1790291543   Ds   Rxr 2016.09.23 21:04

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

qq_34523010
qq_34523010 静态代码块
大约一年之前 回复
wuwenxiong12
wuwenxiong12 这种写法也是最近面试碰到的,晕啊!!!
大约一年之前 回复
qq_34468883
qq_34468883   2016.09.24 09:33

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

wuwenxiong12
wuwenxiong12 是啊,考的就是这个,不过有点不太理解耶
大约一年之前 回复
quasimodo_es
quasimodo_es   2016.09.24 16:47
 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
    }
}
quasimodo_es
quasimodo_es 回复wuwenxiong12: 步骤5,B.Y ,所以先走步骤4
大约一年之前 回复
wuwenxiong12
wuwenxiong12 步骤1中是不是此时还未加载A无法得出表达式的值所以系统默认给Y赋值0呢?怎么感觉步骤4和步骤5的顺序反了啊
大约一年之前 回复
quasimodo_es
quasimodo_es   2016.09.24 16:56

仅供参考比较

 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
    } 
}
zlt995768025
zlt995768025   2016.09.26 15:26

X = 1,Y = 2

Csdn user default icon
上传中...
上传图片
插入图片