三个小程序.分别说出答案和为什么
1:
public   class   test{     static{ 
        i=9; 
        }         
static   int   i=0; 
        public   static   void   main(String   args[]){         
                      System.out.println("i="+i);   
  
        }         

2:
public   class   test{     static   {   
    i=9;   }   
static   int   i;         public   static   void   main(String   args[]){         
                      System.out.println("i="+i);   
  
        }         

3.
public   class   test{     static   {   
    i=i+9;   }   
static   int   i;         public   static   void   main(String   args[]){         
                      System.out.println("i="+i);   
  
        }         

解决方案 »

  1.   

    现在的小朋友怎么都这么性急,动不动就什么NB不NB,在学习Java前先学习汉语应该如何向人提问.
      

  2.   

    路过(程序有错,只有第一个没有错)
    Cannot reference a field before it is defined.
      

  3.   

    我说一下我的解释,可能有错误的地方啊,
    首先,java的初始化顺序是这样的,先把类变量进行初始化,但是还不去赋值,这好像是我从哪篇文章上看来的。
    然后是初始化类模块,然后再去给类变量赋值你的第一个是0,就是这个道理,第二个是9,也是这个道理,第三个呢,出错,因为i此时并没有值,你对地址进行了操作
    所以会报错。
    闲来无事,研究了一下,呵呵,可能说得难免有错误,还请指正
      

  4.   

    Think in Java 中描述:生成那个类的一个对象时,或者首次访问属于那个类的一个static成员时,static块会被执行。你上面列举的东西看起来确实很神秘的哦,不过在实战中用不到吧...
      

  5.   

    我觉得是顺序初始化。。但在static块里如果遇到没声明的变量,就会先找到该静态变量的声明,只找到它的声明类型,并还没执行此句的赋值。
      

  6.   

    自己顶,好像现在只有yuwenbao 说的有些道理,Cpp_fan 就是个大SB
      

  7.   

    我说说我的理解吧。我不肯定的哦。
    public  class  test{           static{   
       i=9;   
    }                   
    static int i=1;  //注意 这里为了解释的时候清楚一点 我改成1  
    public  static void main(String  args[]){                   
                System.out.println("i="+i);       
                    }                   
    }   
    先声明成员 给它们一个默认值 然后再进行初始化
    所以在执行static int i=1;   的时候
    只是声明了一个变量i 它现在的值是JVM默认加给它的0。而后面的 = 1; 初始化赋值这个时候还没有没有执行
    在变成声明完成了以后,就会按顺序执行static修饰的东西了。
    所以先执行
    static{   
       i=9;   

    把i的值从0改成了9
    再接着 又到了static int i=1;
    这时才是初始化,把1的值赋给了i
    所以输出看到的是1再来看第二个
    public  class  test{           static{   
       i=9;   
    }                   
    static int i;  
    public  static void main(String  args[]){                   
                System.out.println("i="+i);       
                    }                   
    }   
    一开始和第一个是一样的。
    在执行了static后把i的值从0改成了9
    这时再次执行了static int i;   发现没有显式的给它提供初始值。所以不做任何操作
    所以i的值还是9第三个就不知道了。。 也跟着学习
    如果哪里说错了楼主不要怪我啊 我也是个菜鸟
      

  8.   

    在变成声明完成了以后,就会按顺序执行static修饰的东西了。 -->在变量声明全部完成了以后,就会按顺序执行static修饰的东西了。