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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马高明辉 中级黑马   /  2012-7-20 16:14  /  1954 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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....}有什么区别?

评分

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

查看全部评分

3 个回复

倒序浏览
      内部类是外部类的一个成员,就像外部类的成员方法一样,所以内部类有权限访问外部类的所有成员,包括private类型的,至于为什么外部类的局部变量要加final修饰,是因为内部类和外部类的生命周期的原因,具体解释你可以看下我博客里转载的一篇关于内部类访问外部类的局部变量的文章,我感觉讲得听明白的,http://blog.csdn.net/wangbaokangfei/article/details/7768201
回复 使用道具 举报
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是不变的。

评分

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

查看全部评分

回复 使用道具 举报
张莹莹 发表于 2012-7-20 18:11
boolean lighted = TrafficLamp.valueOf(Road.this.name).isLight();
Road.this.name访问的是全局变量中的 ...

final是把方法中的局部变量拷贝了一份,与外部对象共存,直至外部对象销毁。是这个意思不?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马