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