class TestStatic
{
void fn()
{
int a;           // 为什么必须定义为 final ? 若是从变量生存期考虑,那为什么不能用 static ?用 static 会报不同的错,为什么?
class TestInner
{
void print()
{
System.out.println(a);
}
}
}
}

解决方案 »

  1.   

    晕,static关键字是不能修饰方法的参数的说
    为什么要final ,应该就是避免内部类的方法修改参数拉
      

  2.   

    1在方法体内不能存:   private   ,protected,   public   ,   static   
    也就是说void fn()方法中不能定义static.定义访问修饰符都是为了控制访问,在方法体内定义这些修饰符没有必要.
    2final不是必须定义,看情况.final定义的变量不可更改,因情况而用.
      

  3.   

    我觉得应该是避免被修改~同意li_d_s
      

  4.   

    只有局部内部类才能访问外部包涵他的外围类的变量
    而且这个变量必须定义成 final
    这是JAVA中要求的...
      

  5.   

    wkdlut()  我问你 避免被修改和final定义的变量不可更改 有歧义吗.
      

  6.   

    如果定义一个局部内部类,并且局部内部类使用了一个在其外部定义的对象,为什么编译器会要求其参数引用是final呢?
    注意:局部内部类,包括匿名内部类。原因如下:abstract class ABSClass{
    public abstract void print();
    }public class Test2{
    public static void test(final String s){//一旦参数在匿名类内部使用,则必须是final
    ABSClass c=new ABSClass(){
    public void print(){
    System.out.println(s);
    }
    };
    c.print();
    }
    public static void main(String[] args){
    test("Hello World!");
    }
    }JVM中每个进程都会有多个根,每个static变量,方法参数,局部变量,当然这都是指引用类型.基础类型是不能作为根的,根其实就是一个存储地址.垃圾回收器在工作时先从根开始遍历它引用的对象并标记它们,如此递归到最末梢,所有根都遍历后,没有被标记到的对象说明没有被引用,那么就是可以被回收的对象(有些对象有finalized方法,虽然没有引用,但JVM中有一个专门的队列引用它们直到finalized方法被执行后才从该队列中移除成为真正没有引用的对象,可以回收,这个与本主题讨论的无关,包括代的划分等以后再说明).这看起来很好.
     
    但是在内部类的回调方法中,s既不可能是静态变量,也不是方法中的临时变量,也不是方法参数,它不可能作为根,在内部类中也没有变量引用它,它的根在内部类外部的那个方法中,如果这时外面变量s重指向其它对象,则回调方法中的这个对象s就失去了引用,可能被回收,而由于内部类回调方法大多数在其它线程中执行,可能还要在回收后还会继续访问它.这将是什么结果?
     
    而使用final修饰符不仅会保持对象的引用不会改变,而且编译器还会持续维护这个对象在回调方法中的生命周期.所以这才是final变量和final参数的根本意义.