黑马程序员技术交流社区

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

作者: 黑马高明辉    时间: 2012-7-20 16:14
标题: 匿名内部类访问外部类变量
public class Road {
        List<String> vehicle = new ArrayList<String>();
        private String name;
        public Road(String name){
                this.name = name;
                //设计定时器(调度池)对车辆放行,每隔一秒发生一次。
                ScheduledExecutorService ses = Executors.newScheduledThreadPool(1);
                ses.scheduleAtFixedRate(new Runnable(){
                        public void run() {
                                if(vehicle.size()>0){
                                        boolean lighted = TrafficLamp.valueOf(Road.this.name).isLight();
                                        if(lighted){
                                                System.out.println(vehicle.remove(0)+"已经通过路口");
                                        }
                                }
                               
                        }
                },
                100,
                10,
                TimeUnit.MILLISECONDS);
               
               
        }
}
Road.this.name,此处按照eclipse的提示,可以将String name加上final,此处为什么不能加fianl而要用Road.this.name这个来引用?好像改了之后运行结果也没什么不一样。
上面写法和这样写public Road(final String name){....name....}有什么区别?
作者: 王宝康    时间: 2012-7-20 17:03
      内部类是外部类的一个成员,就像外部类的成员方法一样,所以内部类有权限访问外部类的所有成员,包括private类型的,至于为什么外部类的局部变量要加final修饰,是因为内部类和外部类的生命周期的原因,具体解释你可以看下我博客里转载的一篇关于内部类访问外部类的局部变量的文章,我感觉讲得听明白的,http://blog.csdn.net/wangbaokangfei/article/details/7768201
作者: 张莹莹    时间: 2012-7-20 18:11
boolean lighted = TrafficLamp.valueOf(Road.this.name).isLight();
Road.this.name访问的是全局变量中的name
boolean lighted = TrafficLamp.valueOf(name).isLight();
name访问的指的是public Road(String name){}中传入的name,

road方法被调用,这时产生了一个局部内部对象,需要访问传入参数name,这个name是保存在栈中的,当方法调用结束后,这个name就消失了,但是局部内部对象却没有消失,这样造成了局部内部对象访问一个不存在的name。java的解决办法是再复制一份,即对局部变量加上final。如果局部内部对象消失了,Road.this.name一定是存在的,因为Road对象尚未消失。

两个方法最终结果是一样,但是他们访问的name却是不一样的,Road.this.name访问的是全局变量中的name,加上final之后访问的是是复制的name,加上final之后,JAVA就可以放心的复制了,因为此时的name是不变的。

作者: 黑马高明辉    时间: 2012-7-20 18:29
张莹莹 发表于 2012-7-20 18:11
boolean lighted = TrafficLamp.valueOf(Road.this.name).isLight();
Road.this.name访问的是全局变量中的 ...

final是把方法中的局部变量拷贝了一份,与外部对象共存,直至外部对象销毁。是这个意思不?




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