注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Search的博客

不断学习中!

 
 
 

日志

 
 

java final关键字的理解  

2012-12-02 11:27:19|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
最近在代码的过程中遇到一个问题,就是在内部类中如果想要访问外部类的对象,那么这个外部类对象必须设置为final,才能够实现,以前在遇到这个问题时,仅仅是浅显的认为你内部类既然要访问外部类的对象,肯定不能改变它的值吧,因此那好就把它设置为final使它不能改变就好了。
但是后来随着编程的深入,越来越觉得这种理解存在着一些问题;首先我们要知道内部类对象的有效期,内部类对象是随着外部类的消亡而消亡的,其他均与普通的类的性质相同,简言之你可以把它看成一个普通类,只不过这个普通类的生存期受到外部类的限制罢了,接着我们来看这个内部类所在的函数,比如在下面这个例子中,
public static void test2()
    {
        //必须声明为final对象
        final int tes=6;
        /*class test6{
            void test()
            {
                System.out.print(tes);
            }
        }
    */
        new Thread(){
           
            public void run()
            {
                while(true)
                {
                    try {
                        Thread.sleep(500);
                        System.out.println(tes);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
        }.start();  
    }
在函数中添加了一个内部累为test6,其中tes对象的生存周期是随着test2()运行完以后就消失的,但是前面我们说过内部类对象的生存周期是随着这个外部类消亡才消亡的,这样就存在了一个问题,那就是同一个引用tes在消亡以后却仍然在使用,或则在test函数后面把tes的值改变的话,普通的内部类或许不是很明显,但是如上例你可以把这个类定义为一个线程类这样的话就看的比较清楚了,线程类是可以一直执行的,但是test()函数却早就已经消亡。内部类与外部类竟然同时维护这两个值这是不能容忍的,那好吧,尽然不能容忍,那就不访问外部类了吧,但是一旦这样可想而至内部类就没有存在了必要了,不能访问外部类的对象,那我还定义你干嘛,在大多数人看来内部类访问外部类对象是天经地义的事情,但是正如前面所说,一旦能访问就会出现变量的维护问题,于是java设计者们就采取了一个折中的方法,你内部类可以访问外部类的对象,但是这个对象必须是用final修饰符修饰的,使这个引用不能再指向其他的值,这样的话tes就不能再指向其他值,也就不会存在对象不统一的现象。
  评论这张
 
阅读(106)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017