java基础-关键字final
概述
final是java中一個保留的關鍵字,也被視為一個修飾符(Modifier),可以修飾一個成員變量、方法參數、方法甚至一個類。
final變量(域)
凡是用final關鍵字修飾的成員變量或本地變量都可以稱為final變量,即常量。被final修飾后的變量是只讀的,即一旦初始化后就不允許重新賦值。但如果final修飾的是一個對象的引用,則對象本身的內容是可以改變的,不可改變的是final對象不允許再指向其他對象。 在修飾變量時,final經常和其好基友final一起出現,如聲明一個日志對象時:
private final static Logger LOG = LoggerFactory.getLogger(Abc.class); 復制代碼LOG被定義為static,使得這個變量與當前類Abc綁定,避免每次都new一個新對象,造成資源浪費;同時LOG被定義成final,可以有效防止無意中將LOG變量重新賦值。
在包括Math在內的工具類中,一般都包含很多final域,如:
常量分類
命名規約:
final入參
首先需要明確一點java中只有按值傳遞,沒有按引用傳遞。
基本類型參數
對于基本數據類型,按值傳遞調用函數時并不會改變在原函數中的值。所以使用final修飾的目的不是為了防止調用函數對原數值造成副作用,而僅僅是為了防止用戶無意間對入參重新賦值,而可能引發的一些難以發現的BUG。
引用類型參數
與基本類型參數相似,使用final修飾引用類型入參時,如果在方法內對該變量重新賦值,會導致編譯失敗。
public static void changeMe(int i){i = 123; // OK,但不會更改實參的值 }public static void changeMe(final int i) {i = 123; // 編譯失敗 }public static void changeMe(BookBean book) {book = new BookBean(); // OK,但是一般不會這樣使用,沒啥意義。最好為新new的對象啟用一個新的變量名 }public static void changeMe(final BookBean book){book = new BookBean(); // 編譯失敗 } 復制代碼final方法
使用final修飾的方法,不能被子類override。意味著你認為這個方法已經很nice了,子類沒有必要再去修改了。從性能角度考慮,final方法相比非final方法要更快,因為前者是在編譯階段就已經被靜態綁定了,不需要在運行期間再去動態綁定。java.lang.Object類中大部分方法都是final修飾的,如:
public final native Class<?> getClass(); public final native void notify(); 復制代碼final類
final方法是不能被子類重寫,相似地,final類則表明該類不能被子類繼承。java中有許多類都是被final修飾的,如String類、包裝類、Objects。這些類都屬于不可變類,即只能創建只讀對象 。如果我們嘗試去extends一個String類,編譯器就不會同意。
// String類定義 public final class Stringimplements java.io.Serializable, Comparable<String>, CharSequence { ... }; // Integer類定義 public final class Integerextends Number implements Comparable<Integer> { ... } // Objects類定義 public final clas Objects { ... } 復制代碼效率與安全
20190119更新:常量的分類及命名規約
總結
以上是生活随笔為你收集整理的java基础-关键字final的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网页文章无法复制的破解法
- 下一篇: 使用VSCode+PlantUML+C4