Java基礎系列--final關鍵字
原創作品,可以轉載,但是請標註出處地址:http://www.cnblogs.com/V1haoge/p/8482909.html
一、概述
final是Java關鍵字中最常見之一,表示“最終的,不可更改”之意,在Java中也正是這個意思。
有final修飾的內容,就會變得與眾不同,它們會變成終極存在,其內容成為固定的存在。
二、作用
2.1 final修飾變量
變量被final修飾就會變成為常量,常量被保存在方法區中。
變量一旦被final修飾,必須手動進行初始化,未進行初始化的final常量是無法通過編譯的。
如果只有final修飾的變量的初始化可以采用:
--定義時賦值
--代碼塊賦值
--構造器賦值
如果被static和final同時修飾的變量的初始化可以采用:
--定義時賦值
--靜態代碼塊賦值
一旦final變量被static修飾,那麽它就脫離了對象的組織(代碼塊、構造器都是對象的組織),升級為類的組織,所以需要在類級別的靜態代碼塊中進行初始化。
1 public class FinalTest { 2 final int i = 1; 3 int j = 2; 4 static int m = 3; 5 static final int n = 4; 6 }
或
1 public classFinalTest { 2 final int i; 3 int j; 4 static int m; 5 static final int n; 6 { 7 i = 1; 8 } 9 static { 10 n = 3; 11 } 12 }
如果將上面的代碼改成:
1 public class FinalTest { 2 final int i; 3 int j; 4 static int m; 5 static final int n; 6}
上面代碼第2行和第5行會報錯,原因就是未進行初始化。
那麽我們總結下final和static的現象,用於區分二者:
static修飾將內容脫離對象成為類成員。
final修飾將內容改造成必須被手動初始化的成員,一旦賦值,不再改變。
二者可以同時存在,各起各的作用。
2.2 final修飾方法
被final修飾的方法,可以被子類繼承,但是不能被子類重寫,也就是說這個方法在此以後其內部的實現就是固定不變的了,不能被改變。
2.3 final修飾類
被final修飾的類,被稱之為最終類,其不再擁有子類,不可再進行擴展,最常見的final類就是String類。
String類被final修飾之後,其每個對象都是不變的,一旦定義就不再發生改變。
2.4 final修飾局部變量
final修飾的局部變量,如果方法的參數被final修飾,那麽這個參數的值在從方法調用時賦值開始就不能再改變,不能被重新賦值(不能改成他值)。
最常使用的地方就是局部內部類在訪問方法的局部變量的情況下,這些局部變量就需要使用final修飾,因為當局部內部類訪問局部變量時,會放大局部變量的作用域,局部變量一般在方法結束時就失效了,但是卻有可能任然被內部類的對象持有使用。將該局部變量定義為final之後,它不再保存於棧空間,而是保存在方法區中,自然不會因為方法的結束而丟失。
1 public void outMethod(){ 2 final int s = 1; 3 class innerClass{ 4 public void innerMethod(){ 5 System.out.println(s); 6 } 7 } 8 }
如果去掉第2行的final,第5行就會報錯。
Java基礎系列--final關鍵字