黑马程序员技术交流社区

标题: 内部类访问外部成员变量 [打印本页]

作者: lonely_zb    时间: 2013-9-11 15:33
标题: 内部类访问外部成员变量
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了就可以了吗...?


作者: .....淡定    时间: 2013-9-11 15:58
final修饰的话。。name的值就确定了。。但是这里面name的值是可变的。。所以不能用final修饰
作者: 静以修身    时间: 2013-9-11 16:11
本帖最后由 静以修身 于 2013-9-11 16:15 编辑

内部类定义在外部类上的位置分为两种情况,一是内部类可以定义在外部类中的成员位置上,二是定义在外部类中的局部位置上。如果是定义在外部类中的成员位置上,内部中都持有一个外部类的引用外部类名.this ,内部类可以直接访问外部类中的成员,可以隐藏外部类名.this 。而如果义在外部类中的局部位置上,则必须加上外部类名.this 。你这道题是第二种情况,所以调用外部成员变量时必须显示加上外部类名.this ,即外部类名.this .成员变量名。而你问题:不是把name编程final了就可以了吗...?不行的,因为它不是局部变量,因为内部类被定义在局部位置上,只能访问局部中被final修饰的局部变量,被final修饰的必须是局部变量而不是成员变量,所以不能在成员变量上加上final。如果你要访问局部变量的话就必须在局部变量上加上final。对了,类名.this 代表外部类对象的引用。
作者: code_geass    时间: 2013-9-11 18:32
name是成员变量,内部类可以直接引用。但是现在方法中也有个name。就是构造函数的name。所以为了区别用的是哪一个name,就需要用全名的引用。就是类名.this.变量名。
作者: 风叶漂    时间: 2013-9-11 20:31
final不是只能被赋予一次,以后不能在改变了
作者: 楞个里格朗    时间: 2013-9-12 00:05
被final修饰后就成常量了,不能更改常量的值




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