{
          a=999;          //System.out.println(a);            //如果把这句的注释去掉,则报
}                                                             
是不是把它当成个函数默认执行了?

解决方案 »

  1.   

    我真不相信会没有人能打出这个问题。
    你的变量a是实例变量,而你再static block里给它赋值者当然不行了。
    can't access instance variable in static context
      

  2.   

    我并没有在静态初始块给a赋值啊{
              a=999;          //System.out.println(a);            //如果把这句的注释去掉,则报

    这是STATIC BLOCK吗??
      

  3.   

    以下是我的个人看法,仅供参考:
    1.
    //System.out.println(a);
    方法不能直接放在类里动作。要么放在函数(方法)里,要么放在static{}里。
    否则这个方法就没有调用者。
    放在static{}里是由装载函数(对象还未实例化呢)来调用。
    2.
    { a=999;}
     public int a;
    可以,而
     a=999;
     public int a;
    却不行。
    说明加了{}以后,编译器在扫描符号阶段会先扫到public int a;
    再扫到层次更深的{ a=999;}
    然后再初始化阶段:安先后顺序运行赋值。
    所以是先构建public int a;再执行{a=999;} 。
      

  4.   

    System.out.println(a);
    方法不能直接放在类里动作。要么放在函数(方法)里,要么放在static{}里。------------------------------------------------------然而这样却可以~
             public int a;       {
              a=999;          System.out.println(a);             }                                                            
      

  5.   

    哦,那我说错了。这样的问题都被你发现了,真是服了U  :)
    编译器不是我们做的。只能猜想:
    a=999;中的a不是reference。
    而System.out.println(a);是种reference。
    想想,他们之间也是有区别的,因后者要复制一份,而前者直接操作原来数据。
    至于编译为什么要这样做,不得而知。话说回来,这些其实都不重要。因为规则的制定者不是我们。而为什么要这
    样制定,其实也并非一定有100%的理由。只能说,这样可能比其它方案会好些。
    象下面这样的代码,即使能运行,也不是"好的"(大家就这么约定了)代码:
    { a=999;}
     public int a;类似的例子还有很多,比如return的问题(http://www.csdn.net/develop/Read_Article.asp?Id=25828).此例中还有更多情况没有点明,如if...else...if...else...if,多来几个层次的话,编译器就不管你了。
    //不能通过编译:
    class test {
      public  String test() {
        if(true){
          return "";
        }
      }
    }
    //能通过编译:
    class test {
      public  String test() {
        while(true){
          return "";
        }
      }
    }
      

  6.   

    public  String test() {
        while(true){
          return "";
        }
      }

        public String test() {
          boolean aa = true;
          while (aa) {
            return "";
          }
        }
    的区别是什么?
      

  7.   

    其实java的编译不是完全按顺序进行的,初始化块和类成员变量是一个顺序级的谁在前就先编译谁,担如果给一个初始化块里的变量赋值是他还没定义的话,他会寻找整个类的成员变量,如果找到就可以通过编译,担如果要在初始化块里使用这个变量的话,就一定要把这个变量的定义放在前面。
    这是java本身的编译方式,如果用jb的话就必须把成员变量全放到前面才可以。