一、簡介
final修飾符可以用來修飾變量、方法、類。final修飾變量時(shí)一旦被賦值就不可以改變。
二、final成員變量
成員變量是隨類初始化或?qū)ο蟪跏蓟跏蓟摹.?dāng)類初始化的時(shí)候,會(huì)給類變量分配內(nèi)存;當(dāng)對(duì)象初始化的時(shí)候,會(huì)給實(shí)例變量分配內(nèi)存。
所以說,final修飾的變量可以在申明的時(shí)候指定初始值,也可以再靜態(tài)初始化塊中指定初始值;final修飾的實(shí)例變量除了在申明的時(shí)候指定初始值,還可以在構(gòu)造器或者在普通初始化塊中指定初始值。
需要注意的是: 指定初始值只能在一處進(jìn)行,不可既在申明的時(shí)候指定,又在初始化塊中指定。
package fianlFieldCase;public class Test { //實(shí)例field,在申明時(shí)賦值了 PRivate final String str = "java"; //實(shí)例field,在申明時(shí)未賦值 private final String str2; //實(shí)例field,在申明時(shí)未賦值 private final int i; //類field,在申明時(shí)賦值了 private static final int i2 = 2; private static final int i3; { //在普通初始化塊中給實(shí)例field賦值 str2 = "normalFinalField"; } static { //在靜態(tài)初始化塊中給類field指定初始值 i3 = 3; } public Test() { //在構(gòu)造器中給實(shí)例field賦值 i = 1; //在構(gòu)造器中給已經(jīng)在初始化中賦了值的str2重新賦值,將會(huì)報(bào)編譯錯(cuò)。 //str2 = "re"; }}
注意: final修飾的成員變量必須顯式進(jìn)行初始化,若與普通成員變量一樣,由系統(tǒng)給出默認(rèn)值,而此變量又是不可變的,那這個(gè)變量也就失去意義了。所以JAVA語法規(guī)定final修飾的成員變量必須顯式初始化。
三、final局部變量
final修飾的局部變量可以在申明的時(shí)候賦值,也可以在后面賦值,但只能賦值一次,否則會(huì)編譯不通過。同樣final修飾的形參也是的,不可以重新進(jìn)行賦值,因?yàn)樾螀⑹窃谠摲椒ū徽{(diào)用的時(shí)候被賦值的。
package fianlFieldCase;public class FinalField { public static void print(final String str) { //str不能被重新賦值 //str = "android"; System.out.println(str); } public static void main(String[] args) { //final修飾的局部變量在申明的時(shí)候就被初始化了 final String s = "java"; //若重新賦值,便會(huì)編譯不通過 //s = "python"; //final修飾的局部變量,沒有被初始化 final int i; //可以在后面進(jìn)行初始化 i = 1; //重新賦值,便會(huì)報(bào)錯(cuò) //i = 2; print("Ruby"); }}
四、final修飾基本類型變量和引用類型變量的區(qū)別
當(dāng)使用final修飾基本類型變量時(shí),不能對(duì)基本類型變量進(jìn)行重新賦值,因此基本類型變量不能被改變。
當(dāng)final修飾引用類型變量時(shí),它僅僅是一個(gè)引用,存放的是對(duì)象的地址,那這個(gè)地址是不能變的,即不能指向新的地址,但指向的這個(gè)對(duì)象里面的值其實(shí)是可以改變的。
final修飾方法和類將在后續(xù)博客進(jìn)行總結(jié)!
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注