final 聲明方法,表明這個方法沒法被子類重寫app
final聲明類,表明這個類沒法被繼承ui
而後咱們重點來講下final 修飾變量繼承
在網上查了資料,final修飾的變量是隻讀的,其實我以爲並非很準確,確切來講,final修飾的引用的地址是不變的.博客
接下來咱們舉幾個例子來講明一下:基礎
1. 變量
public static void main(String[] args) { final String s="abc"; final StringBuilder sb=new StringBuilder("abc"); //s=s+"d"; //會報錯 sb.append("d"); System.out.println(sb); /*output :"abcd"*/ }
結果:用final修飾的String不可變,可是用final修飾的StringBuilder變了.數據類型
緣由:仍是從存儲方面來解釋,變量s 和sb在棧區,指向的是"abc"(String)和"abc"(StringBuilder)在堆區的地址.當改變String的時候,會在堆區從新分配一個"abcd"的地址,而後將s指向"abcd"的地址,被final修飾以後地址不能變,因此會報錯.一樣的緣由,"abc"(StringBuilder)變成"abcd"以後原地址不變(具體緣由請翻我上面的博客),因此被final修是的StringBuilder的值是可變的.引用
2.而後咱們來看下int爲何也是不可變的方法
public static void main(String[] args) { final int a =4; a=5;//從新賦值會報錯 }
int (8種基礎數據類型)的值稱爲字面值,存放在棧中,而a指向的是4的地址,當執行a=5的時候,他會先去找是否有5的地址,若是沒有就開闢一個存放5這個字面值的地址,而後將a指向的地址換成5的地址,可是被final修飾以後地址不能變因此會報錯.數據
這篇博客可能有側重的寫了對final 的理解,以後有相關的感悟會持續更新