博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于匿名内部类和局部内部类的外部引用必须是final的疑问
阅读量:4710 次
发布时间:2019-06-10

本文共 1126 字,大约阅读时间需要 3 分钟。

      

 我想了很久,还是无法得出一个准确的答案。如果从匿名内部类和局部内部类的存在意义来说的话,它们对于外围类的方法来说,都是不可见的,但是不可见,只是方法无法使用它们,并不能说明什么,内部类的方法和变量还是可以访问的,只要有创建实例。所以,问题就可以归于以下几点的解决:
1.如果内部类的引用不是final,会怎么样?
        这问题从引用是final这点就已经解释了。因为final是不能修改该引用所指向的对象,所以如果不是final,该引用所指向的对象可以被修改。问题又来了:
2.为什么引用一定不能被修改?
       如果修改了会怎样?我们都知道,别名现象的存在,使得指向同一个对象的引用,如果其中的引用被修改,另一个引用也会被修改,这在某些情况下是很不好的,但是不是内部类不也存在这种情况吗?但是我们又何曾想过要用final,那么,就只能是内部类本身的特点,使得它必须这样子做。内部类的特点就像前面所说的,不可见,就是这个不可见使得它必须这么做吗?
3.我发现一个问题,如果将要传入的引用改为static,那么在内部类的方法中使用该引用是可以的,但是要传入引用,依然得使用final,所以这个问题的关键,我觉得,就在于引用的性质了。
4.static引用和final引用到底有什么关联?
      没有什么关联。static引用因为不需与特定的对象关联在一起,所以内部类可以使用而不需通过方法将这个引用传进来。于是问题又回到原点,第二点到底要怎么解释。
      内部类在层次上,想当于类的方法,所以,它在类的层次上是与它所在的方法是相同的。那么,引用不可被修改,是否是为了保证引用的正确性呢?因为方法传进的引用,更多就只是作为内部类的引用,方法本身并不需要这个引用但又必须传参进来,但是引用可能在这个方法中被修改,所以这是否是为了保证内部类能够正确得到该引用呢?所以,这里面又涉及到方法传参的机制。方法传参,在java中就只有两种,传引用和传值。传值,会进行拷贝动作,传引用,就是相当于直接将这个对象传进来,因为对该引用所做的任何动作都会直接影响到该对象。
      这种解释我觉得,应该是目前最靠谱的。因为其他内部类并没有这种要求,只有局部内部类和匿名内部类有这种要求,其他内部类是可以直接将外围类的成员作为引用传进来,并不需要经过外面的方法这一层,所以,理应成立吧?
       这个问题网上有很多莫名其秒的解释,但是后来还是能够找到与我的答案一样的解释,他说是为防止闭包共享中发生变量取值错误的问题。我想,这与我上面的探讨是一样的,链接同下,同样都是博客园的文章:
      

转载于:https://www.cnblogs.com/wenjiang/archive/2012/09/01/2666809.html

你可能感兴趣的文章
oracle相关操作,存储、临时表空间、用户操作、启动过程
查看>>
Python 2.基础
查看>>
使用命令行连接本地mySql数据库的若干方法
查看>>
PHP 微信分享
查看>>
给所有的Control加两个属性,实现回车键自动跳转到下一个控件
查看>>
使用正则表达式,取得点击次数,函数抽离
查看>>
数据库设计——评论回复功能
查看>>
Dll 使用 PChar 参数的小例子 - 回复 "linximf" 的问题
查看>>
跟我一起学kafka(一)
查看>>
Sql统计一个字符串在另一个字符串出现的次数的函数-fnQueryCharCountFromString
查看>>
电脑技巧 ADSL如何远程盗号
查看>>
源码编译安装php
查看>>
切换用户,显示用户名, 调用Windows系统命令
查看>>
修改dede标题长度限制 改此参数后…
查看>>
ubuntu下安装Docker
查看>>
mysql的字符编码
查看>>
《编程之美》读书笔记 -- 1.4买书问题
查看>>
稳定排序
查看>>
libev & libevent简介
查看>>
ProtoBuffer优势
查看>>