这几天写代码的时候碰到一个问题
用的环境是jdk8,所以匿名类是lambda的写法,我记得以前学的时候匿名内部类引用外部局部变量(不是类成员变量)的时候需要申明为final,但是我这里明显没有申明也可以跑。难道语法改了?查了一下才发现,jdk8有个“有效final”的概念,大概意思就是说内部类之后这个引用没有发生变化,那么就可以认为他是一个final。
之后我进行了一些测试,我先进行了重赋值操作,keys=null;发现语法报错。
我又调用了keys.add方法,发现没有问题。由此可知final锁定的是引用(我更喜欢理解为句柄),而不是对象内容。