final關鍵字

final代表最終的,不可改變的。其可以修飾類,方法,變量(變量的範圍要比屬性的範圍的大)。

       1  final戲稱斷子絕孫類,也就是子類無法繼承。final的方法不能夠被重寫,final的變量只能賦值一次(這裏有一點需要強調的是,fanal修飾的是變量而非常量),即在初始化的時候,而且還必須賦值。

        2final修飾的類中沒有set屬性,由於final修飾的屬性只能夠賦值一次,所以不可能有set方法。如果有的話,試想當你new出一個該類的對象的時候,這個對象是能夠調用set方法無數多次的,顯然與final修飾的屬性賦值一次相矛盾。因此,final的屬性是沒有set方法的。

final修飾的屬性爲什麼不是通常意義下的常量呢?也許你會有這樣的疑問,既然final修飾的屬性只能賦值一次,有不能把其值給改變,爲什麼還不能把他當作常量?又這樣的疑問是正確的。但是你可以轉換一個角度想一下。針對一個對象來說,其值的確無法改變,但是當你重新new一個對象的時候,final修飾的變量一定還是可以在賦值的啊!這也就是說final在一個類中只能賦值一次,當你創建對象的時候,需要調用這個類的構造,而final修飾的變量是可以放在構造當中的,創建出來的對象,調用final修飾的屬性的時候,這個屬性的值不能總是相同。在這樣情況下,的確是不能夠把final修飾的東西當作常量來看的。試想一下如果一個常量 2,不過其對任何一個對象來說,其值永遠是2,絕對是不會改變的,這樣的纔算是常量。

      3你也許看到過Java中在定義常量的時候,有final的影子,的確沒錯。你想一想,定義的常量一定是這樣出現的啊:public static final   A_B = 4;這裏需要解釋一下的是,是否會問爲什麼要用public修飾而不用private或者protected來修飾呢?因爲是常量,沒必要隱藏,索性公開算了,這才符合常量的真正的意義。
public class Custom {
	private final int id;
	private static int i;
	public Custom() {
		id = ++i;
	}
	public int getId(){
		return id;
	}
}
public class Test {
	public static void main(String[] args){		
		for(int i=0;i<10;i++){
			Custom s = new Custom();
			System.out.println(s.getId());
		}
	}
}

這段代碼編譯和運行都能過去。我們分析一下,id是用final來修飾的,而i是用static來修飾的,我們看到了,id的確只能在創建對象的時候賦值一次,這沒錯,這就告訴我們id的值只有在創建對象的時候才能改變,也就印證了上面的說法,final修飾的屬性不是常量。而static修飾的屬性i,識別new出來對象所共享的,放在靜態池中。放在靜態池中的變量,我以前也提到過其特點:常駐內存,反覆利用。這兩個關鍵在上面的代碼中同時出現,分別用來修飾兩個變量,只是爲了更好地證明final修飾的屬性id只能賦值一次,而且是可以改變的。

補充一點:在引用類型當中final只能限定一層。

發佈了76 篇原創文章 · 獲贊 4 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章