final 關鍵字

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 的理解,以後有相關的感悟會持續更新

相關文章
相關標籤/搜索