public class InOut{
   public void amethod() {
      int i = 10; 
      class Bicycle{
       Bicycle() {
          ……  // 请各位指点:在这里该如何将非final型变量i输出???
          }
      }
      new Bicycle();
   }   public static void main(String[] args) {
       InOut inout= new InOut();
       inout.amethod();
   }
}

解决方案 »

  1.   

    Bicycle(){ System.out.println(i);} 
      

  2.   

       
         只能调用final变量
      

  3.   

        
         原因:方法的局部变量位于栈上,生命周期仅限于方法内(final变量除外),而方法内创建的内部类对象是存放在堆上的,即使方法完成,对象还是可以存活的.由此可知,当局部变量生命周期结束时,对象就不能调用它了,所以方法中内部类无法使用方法中的局部变量(final变量除外).
      

  4.   

    在方法中的类部内中只能调用方法中的fianl修饰的变量,其实是JAVA中的4大骗局之一,当调用局部的final变量时,它其实不是调用这个变量本身,而是它生成的一个副本而已,如声明final int i = 10,在内部类调用的不是i本身,而是它的一个COPY而已,只不过在java的编译器中中它给你做了实现,为了不让人混淆,而且让人看起来用的就是i本身,(sun公司的程序员原来是个骗子,嘿嘿!)所以要求i必须是final的。
    如果要调用不是FINAL的变量就必须写一个实现Copy i的代码:package alltest;interface Bicy{

    }
    public class InnerTest { public Bicy amethod()   { 
         int i = 10;   
         class Bicycle implements Bicy{
            int i;
            public Bicycle(int i) { 
                 this.i = i;
                 System.out.println("i = " + i);
            }
         }
         return new Bicycle(i);
     }  public static void main(String[] args)   { 
         InnerTest inout= new InnerTest(); 
         Bicy b = inout.amethod(); 
     } 
    }
    OutPut:
    i = 10
    也就是说如果你声明为final的局部变量的i,当你在内部类要用的时候,编译器就会自动加上例如上面的代码,因为JVM不懂什么方法内部类的机制的,方法内部类它只是当它是一般的类来处理的。
    再次象sun公司的程序员竖起中指,他妈的骗子。
      

  5.   

    原来还有这回事。
    3楼所说的final型变量是在堆上吗?