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

          

     我想了很久,还是无法得出一个准确的答案。如果从匿名内部类和局部内部类的存在意义来说的话,它们对于外围类的方法来说,都是不可见的,但是不可见,只是方法无法使用它们,并不能说明什么,内部类的方法和变量还是可以访问的,只要有创建实例。所以,问题就可以归于以下几点的解决:
    1.如果内部类的引用不是final,会怎么样?
            这问题从引用是final这点就已经解释了。因为final是不能修改该引用所指向的对象,所以如果不是final,该引用所指向的对象可以被修改。问题又来了:
    2.为什么引用一定不能被修改?
           如果修改了会怎样?我们都知道,别名现象的存在,使得指向同一个对象的引用,如果其中的引用被修改,另一个引用也会被修改,这在某些情况下是很不好的,但是不是内部类不也存在这种情况吗?但是我们又何曾想过要用final,那么,就只能是内部类本身的特点,使得它必须这样子做。内部类的特点就像前面所说的,不可见,就是这个不可见使得它必须这么做吗?
    3.我发现一个问题,如果将要传入的引用改为static,那么在内部类的方法中使用该引用是可以的,但是要传入引用,依然得使用final,所以这个问题的关键,我觉得,就在于引用的性质了。
    4.static引用和final引用到底有什么关联?
          没有什么关联。static引用因为不需与特定的对象关联在一起,所以内部类可以使用而不需通过方法将这个引用传进来。于是问题又回到原点,第二点到底要怎么解释。
          内部类在层次上,想当于类的方法,所以,它在类的层次上是与它所在的方法是相同的。那么,引用不可被修改,是否是为了保证引用的正确性呢?因为方法传进的引用,更多就只是作为内部类的引用,方法本身并不需要这个引用但又必须传参进来,但是引用可能在这个方法中被修改,所以这是否是为了保证内部类能够正确得到该引用呢?所以,这里面又涉及到方法传参的机制。方法传参,在java中就只有两种,传引用和传值。传值,会进行拷贝动作,传引用,就是相当于直接将这个对象传进来,因为对该引用所做的任何动作都会直接影响到该对象。
          这种解释我觉得,应该是目前最靠谱的。因为其他内部类并没有这种要求,只有局部内部类和匿名内部类有这种要求,其他内部类是可以直接将外围类的成员作为引用传进来,并不需要经过外面的方法这一层,所以,理应成立吧?
           这个问题网上有很多莫名其秒的解释,但是后来还是能够找到与我的答案一样的解释,他说是为防止闭包共享中发生变量取值错误的问题。我想,这与我上面的探讨是一样的,链接同下,同样都是博客园的文章:
  • 相关阅读:
    牛客网 二叉树的镜像 JAVA
    牛客网 反转链表 JAVA
    牛客网 调整数组顺序使奇数位于偶数前面 JAVA
    Integer to Roman LeetCode Java
    Valid Number leetcode java
    Longest Common Prefix
    Wildcard Matching leetcode java
    Regular Expression Matching
    Longest Palindromic Substring
    Add Binary LeetCode Java
  • 原文地址:https://www.cnblogs.com/wenjiang/p/2666809.html
Copyright © 2011-2022 走看看