请问:如果定义一个匿名内部类,它要访问在它外部定义的一个变量,这个变量必须使用final关键字来修饰,这是为什么呢?请深层次的讲解一下。谢谢!

解决方案 »

  1.   

    因该没有此规定! 给你个例子 自己跑以下
    package testpkg;import java.awt.Button;
    import java.awt.Frame;
    import java.awt.Panel;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;public class Test extends Frame { private static final long serialVersionUID = 1L; public int i = 1; Panel p1 = new Panel(); Button bt1 = new Button(); public void init() { this.setSize(600, 400);
    bt1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { int j = Test.this.i;
    System.out.print(j); }
    });
    p1.add(bt1);
    this.add(p1);
    } public static void main(String args[]) {
    Test t = new Test();
    t.init();
    t.setVisible(true);
    }}
      

  2.   

    上面这个例子中  外部类中定义了一个 int 类型的变量i
    他的匿名内部类中 可以访问到i 并赋值给了 j 给你点提示 内部类就类似于外部类的 方法或属性
      

  3.   

    准确的问题应该是这样的:
    如果定义一个匿名内部类,它要访问它所在方法定义的一个变量,这个变量必须使用final关键字来修饰,这是为什么呢?
    class MyClass{}
    public class AnonInnerClass {
      public MyClass get(final int x) {
        return new MyClass() {
          int xx = x;
        };
      }
    }如果x不是final修饰的,编译不能通过。
      

  4.   

    “方法定义的一个变量”(其实你的例子中是“形参”,但一样啦)是所谓的“局部变量”,当这个方法结束的时候,这个变量也就不存在了。而匿名类只是在这个方法的语句体中定义,并不一定在当时执行,虽然从语法上它可以访问到外面定义的那个变量,但如果真执行到那句的时候,那个变量不存在了,怎么办呢?所以,办法就是,在匿名类的创建之初,就让那个被访问的变量“凝固”下来,这就是 final 的作用啦,相当于把那个“变量”理解为“常量”。如果访问的是外部类的“实例变量”,当然也就没有这个限制了。
      

  5.   

    maquan,还是不理解你说的这些。
    用final定义的局部变量就能凝固下来,就能让匿名类随时访问?
      

  6.   

    用 final 当然不能让那个局部变量“永远存在”,但它能告诉匿名类“这个值是不会变的”,然后匿名类就可以把这个局部变量当时的值抄过来,以后当作“常量”使用。
      

  7.   

    所谓“Inner Class”,从语法上讲,它一定是“非静态”的,一个 Inner Class Instance 一定会依附于一个 Outer Class Instance,那么,也就是说,在整个 Inner Class Instance 的生命期中,Outer Class Instance 都一定是存在的,那么自然要访问的那个 Instance Variable 也是存在的,所以就不必要求把它限制为 final 的了。