public class InitialOrderTest { 
   static {   
        c = 'F';               //正确
        System.out.println(c); //错误???为什么
    }   
public static char c = 'E';
  
    public static void main(String[] args) {  
       new InitialOrderTest();      }  
}  为什么c = 'F';没有错,而System.out.println(c);有错误呢?c = 'F';在System.out.println(c);前面啊?不理解

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【xiaomage20042001】截止到2008-07-25 00:55:26的历史汇总数据(不包括此帖):
    发帖的总数量:3                        发帖的总分数:60                       每贴平均分数:20                       
    回帖的总数量:2                        得分贴总数量:0                        回帖的得分率:0%                       
    结贴的总数量:2                        结贴的总分数:40                       
    无满意结贴数:0                        无满意结贴分:0                        
    未结的帖子数:1                        未结的总分数:20                       
    结贴的百分比:66.67 %               结分的百分比:66.67 %                  
    无满意结贴率:0.00  %               无满意结分率:0.00  %                  
    楼主加油
      

  2.   

    这样写得到的结果是 E
    public class TT
    {  static 
      { 
          c = 'F';              //正确
          //System.out.println(c); //错误???为什么
      } 
      public static char c = 'E';
        public static void main(String[] args) { 
          TT t=new TT(); 
      System.out.println(t.c);    } 
    }  这样写得到的结果是 Fpublic class TT
    {  public static char c = 'E';
      static 
      { 
          c = 'F';              //正确
          System.out.println(c); //错误???为什么
      } 
     
        public static void main(String[] args) { 
          TT t=new TT(); 
    //  System.out.println(t.c);    } 

    我的java基础也不好 ,我个人的理解就是对于静态域和静态快,好像编译器是按照语句的顺序编译的 ,如果理解不正确的话 我也一起等待高人的解释
      

  3.   

    楼主的代码在Eclipse里看了下
    c = 'F'  没有报错
    但是System.out.println(c)报错了
    错误是不能引用一个数据域在它被定义之前
    这个应该是语法检查工具的问题  在引用的时候才进行检查吧至于执行顺序  是这样的
    静态初始化块   是在类装载进虚拟机的时候执行的  
    然后初始化块是在创建类的实例时   构造方法执行之前执行的
      

  4.   

    初始化顺序是根据static 代码顺序而定的还没声明char c 就要打印 肯定错啊
      

  5.   

    我只知道改成这样就对了,但不知道为什么。这是老早以前我的问题,楼主帮我问了,呵呵。
    static {
    c = 'F'; 
    System.out.println(Test.c); //Test.c
    }
    public static char c = 'E'; public static void main(String[] args) {
    System.out.println(Test.c); }
      

  6.   

    那为什么 c = 'F'就不报错呢?在这之前c还没有声明呢.
      

  7.   

    一下。呵呵呵。如果是直接写system.out.println(c),估计是由于有两处初始化的地方,你在输出的时候还没有初始化完全引起的吧。而使用Test.c。。
      

  8.   

    我看了一下,楼主的方法会报 Cannot reference a field before it is defined 的错误,而初始化则没有这个问题。看来静态初始化是可以不按照顺序来申明变量的。而使用确认依靠申明顺序。
      

  9.   


    static {  
            c = 'F';              //正确 
           //System.out.println(c); //错误???为什么 
        }  
    public static char c = 'E'; 这样在main中打印会打印出E来,静态块初始化可以在申明变量之前进行初始化,但是申明变量时同时再赋值会覆盖前面的初始化。
      

  10.   

    还是不理解,为什么可以c = 'F';而不可以System.out.println(c);可以给c赋值,而不可以输出呢
      

  11.   

    这个问题好奇怪!!!
    public class InitialOrderTest { 

      static {  
            char c = 'F';              //正确 
            //System.out.println(c); //错误???为什么 
         }  
    //public static char c = 'E'; 
      
        public static void main(String[] args) {  
          new InitialOrderTest();  
    System.out.println(c);//这样也会报错!不知道为什么??
        }  
    }  
    这样就不会报错public class InitialOrderTest { 

      //static {  
          static  char c = 'F';              //正确 
            //System.out.println(c); //错误???为什么 
        // }  
    //public static char c = 'E'; 
      
        public static void main(String[] args) {  
          new InitialOrderTest();  
    System.out.println(c);
        }  
    }  
      

  12.   


    package com.jsp.test;public class InitialOrderTest { /**
     * @param args
     */
      static {  
           char c = 'F';             
            System.out.println(c); //错误???为什么 
        }  
    public static char c = 'E'; 
      
        public static void main(String[] args) {  
          new InitialOrderTest();       } }在定义字段之前不能引用该字段
      

  13.   


    public class InitialOrderTest { /**
     * @param args
     */
      static {  
           char c = 'F';               
            System.out.println(c); //错误???为什么 
        }  
    public static char c = 'E'; 
      
        public static void main(String[] args) {  
          new InitialOrderTest(); 
          System.out.println(c);     } }
    这样的话输出是
    F
    E你在引用(System.out.println(c);)之前需要定义。static的顺序是自上而下。
      

  14.   

    静态变量在内存中的存储和普通变量是区分开的。调用它们的时候得通过类名去引用。把println放在STATIC块里只不过是让这个打印语句优先执行了,但它并调不到静态变量。在当前类的静态方法中是可以直接调用的,相当于用类名去引用了,所以在MAIN方法中不会出错。个人见解,仅供参考
      

  15.   


    public class StaticTest {
    static {
        c = 'F';
    System.out.println(StaticTest.c); //报错
    }
    public static char a = 'E';//没有声明为c public static void main(String[] args) {
    System.out.println(new StaticTest().a);
    }
    }难道编译器会综合分析
      

  16.   

    public static char c = 'E';
    static { 
            c = 'F';              //正确
            System.out.println(c); //错误???为什么
        } 
    顺序
      

  17.   


    public class InitialOrderTest 

    public static char c = 'E';
        static 
    {  
            c = 'F';              
            System.out.println(c);   
      }  
        public static void main(String[] args) {  
          new InitialOrderTest();      }  
    }  把C的声明放到前面就OK 了
      

  18.   

    我的个人理解:
    首先,9楼的说过了静态块初始化(形如static{}形式)可以在申明变量之前进行初始化,这也就是c='F';这句话为什么不报错的原因,但执行System.out.println(c); 的时候由于字段c并没有定义所以报错。
    其实这个问题很好理解
    public class Problem1{ 
      static {  
            char c = 'F';              //如果char不写,由于static块初始化不会报错;
            //下面public static char c = 'E';这句话申明变量时同时再赋值会覆盖前面的初始化
            //如果写成static{c='F';}public static char c;则会输出F。这就证明了静态块初始化可以在申明变量之前进行初始化这句话的意思
            System.out.println(c); //这里输出F,是这个块里的c的值。 
        } 
    public static char c = 'E'; //如果去除这句话当然会报错了,注意上面char c的作用域;

        public static void main(String[] args) {  
          new Problem1(); 
          System.out.println(c);//如果没有这句话,输出c;加上这句话输出F,E可见先执行static块里的内容
        }  
    }  
    所以说此问题是static块初始化和作用域的问题,应该了解了把。