zoukankan      html  css  js  c++  java
  • 关于匿名内部类和局部内部类的外部引用必须是final的疑问

          

     我想了很久,还是无法得出一个准确的答案。如果从匿名内部类和局部内部类的存在意义来说的话,它们对于外围类的方法来说,都是不可见的,但是不可见,只是方法无法使用它们,并不能说明什么,内部类的方法和变量还是可以访问的,只要有创建实例。所以,问题就可以归于以下几点的解决:
    1.如果内部类的引用不是final,会怎么样?
            这问题从引用是final这点就已经解释了。因为final是不能修改该引用所指向的对象,所以如果不是final,该引用所指向的对象可以被修改。问题又来了:
    2.为什么引用一定不能被修改?
           如果修改了会怎样?我们都知道,别名现象的存在,使得指向同一个对象的引用,如果其中的引用被修改,另一个引用也会被修改,这在某些情况下是很不好的,但是不是内部类不也存在这种情况吗?但是我们又何曾想过要用final,那么,就只能是内部类本身的特点,使得它必须这样子做。内部类的特点就像前面所说的,不可见,就是这个不可见使得它必须这么做吗?
    3.我发现一个问题,如果将要传入的引用改为static,那么在内部类的方法中使用该引用是可以的,但是要传入引用,依然得使用final,所以这个问题的关键,我觉得,就在于引用的性质了。
    4.static引用和final引用到底有什么关联?
          没有什么关联。static引用因为不需与特定的对象关联在一起,所以内部类可以使用而不需通过方法将这个引用传进来。于是问题又回到原点,第二点到底要怎么解释。
          内部类在层次上,想当于类的方法,所以,它在类的层次上是与它所在的方法是相同的。那么,引用不可被修改,是否是为了保证引用的正确性呢?因为方法传进的引用,更多就只是作为内部类的引用,方法本身并不需要这个引用但又必须传参进来,但是引用可能在这个方法中被修改,所以这是否是为了保证内部类能够正确得到该引用呢?所以,这里面又涉及到方法传参的机制。方法传参,在java中就只有两种,传引用和传值。传值,会进行拷贝动作,传引用,就是相当于直接将这个对象传进来,因为对该引用所做的任何动作都会直接影响到该对象。
          这种解释我觉得,应该是目前最靠谱的。因为其他内部类并没有这种要求,只有局部内部类和匿名内部类有这种要求,其他内部类是可以直接将外围类的成员作为引用传进来,并不需要经过外面的方法这一层,所以,理应成立吧?
           这个问题网上有很多莫名其秒的解释,但是后来还是能够找到与我的答案一样的解释,他说是为防止闭包共享中发生变量取值错误的问题。我想,这与我上面的探讨是一样的,链接同下,同样都是博客园的文章:
  • 相关阅读:
    SELECT INTO 和 INSERT INTO SELECT 两种表复制语句
    jquery各种滚动
    IE屏蔽鼠标右键、禁止复制粘贴等功能
    java高级---->Thread之BlockingQueue的使用
    java基础---->多线程之synchronized(六)
    java基础---->java中字符编码问题(一)
    java基础---->多线程之wait和notify(八)
    java基础---->多线程之ThreadLocal(七)
    java基础---->多线程之interrupt(九)
    java高级---->Thread之Exchanger的使用
  • 原文地址:https://www.cnblogs.com/wenjiang/p/2666809.html
Copyright © 2011-2022 走看看