class ForwardReference{
     {
       //  System.out.println(age);//compile error
         age=22;      
    }
    int age=21;
}
class ForwardReference02{
    //int first=second; //Can't make forward refencece to second in class
        int accessTooSoon(){
return second;
}
    int first=accessTooSoon();
    int second=1;}先来分析ForwardReference: ForwardReference是这样初始化的 首先声明变量int age; 并赋于缺省值(0)此时age=0;
 然后执行实例块
{
  System.out.println(age); //1处
  age=22;
}
按我自己的想法是  System.out.println(age);  应该输出0 然后将age赋值为22
最后又将age赋值为21  但是结果1处却不能compile, cause by:forward refencece 
再来分析ForwardReference02:ForwardReference02是这样初始化的 首先按照代码先后顺序
声明变量int first , int second; 并赋于缺省值(0)此时first=0,second=0;
然后执行赋值操作
int first=accessTooSoon(); //调用accessTooSoon()返回second值0 此时first=0
int second=1; //将second赋值为1通过对比  
我的疑惑就是在1处?为什么会出现 forward refencece  error(难道问题出现在 实例块 实例方法 这两者之间)
我分析错误了?谁能替我解忧?

解决方案 »

  1.   

    有两种改法:class ForwardReference{
     
     {
     System.out.println(age); 
     age=22; 
     }
     static int age=21;
    }
    class ForwardReference{
     int age=21;  {
     System.out.println(age); 
     age=22; 
     }  
    }
      

  2.   

    class ForwardReference{
         {
           //  System.out.println(age);//compile error
             age=22;      
        }
        int age=21;
    }
    class ForwardReference02{
        //int first=second; //Can't make forward refencece to second in class
            int accessTooSoon(){
            return second;
        }
        int first=accessTooSoon();
        int second=1;}你怎么定义的时候对类变量的声明都放在方法体后面~这样程序运行一定会处错误的~
    class ForwardReference{
       int age=21;
         {
             age=22;      
         }
    }
    class ForwardReference02{
       int second=1;
       int accessTooSoon()
        {
            return second;
        }
        int first=accessTooSoon();
        Sysstem.out.println(first);
    }
      

  3.   

    对于ForwardReference类,你的程序运行的时候先调用的是age=22;而在此之前你并没有声明它~而是在后面声明的~这样编译器运行到age=22;时就会出错了~就不往下执行其他的语句~
    而对于ForwardReference02类,你还是犯了和上面一样的错误~调用accessTooSoon()这本没有错~不过你在方法中返回second~这个是在最后面定义的~编译器不会到最后面去找这个~编译器是按顺序执行的~所以也会出现异常~
      

  4.   

    对于第二的错误   我觉得你有点绕进去了  当你的代码第一句是int first=second;的时候,我问你second是什么?你知道不?不知道!编译器知道不?不知道!因为你把他放在了这句话的后面去定义了  所以肯定要把second定义在这句话前面!
      

  5.   

    class ForwardReference{
         {
           //  System.out.println(age);//compile error
             age=22;      
        }
        int age=21;
    }
    class ForwardReference02{
        //int first=second; //Can't make forward refencece to second in class
        int accessTooSoon(){
            return second;
        }
        int first=accessTooSoon();
        int second=1;  public static void main(String[] args) {
     System.out.println( new  BeforeQuote().first );//output 0
     }
    }
    声明:
    此代码并无错误!!!!  
      

  6.   

    class ForwardReference02{
    static int second = 1;
        static int first = second; 
        
        static int accessTooSoon(){
            return second;
        }
        
        public static void main(String args[]){
         first = accessTooSoon();
        }}
    我觉得你不仅要看看变量定义的顺序  还要看看静态和非静态的知识...
      

  7.   

    我完全理解你的说法 只不过对于
    1.
         {
             age=22;      
        }
        int age=21;
    可以编译通过证明了 在实例块中{} 是知道age的存在的因为初始化的时候就是new 的时候 声明并且初始化了age=0
    2.
    {
      System.out.println(age);
    }
    int age=21;
    按照1的推论 2是不该有farward reference error的 结果却相反我想我更定是理解错误了 就是不知道自己哪里理解的不对
      

  8.   

    java语言的规定而已。
    参考java 语言规范,
    http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.3.2
    java编译器对初始化和其他语句的语法检查是不同的。具体看上面网址的说明。
    如果有兴趣看javac的源代码:
    参考
    langtools-4af43632966c\src\share\classes\com\sun\tools\javac\comp\Attr.java
    检查是在checkInit()中进行的。
    代码下载地址:
    http://hg.openjdk.java.net/jdk7/2d/langtools/archive/tip.zip
      

  9.   

    建议你去看看<<Thanking java>> 上的关于“对象初始化”几节的内容,你就会明白的。
      

  10.   

    class ForwardReference{
         {
            System.out.println(this.age);
             age=22;      
        }
        int age=21;
    }发现加了个this也可以.........可以解释下为什么吗
      

  11.   

    樓主應該聽聽ZangXT兄的意見,呵呵