當前位置:才華齋>計算機>java語言>

Java中final關鍵字用法的講解

java語言 閱讀(3.16W)

1. final variable

Java中final關鍵字用法的講解

final variable 就是一個常量,一旦被初始化就不可以被改變。

class Test1 { final double PI = 3.14; //常量的名稱最好大寫 public Test1(){ PI = 3.14; } void test(){ tln("PI is: " + PI); } public static void main(String[] args){ Test1 t = new Test1(); (); }}

輸出:

PI is: 3.14

(1)Blank final variable

在宣告時未初始化的 final variable 被稱作 blank final variable, blank final variable必須在 建構函式中被初始化,否則會丟擲編譯錯誤。

class Test1 { final double PI; Test1(){ PI = 3.14; //在建構函式中初始化 } void test(){ tln("PI is: " + PI); } public static void main(String[] args){ Test1 t = new Test1(); (); }}

輸出:

PI is: 3.14

(2)Uninitialized static final variable

在宣告階段未初始化的 static final variable 只能在靜態程式碼塊中被初始化

class Test1 { static final double PI; static { PI = 3.14; } void test(){ tln("PI is: " + PI); } public static void main(String[] args){ Test1 t = new Test1(); (); }}

輸出:

PI is: 3.14

2. final method

final method 不能被覆蓋。也就是說子類可以呼叫父類的 fianl method,但是不能覆蓋它。

class Test { static final double PI = 3.14; final void test(){ tln("PI is: " + PI); }}class Test1 extends Test{ public static void main(String[] args){ Test1 t = new Test1(); (); }}

輸出:

PI is: 3.14

3. final class

final calss 不能被繼承

final class Test1 { static final double PI = 3.14; final void test(){ tln("PI is: " + PI); } public static void main(String[] args){ Test1 t = new Test1(); (); }}

輸出:

PI is: 3.14

PS:ng類為什麼設計成 final 的?

首先,先得清楚 final 這個關鍵字

final的出現就是為了為了不想改變,而不想改變的理由有兩點:設計或者效率。final 修飾的類是不被能繼承的,所以 final 修飾的類是不能被篡改的。

瞭解了這一點,我們再看看問題:

(1)從設計上講,

A、確保它們不會在子類中改變語義。String類是final類,這意味著不允許任何人定義String的子類。換言之,如果有一個String的引用,它引用的一定是一個String物件,而不可能是其他類的物件。

B、String 一旦被建立是不能被修改的.,因為 java 設計者將 String 為可以共享的,下面這段是原始碼中的註釋:

(2)從效率上講:

A、設計成final,JVM才不用對相關方法在虛擬函式表中查詢,而直接定位到String類的相關方法上,提高了執行效率。

B、Java設計者認為共享帶來的效率更高。

總而言之,就是要保證 ng 引用引用的物件一定是 ng的物件,而不是引用它的子孫類,這樣才能保證它的效率和安全。