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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李节起 中级黑马   /  2012-4-7 23:35  /  1553 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

毕老师课件中讲到:“不可以访问它所在的局部中的变量。只能访问被final修饰的局部变量。”

为什么匿名内部类在使用一个外部定义的对象时要求这个参数引用是final的?

2 个回复

正序浏览
楼主工作顺利,继往开来!
回复 使用道具 举报
本帖最后由 秦岩 于 2012-4-7 23:48 编辑
  1. 原因如下:

  2. abstract class ABSClass{
  3. public abstract void print();
  4. }

  5. public class Test2{
  6. public static void test(final String s){//一旦参数在匿名类内部使用,则必须是final
  7. ABSClass c=new ABSClass(){
  8. public void print(){
  9. System.out.println(s);
  10. }
  11. };
  12. c.print();
  13. }
  14. public static void main(String[] args){
  15. test("Hello World!");
  16. }
  17. }
复制代码
1. 匿名内部类可以使用外部类的变量(局部或成员变来那个)
2. 匿名内部类中不同的方法可以共享这些变量
根据这两点信息我们就可以分析,可能这些变量会在匿名内部类的字段中保存着,并且在构造的时候将他们的值/引用传入内部类。这样就可以保证同时实现上述两点了。
事实上,Java就是这样设计的,并且所谓匿名类,其实并不是匿名的,只是编译器帮我们命名了而已
Java对匿名内部类的实现是通过编译器来支持的,即通过编译器帮我们产生一个匿名类的类名,将所有在匿名类中用到的局部变量和参数做为内部类的final字段,同是内部类还会引用外部类的实例
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马