黑马程序员技术交流社区

标题: 【求助】今天看到高新最后1课,也来了个内部类,晕到了 [打印本页]

作者: 林豪    时间: 2012-5-28 22:41
标题: 【求助】今天看到高新最后1课,也来了个内部类,晕到了
  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才可以?
作者: 黑马-唐磊    时间: 2012-5-28 22:48
本帖最后由 黑马-唐磊 于 2012-5-28 22:51 编辑

内部类不能访问方法局部变量,想访问必须final,因为内部内是一个类,是在堆内存里,创建对象也在堆内存,在内部内访问方法的局部变量就是栈内存的局部变量,用堆内存的数据去访问栈内存的数据是访问不到的,因为堆内存比栈内生命周期长,所以加上final则变量就变成常量,常量是放在常量池也在堆内存,所以生命周期一样.
作者: 秦冲    时间: 2012-5-28 22:48
本帖最后由 秦冲 于 2012-5-28 22:50 编辑

是不是 target 在main方法中,是局部变量,不是类的成员变量。接下来就不用我说了~
作者: 小小企鹅    时间: 2012-5-28 22:49
内部类分了好几种,在一个方法中定义的类,通常是匿名类。
在这种匿名内部类中,如果要访问那个包含着该类的方法中的某个局部变量,那个局部变量就必须是用 final 修饰的。
作者: 林豪    时间: 2012-5-28 23:11
了解了,我学太久了了,结果都懵了..




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