A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  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()方法的时候这个变量已经消失了吗?我有点不明白了。总觉得在这个方法内没有消失呀。

4 个回复

倒序浏览
是变量作用域的问题,因为匿名内部类是一个方法的内部的,如果它要访问这个方法的参数或者方法中定义的变量,则这些参数和变量必须被修饰为 final。因为虽然匿名内部类在方法的内部,但实际编译的时候,内部类编译成Outer.Inner,这说明内部类所处的位置和外部类中的方法处在同一 个等级上,外部类中的方法中的变量或参数只是方法的局部变量,这些变量或参数的作用域只在这个方法内部有效。因为编译的时候内部类和方法在同一级别上,所以方法中的变量或参数只有为final,内部类才可以引用。
回复 使用道具 举报
x被final修饰后就是常量,存储在常量池中,不会消失
回复 使用道具 举报
user_lqb 来自手机 中级黑马 2016-3-31 22:07:04
板凳
学习一下
回复 使用道具 举报
哈哈。我来支持下
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马