首先看下面代码public class Test{
static {
b = 9;//【1】 不报错
int i = b;//【2】 报错
int j = b = 9;//【3】 不报错
System.out.println(b+"------------");//【4】 报错
}
static int a = 1;
static int b;
static int c = 1;
public static void main(String[] args){
System.out.println("a="+a+":b="+b+":c="+c);
}
}静态块【1】 b = 9 用到静态变量b是没问题的。
静态块【2】 把b赋给i  int  i = b 报错了
静态块【3】 int j = b = 9; 没问题
静态块【4】 输出b报错了望高人指教

解决方案 »

  1.   

    public class Test{  
        static int a = 1;
        static int b;
        static int c = 1;
        static {
        b = 9;//【1】 不报错
        int i = b;//【2】 报错
        int j = b = 9;//【3】 不报错
        System.out.println(b+"------------");//【4】 报错
        }
        public static void main(String[] args){
        System.out.println("a="+a+":b="+b+":c="+c);
        }
        }
      

  2.   

    public class Test{  
      static int a = 1;
      static int b;
      static int c = 1;
      static {
      b = 9;//【1】 不报错
      int i = b;//【2】 报错
      int j = b = 9;//【3】 不报错
      System.out.println(b+"------------");//【4】 不会再报错
      }
      public static void main(String[] args){
      System.out.println("a="+a+":b="+b+":c="+c);
      }
      }
      

  3.   

    楼主,你这个是定义域在静态块后面的原因造成的了,因为static 修饰的类成员初始化的时候有相同的优先级,所以,你这里先执行static块的内容了,而这时候b 并没有被定义过,所以,不能拿来使用的,但是却可以赋值,这是Java虚拟机的编译问题,只要在代码中能找到定义就可以赋值,但是在执行到定义语句之前,是不可以拿来使用的
    至于int j=b=9这个实际上拿来使用的不是变量b而是9这个实际存在的整数常量
      

  4.   

    在静态域里面 初始化语句不必担心非法向前引用
    b = 9
    int j = b = 9;
    这两句都是初始化语句   static int b;  放在静态域 前面 或者后面都是可以的。但是,在静态域里面,要是访问里面的变量就得考虑非法向前引用的问题了
    int i = b;  
    System.out.println(b+"------------");
    这两句都是要访问b里面的数据
    在这种情况下, static int b; 就必须放在静态域的前面了
      

  5.   

    int i = b;//【2】 报错
    这个可能会在jdk未给b划分内存区域时操作,所以会报错