一文搞懂 final關鍵字

什麼是final關鍵字

final關鍵字的表面定義就是保持變量的不可變性,使用final修飾的變量不可以改變此變量的值。

final關鍵字的使用

final修飾變量
觀察一下,final關鍵字修飾的變量必須給初始化一個值。

    public final int finalVariable = 0;  //final修飾的變量
    public int normalVariable ;                 //普通變量
    public static int staticVariable ;   //靜態變量  

final修飾變量,其變量值不可以被改變

public class FinalBase {
    public final int finalVariable = 0;  //final修飾的變量
    public int normalVariable ;                 //普通變量
    public static int staticVariable ;   //靜態變量  

    public static void main(String args[]) {
        FinalBase finalBase = new FinalBase() ;
        finalBase.finalVariable = 1 ;   //錯誤
        finalBase.normalVariable = 1 ;
    }
 }

final修飾方法

final修飾的方法不可以被子類重寫,保持此方法的不可變性。

public class FinalBase {
    public final int finalVariable = 0;  //final修飾的變量
    public int normalVariable ;                 //普通變量
    public static int staticVariable ;   //靜態變量 
  public final int finalMain() {
        System.out.println(finalVariable);
        return 0 ;
    }  
 }
public class FinalBaseSon extends FinalBase{
        //字類重寫父類的方法失敗,final禁止子類重寫此方法
         public final int finalMain() {  
             return 0 ;
         }
 }

final修飾類

final修飾類表示此類禁止被繼承,保持類的不可變性。

public final class  FinalBase {
 }
//當父類FinalBase被final修飾時,則這個類不能被繼承
public class FinalBaseSon extends FinalBase{
     
 }

final關鍵字的內存分配

final關鍵字是保證內存的指向不可變來保證它的不可變性,舉一個例子

public final class  FinalBase {
    public final int finalVariable = 0;  //final修飾的變量
	public final int finalMain() {
        System.out.println(finalVariable);
        return 0 ;
    }
    public static void main(String args[]) {
           FinalBase finalBase = new FinalBase() ;
          finalBase.finalVariable = 1 ;   //錯誤
          finalBase.finalVariable = 0 ;    //錯誤   
    }
}

上面的final變量在被賦予相同的值的時候爲什麼還會出錯呢?

因爲final初始指向的內存地址和重新賦值指向了不同的地址,他們的值雖然是一樣的但不是同一變量

在這裏插入圖片描述

使用場景

final關鍵字和static關鍵字通常配合使用
static 和final完全可以分開使用,並且都是各自有各自的特點。
當static和final一起使用時,可以達到一個目的:我的這個完整類不可以被你們修改,我的方法只能被你們使用。如String類。
final線程安全性:因爲final變量的不可變性,它無論同時被多少線程訪問他都是線程安全的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章