1  public class Test{

3    static {
4       b = 9;
5       System.out.println(b+"------------");
6    }
7    static int a = 1;
8    static int b;
9    static int c = 1;
10   public static void main(String[] args){
11       System.out.println("a="+a+":b="+b+":c="+c);
12    }
13    }
这个程序编译会出错,再第5行为什么?

解决方案 »

  1.   

    换下声明的顺序,先变量然后静态块。因为static变量和静态块的初始化优先级是一样的。所以静态块就找不到b这个变量。
      

  2.   

    没指定b的类型 把static int b拿到上边不就行了么。
      

  3.   

    SCJP考试题
    因为静态变量有申明顺序,你可以假设这些静态变量方法放在一个函数内运行,是不是没申明的变量就不能使用哪
      

  4.   

    静态块 变量 方法拥有同等优先级JAVA顺序执行
      

  5.   


    静态块一般用于类中只执行一次的东西,而且在类加载时就执行。比如JDBC的加载连接驱动。
      

  6.   

    楼上的说的很明白了,如想细究,请看看Java编程思想
      

  7.   

    static {
    4 b = 9;
    5 System.out.println(b+"------------");
    6 }
    这是什么?方法?类?什么都不是·!
      

  8.   


    这个是方法,JVM会使用一个叫做clinit方法名的方法来执行其中的指令,而且这段执行的时间比较早,在类加载进JVM后,初始化的时候就会执行,在所有方法之前,包括main方法。
      

  9.   

    静态变量和静态块的加载顺序是先加载静态块,然后加载静态变量。
    而你的静态变量是在静态块中初始化的而不是声明的,因为会出错:
    Cannot reference a field before it is defined
      

  10.   

    static代码是和类变量定义代码绑定为一个整体代码,所以其中的用到的静态变量必须在static代码之前定义
      

  11.   


    感觉就是定义与申明的区别。就好比你定义一个变量(如int a;)然后System.out.println(a);就会报错 .static{
    int a =  b = 9; //这样就不会
    //int a = b; //同样报错
    System.out.println(b + "++++++");
    }
      

  12.   

    static{
    int a =  b = 9; //这样就不会
    //int a = b; //同样报错
    System.out.println(a + "++++++");
    }
    System.out.println(b + "++++++");的b应该是a才对
      

  13.   

    研究了一下:
    1、类先初始化了a、b、c,值为0;
    2、在静态块里给b赋值为9,执行完静态块会继续给a、b赋值;
    3、System.out.println(b+"------------"); 因为在“b”使用前在程序中没有声明,所以报错。
    4、如果在改为System.out.println(Test.b+"------------"); 这样编译器会找到Test类中声明变量“b”的地方,所以就不会报错。个人观点:在静态块中引用的变量必须先声明,或者加上类名,或者使用类中的方法调用,编译器就会找到变量的声明位置了。大家继续讨论
      

  14.   

    网下下载 thinking in java ,自己去初始化顺序,