Java知識——final修飾符_01

final意思爲“最終的”,所以final修飾符修飾的類、方法、變量不可改變。下面會從各個方面解析final修飾的類、方法、變量的規律。

1.final修飾成員變量

1.1成員變量

成員變量是隨類的初始化或對象初始化時就會初始化的。類初始化時系統會爲類變量分配內存、默認值;創建對象時系統會爲該對象的實例變量分配內存、默認值。

1.2 final修飾的成員變量

final修飾的成員變量必須在程序中顯式指定初始值。
final修飾的類變量必須在①靜態初始化塊中 或 ②聲明該類變量時指定初始值;
final修飾的實例變量必須在①非靜態初始化塊中、②聲明該實例變量時或③構造器中指定初始值。

1.3示例代碼

代碼如下:

public class Final_Variable {
	//final修飾 實例變量 聲明時賦初值 正確
	final int number = 1;
	//final修飾 實例變量 非靜態初始化塊賦初始值 正確
	final String name;
		//非靜態初始化塊
	{
		name = "java";
		//final修飾的number變量已經賦值,不可改變,下面一行代碼錯誤
		//number = 2;
	}
	
	//final修飾 實例變量 構造器中賦初值 正確
	final int n;
		//構造器
	public Final_Variable() {
		n = 1024;
	}
	
	//final修飾 類變量 聲明時賦初值 正確
	final static int a = 3;
	
	//final修飾 類變量 靜態代碼塊中賦初值 正確
	final static int b;
		//靜態代碼塊
	static {
		b = 2019;
	}
	
	public static void main(String[] args) {
		Final_Variable test = new Final_Variable();
		//值不變
		System.out.println(test.n);
		System.out.println(test.name);
		System.out.println(test.number);
		System.out.println(test.a);
		System.out.println(test.b);
	}
}

2.final修飾局部變量

因爲系統不會對局部變量進行初始化,所以局部變量必須由程序進行顯式初始化;對局部變量進行初始化,可以在①定義時指定默認值,那麼之後就不能賦值;也可以②不指定默認值,之後只能賦值一次。
示例代碼如下:

public class Final_Variable {
	public void test(final int a) {
		//對形參用final修飾時,在代碼中無法賦值,下面的語句錯誤
		//a = 1;
	}
	
	public static void main(String[] args) {
		final int a;
		//在聲明變量a時沒有賦值,那麼之後可以賦值一次
		a = 1;
		//下面語句錯誤,無法繼續賦值
		//a = 2;
	}
}

3.final變量的宏替換

如果被賦值的表達式只是基本的算術表達式或字符串連接運算,沒有訪問其他的變量、方法,那麼java編譯器會將這些變量當做“宏變量”處理,會進行宏替換。
示例代碼如下:

public class FinalReplace {
	public static void main(String[] args) {
		//使用final修飾,編譯時會宏替換爲“studyjava”
		final String example = "study" + "java";
		String a = "studyjava";
		//因爲java的存儲池中不會有兩個相同的變量,所以地址相同,輸出爲true
		System.out.println(example == a);
		String c = "study";
		String d = "java";
		//沒有final修飾,調用其他的變量運算時,e的結果是由c、d兩個變量構成了,存儲地址未知
		String e = c + d;
		//此時輸出時爲true
		System.out.println(a == e);
	}
}

輸出結果爲:
true
false

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章