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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. final ArrayList target = new ArrayList();
  2.                 Collection proxy3 = (Collection)Proxy.newProxyInstance(Collection.class.getClassLoader(),
  3.                                 new Class[]{Collection.class},
  4.                                 new InvocationHandler(){
  5.                                
  6.                                 public Object invoke(Object proxy, Method method, Object[] args)
  7.                                                 throws Throwable {
  8.                                        
  9.                                         long beginTime = System.currentTimeMillis();
  10.                                         Object retVal = method.invoke(target, args);
  11.                                         long endTime = System.currentTimeMillis();
  12.                                         System.out.println(method.getName() + "running time of" + (beginTime-endTime));
  13.                                         return retVal;
  14.                                         }
复制代码
话说内部类不是可以直接访问外部类的变量吗?


为什么还要加final才可以?

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

4 个回复

倒序浏览
本帖最后由 黑马-唐磊 于 2012-5-28 22:51 编辑

内部类不能访问方法局部变量,想访问必须final,因为内部内是一个类,是在堆内存里,创建对象也在堆内存,在内部内访问方法的局部变量就是栈内存的局部变量,用堆内存的数据去访问栈内存的数据是访问不到的,因为堆内存比栈内生命周期长,所以加上final则变量就变成常量,常量是放在常量池也在堆内存,所以生命周期一样.

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 秦冲 于 2012-5-28 22:50 编辑

是不是 target 在main方法中,是局部变量,不是类的成员变量。接下来就不用我说了~

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

回复 使用道具 举报
内部类分了好几种,在一个方法中定义的类,通常是匿名类。
在这种匿名内部类中,如果要访问那个包含着该类的方法中的某个局部变量,那个局部变量就必须是用 final 修饰的。
回复 使用道具 举报
了解了,我学太久了了,结果都懵了..
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马