public Object makeInner(final int finalLocalVar)
你看看你的这一行,能不提示要你定义成final,final就是不能更改的。不知道作用写这做什么,是抄别人的代码吗?

解决方案 »

  1.   

    这是书上的一个代码,我知道final就是不能更改的,但是,在函数public String toString()中难道不能用LocalVar=6这个变量吗,finalLocalVar不是只是一个形式参数啊?这个参数在这个函数中怎么用的啊,难道是传给了内部类的那句return中去了吗?
    sorry,我真的不太懂!
      

  2.   

    因为你是在内部类中访问外部类函数中的局部变量,所以必须将该变量定义为final(否则你想想,当你不在makeInner函数中调用Inner.toString时,LocalVar没有定义,编译器应该用什么值呢?)
      

  3.   

    请问楼上的兄弟,“否则你想想,当你‘不’在makeInner函数中调用Inner.toString时,LocalVar没有定义,编译器应该用什么值呢”  -----------你这句话中的‘不’字是不是多写了,还是我没有理解你的意思啊
    还有,是不是在内部类中访问外部类函数中的局部变量时,一定要把该变量定义为 final
      

  4.   

    定义内部类的时候,如果要用到外面的对象,那就必须把外部对象定义成 final的。
    方法makeInner的返回值是Object类的,因此函数方法必须返回一个类型。如果没有return new Inner();那就没有返回类型,Object就得换为Void,但那样你就不能在主函数里这样定义了Object obj=outer.makeInner(56);因为outer.makeInner(56);没有返回值。
      

  5.   

    如果外部对象是外部类的成员变量的话也要用final定义吗,
      

  6.   

    关于内部类的使用建议去看一下Thinking in Java之类的书籍的相关章节。下面我主要讲讲对内部类中使用到的变量,为何需要final的一些个人理解之所以要使用final,其原因是interface A {void a();}public class Outer {  public A returnAMethod() {
        final int x = 10;  //<----1    return new A() {
          public void a() {
            x++;         
          }
        };
      }   //<----2
    }class Test {
      void test() {
        Outer out = new Outer();
        A outA = out.returnAMethod();  //<---3 = (1~2)
        outA.a();  //4
      }
    }在4标记出来的地方,returnAMehtod中的x变量仍然需要被使用到,而如果不加final关键字,那么它作为一个普通的局部变量,其生命周期只在1和2之间,也就是Test中的3。因此,在内部类中使用到的局部变量以及方法的参数都应被声明为final。而作为外部类的成员变量而言,其生命周期是延续的,并不会因为某个方法的调用结束而终结,因此不必声明为final