class Test{
  interface A{
     int getInt();
     }
    A make(final int i){   //为什么这里的final不能去掉??
class InnerTest implements A{
public int getInt(){
return i;
}
}
return new InnerTest();
}
}如果把final去掉的话,就会出错,提示说
“不能引用另一方法中定义的内部类中非终态变量 i”
为什么参数一定要是final类型的呢?

解决方案 »

  1.   

    定义在方法里面的内部类只能访问外部类的final属性。
      

  2.   

    不要final的话,i作用范围就只能在方法内容了,不能用在内部类中,这关于内部类的生存周期问题
      

  3.   


    class Test {
    interface A {
    int getInt();
    } A make(final int i) { // 要想在局部内部类中被访问就必须声明为final
    class InnerTest implements A {  //局部内部类能访问外部类成员和本方法的final局部变量
    public int getInt() {
    return i;
    }
    }
    return new InnerTest();
    }
    }
      

  4.   

    楼上的说错了,i不是外部类的属性,而是外部变量!之所以要用final是因为内部类定义在函数内部的。而函数内部的成员是有生命周期的!为了保持内部类使用的变量是最新或一致则需要将其声明为final类型。
      

  5.   

    访问外部类的成员变量是不需要声明的
    class f {
        private int j=1;
    interface A {
            int getInt();
        }    A make(final int i) { 
            class InnerTest implements A { 
                public int getInt() {
                    System.out.println(j);
                 return i;
                }
            }
            return new InnerTest();
        }
        public static void main(String[] args){
         f ff=new f();
         A a=ff.make(2);
         a.getInt();
        }
    }