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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© lonely_zb 中级黑马   /  2013-9-11 15:33  /  2016 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

ExecutorService  pool = Executors.newSingleThreadExecutor();
  
  pool.execute(new Runnable() {
   
   @Override
   public void run() {
    for (int i = 0; i < 1000; i++) {
     try {
      Thread.sleep((new Random().nextInt(10)+1)*1000);
     } catch (InterruptedException e) {
      e.printStackTrace();
     }
     vecirles.add(Road.this.name+"_"+i);
    }
   }
  });

vecirles.add(Road.this.name+"_"+i)----这样的访问方式是可以的,这个表示的是什么意思呢? 不是把name编程final了就可以了吗...?

评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1

查看全部评分

5 个回复

倒序浏览
final修饰的话。。name的值就确定了。。但是这里面name的值是可变的。。所以不能用final修饰
回复 使用道具 举报
本帖最后由 静以修身 于 2013-9-11 16:15 编辑

内部类定义在外部类上的位置分为两种情况,一是内部类可以定义在外部类中的成员位置上,二是定义在外部类中的局部位置上。如果是定义在外部类中的成员位置上,内部中都持有一个外部类的引用外部类名.this ,内部类可以直接访问外部类中的成员,可以隐藏外部类名.this 。而如果义在外部类中的局部位置上,则必须加上外部类名.this 。你这道题是第二种情况,所以调用外部成员变量时必须显示加上外部类名.this ,即外部类名.this .成员变量名。而你问题:不是把name编程final了就可以了吗...?不行的,因为它不是局部变量,因为内部类被定义在局部位置上,只能访问局部中被final修饰的局部变量,被final修饰的必须是局部变量而不是成员变量,所以不能在成员变量上加上final。如果你要访问局部变量的话就必须在局部变量上加上final。对了,类名.this 代表外部类对象的引用。

评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1

查看全部评分

回复 使用道具 举报
name是成员变量,内部类可以直接引用。但是现在方法中也有个name。就是构造函数的name。所以为了区别用的是哪一个name,就需要用全名的引用。就是类名.this.变量名。
回复 使用道具 举报
final不是只能被赋予一次,以后不能在改变了
回复 使用道具 举报
被final修饰后就成常量了,不能更改常量的值
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马