今天遇到一个奇怪的问题,代码如下:
public class Test {
    static {
        name="bsd";
    }
    static String name="asd";    public static void main(String[] args) {
        new Test();
    }
}
代码可以正常编译通过。但如果变成如下所示:
public class Test {
    static {
        name="bsd";
        System.out.println(name);
       
    }
    static String name="asd";    public static void main(String[] args) {
        new Test();
    }
}
程序就编译不通过了,在name打印处报错,如果把静态变量和静态代码块调换顺序,如下所示:
public class Test {
    static String name="asd";
    static {
        name="bsd";
        System.out.println(name);    }
    public static void main(String[] args) {
        new Test();
    }
}
程序就可以编译通过了。想了好久,搞不清这里面的门道,求大牛解释!

解决方案 »

  1.   

    变量未定义你使用了不是报错了吗??静态变量更换了位置,你name已经在前面定义了,后面肯定可以直接使用了
      

  2.   

    个人认为两者都是静态的前提下,都是按顺序执行,显然代码块放前面,引用时不知道name是不是静态的,所以报错
      

  3.   

    我支持7楼的解释。
    敬佩楼主对技术的钻研,我用了好多年Java,几乎从不考虑这样的东西,都是遇到了再说。。
      

  4.   

    这个其实你在类的最后面定义变量,你依然可以在前面引用,因为类加载时会将成员变量先加载进去的,所以赋值当然是没问题的。至于静态代码块里打印出错也很好理解,因为编译器将它当成是局部变量了,没有进行类型定义当然是不能引用的,用Test.name就行了。
      

  5.   

    因为静态块 在初始化时不会创建对象,所以 在静态块中 name="bsd"; 可以通过编译,而如果加入System.out.println(name);语句后,println是需要实例化对象的,但是name变量还没创建所以报错了。