1. 程式人生 > 其它 >Java修飾符 --- final

Java修飾符 --- final

final 關鍵字的好處:

1.final 關鍵字提高了效能,JVM 和 Java 應用都會快取 final

2.final 變數可以安全的在多執行緒環境下進行共享,而不需要額外的同步開銷

3.使用 final 關鍵字,JVM 會對方法、變數以及類進行優化

@

目錄

一、修飾變數

  • 當 final 修飾一個基本資料型別或者引用型別時,一旦在初始化之後,值不能改變,但是引用型別指向的物件的值是可以改變的(因為引用型別存的是一個地址,被 final 修飾時,地址不變就好了)

  • final 修飾成員變數是,必須要顯示初始化,要麼是在宣告的時候賦值

    ,要麼是在該變數所在類的建構函式對變數進行賦值,區域性變數則是在使用之前初始化就好了

  • 注意:final 修飾物件,進行宣告時,必須初始化的值要是具體的物件,不能是指向另一個物件

    public class finalTest {
        
        public static void main(String[] args) {
            final person pers = new person();
            pers = new person();
        }
    }
    
    class person{
        String name = "張無忌";
    }
    

    例如上述程式碼中:pers = new person();

    在編譯是就會報錯,就是因為pers 被 final 修飾,不能再指向其他物件

二、類的 final 變數和普通變數的區別?

  • 例子:

    public class staticTest {
      
          public static void main(String[] args) {
              String A = "final999";
              final String B = "final";
              String C = "final";
              String str1 = B + 999;
              String str2 = C + 999;
              System.out.println(A == str1);// true
              System.out.println(A == str2);//false
              System.out.println(str1.equals(str2));//true
          }
      }
    
  • 可以從結果看出,str1str2兩個物件的內容是相等的,但是之所以一個為 true,一個為 false,就是 final 修飾變數和普通變數的區別了

    首先,物件 A 的值"final999"儲存在常量池,str2 的值為引用變數 C 拼接"999",對應變數 C 的訪問需要在執行時通過儲存的地址才能確定,而 str1 被 final 修飾,當變數為基本資料型別、String型別時,編譯器會把他當作編譯期常量使用(靜態繫結),也就是編譯期的時候,str1 的值就完成了拼接,為"final999"

三、修飾方法

  • 使用 final 方法的原因:其一是將方法鎖定,防止任何繼承類修改它的含義,其二是提高效率,因為在編譯時已經靜態繫結了,不需要在執行時動態繫結

  • 父類中被 final 修飾的方法,不能被重寫(因為重寫的前提就是子類繼承父類的方法),需要注意的是,如果父類中 final 修飾的方法同時訪問許可權為 private,子類就可以定義相同的方法名和引數,因為子類沒有直接繼承,而是重新定義的

    public class finalTest extends A {
    
        public static void main(String[] args) {
        }
    
        public void set() {
        }
    }
    
    class A {
        //當方法為public時,報錯
    //    public final void set(){
    //    }
    
        private final void set() {
        }
    }
    

四、修飾類

  • 當 final 修飾一個類時,表明這個類不能被繼承
  • 需要注意的是:final 類中的成員變數可以自行設為 final,但是 final 類中所有的成員方法都會被隱式地指定為 final 方法
  • 使用 final 修飾類的時候,謹慎選擇,除非以後不會用來繼承或者出於安全考慮