這幾天寫代碼的時(shí)候碰到一個(gè)問題

圖一
用的環(huán)境是jdk8,所以匿名類是lambda的寫法,我記得以前學(xué)的時(shí)候匿名內(nèi)部類引用外部局部變量(不是類成員變量)的時(shí)候需要申明為final,但是我這里明顯沒有申明也可以跑。難道語法改了?查了一下才發(fā)現(xiàn),jdk8有個(gè)“有效final”的概念,大概意思就是說內(nèi)部類之后這個(gè)引用沒有發(fā)生變化,那么就可以認(rèn)為他是一個(gè)final。
之后我進(jìn)行了一些測試,我先進(jìn)行了重賦值操作,keys=null;發(fā)現(xiàn)語法報(bào)錯(cuò)。
我又調(diào)用了keys.add方法,發(fā)現(xiàn)沒有問題。由此可知final鎖定的是引用(我更喜歡理解為句柄),而不是對象內(nèi)容。