这个显现我倒是知道,但是一直不知道为何会这样代码:public class Test {
static {
s1 = "s1"; // s1正常
}


static{
s2 = s1 +"s2"; // 提示s1不能在变量定义前引用。
}


static String s1;
static String s2;

}
问题:同样是引用,为何出现在等号左边的s1没问题,出现在等号右边的s1就出错了呢

解决方案 »

  1.   

    换一换位置就可以了
    编译是从上向下的
      static String s1;
        static String s2;
        static {
            s1 = "s1"; // s1正常
        }
         
         
        static{
            s2 = s1 +"s2"; // 提示s1不能在变量定义前引用。
        }
         
      

  2.   

    还是不一样的这个是在赋值, 是在write s1
     static {
            s1 = "s1"; // s1正常
     }
         
         
    这个是在取值, 是在read s1
        static{
            s2 = s1 +"s2"; // 提示s1不能在变量定义前引用。
        }
      

  3.   

    楼上说的对,在声明前可以writ,不可以read
      

  4.   

    static {
            s1 = "s1"; //s1定义了,把“s1”的引用赋给s1
      }
    s1="other";//重新赋值
    s1最终结果是other;
    s1="other";//如果在前面,申明,把“other”的引用赋给s1,
    静态代码块重新赋值,
    s1最终是“s1”,
    错的来了
    static {
            s2 = s1 + "s2"; // 提示s1不能在变量定义前引用。
        }
    s2有,从没初始化过,,现在不是访问,没问题。再去找s1,s1没有申明过,不知道什么东西,通过class找静态变量,s1找到了,但它没被初始化过,那编译器认为你怎么能操作未初始化的数据呢。应该够详细了吧