黑马程序员技术交流社区

标题: 局部内部类访问局部变量的疑惑? [打印本页]

作者: 715596417    时间: 2016-3-25 23:41
标题: 局部内部类访问局部变量的疑惑?
  1. public class Demo {
  2.         public static void main(String[] args) {
  3.                 Outer o=new Outer();
  4.                 o.print();
  5.         }
  6. }
  7. class Outer{
  8.         public void print(){
  9.                 final int x=10;
  10.                 class Inner{
  11.                         public void show(){
  12.                                 System.out.println(x);
  13.                         }       
  14.                 }
  15.                 Inner i=new Inner();
  16.                 i.show();
  17.                
  18.         }
  19. }
复制代码

局部变量会随着方法的调用完毕而消失,难道调用print()方法的时候这个变量已经消失了吗?我有点不明白了。总觉得在这个方法内没有消失呀。
作者: 715596417    时间: 2016-3-31 15:51
是变量作用域的问题,因为匿名内部类是一个方法的内部的,如果它要访问这个方法的参数或者方法中定义的变量,则这些参数和变量必须被修饰为 final。因为虽然匿名内部类在方法的内部,但实际编译的时候,内部类编译成Outer.Inner,这说明内部类所处的位置和外部类中的方法处在同一 个等级上,外部类中的方法中的变量或参数只是方法的局部变量,这些变量或参数的作用域只在这个方法内部有效。因为编译的时候内部类和方法在同一级别上,所以方法中的变量或参数只有为final,内部类才可以引用。
作者: 妄想年少轻狂    时间: 2016-3-31 21:55
x被final修饰后就是常量,存储在常量池中,不会消失
作者: user_lqb    时间: 2016-3-31 22:07
学习一下
作者: chenzhi1217    时间: 2016-3-31 23:42
哈哈。我来支持下




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2