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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 昝文萌 于 2013-9-22 07:44 编辑

在Road类里面有一段开启线程增加车辆的代码
  1. public class Road {
  2.         private List<String> vechicles = new ArrayList<String>();
  3.         
  4.         private String name =null;
  5.         public Road(String name){
  6.                 this.name = name;
  7.                
  8.                 //模拟车辆不断随机上路的过程               
  9.                 ExecutorService pool = Executors.newSingleThreadExecutor();
  10.                 pool.execute(new Runnable(){
  11.                         public void run(){
  12.                                 for(int i=1;i<1000;i++){
  13.                                         try {
  14.                                                 Thread.sleep((new Random().nextInt(10) + 1) * 1000);
  15.                                         } catch (InterruptedException e) {
  16.                                                 e.printStackTrace();
  17.                                         }
  18.                                         vechicles.add(Road.this.name + "_" + i);
  19.                                 }                                
复制代码
vechicles.add(Road.this.name + "_" + i);//这里为什麽要用Road.this.name ,内部类不是直接可以访问成员变量name吗?为什麽还要加Road.this
直接写成vechicles.add(name + "_" + i)不行吗?


评分

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

查看全部评分

4 个回复

倒序浏览
内部类不可以直接访问外部类的成员变量,如果要访问需要外部类名.this.成员变量名
回复 使用道具 举报
因为这个内部类是定义在局部位置上的。
局部位置上的内部类,想要获取外部类中的成员变量,需要用outer.this.xxx这个格式获取。
另外补充下,局部位置上的内部类要获取局部变量,那这个局部变量要被final修饰。
具体你可以再看下毕老师视频里的内部类。
回复 使用道具 举报
因为这个匿名内部类是定义在方法里,也称局部类,此时内部类只能访问被final修饰的局部变量,而这里的name不可以被final修饰,所以用加外部类.this的方式,表示它访问的是外部类的变量
回复 使用道具 举报
本帖最后由 早知道 于 2013-9-21 22:31 编辑

内部类是可以直接访问外部类的成员变量的。但内部类所以能访问外部类成员变量就是因为内部类含外部的引用,其全名就是Road.this.name,平时可以省略。但如果遇到内部类成员变量名称和这个name一样,或者调用方法里面局部变量名称和name一样,就一定要使用Road.this.name。本例中,因为出现了局部变量,所以如果要访问外部类的成员变量,就要使用全称。如果你是要使用该方法的局部变量的话,那方法中的参数 String name 就要改成final String name.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马