final修飾符
- final在Java中是一個保留的關鍵字,可以聲明成員變量、方法、類以及本地變量。一旦你將引用聲明作final,你將不能改變這個引用了,編譯器會檢查代碼,如果你試圖將變量再次初始化的話,編譯器會報編譯錯誤。
1、final關鍵字基本用法
1.1修飾變量
- 凡是對成員變量或者局部變量(在方法中的或者代碼塊中的變量稱為本地變量)聲明為final的都叫作final變量。final變量經常和static關鍵字一起使用,作為常量。
- final修飾基本數據類型的變量時,必須賦予初始值且不能被改變,修飾引用變量時,該引用變量不能再指向其他對象
例如:
package com.q._final;
/*
* final :
* 表示最終的,不可變的 */
public class FinalData {
public final String s = "abc";
public void test(){
final Object obj = new FinalData();
}
}
當final修飾基本數據類型變量時不賦予初始值以及引用變量指向其他對象時就會報錯
當final修飾基本數據類型變量被改變時,就會報錯
1.2修飾方法
final也可以聲明方法。方法前面加上final關鍵字,代表這個方法不可以被子類的方法重寫。如果你認為一個方法的功能已經足夠完整了,子類中不需要改變的話,你可以聲明此方法為final。final方法比非final方法要快,因為在編譯的時候已經靜態綁定了,不需要在運行時再動態綁定。
3.修飾類
使用final來修飾的類叫作final類。final類通常功能是完整的,它們不能被繼承。Java中有許多類是final的,譬如String, Interger以及其他包裝類。
2 、深入分析final關鍵字
1.被final修飾的對象內容是可變的
雖然對象被final修飾對象不可被繼承,但其內容依然可以被改變
2.final關鍵字與static對比
static關鍵字修飾變量時,會使該變量在類加載時就會被初始化,不會因為對象的創建再次被加載,當變量被static 修飾時就代表該變量只會被初始化一次
package com.q._final;
/*
* final :
* 表示最終的,不可變的 */
public class FinalData {
public final String s = "abc";
public void test(){
final Object obj = new FinalData();
}
public final double a= Math.random();
public static double b= Math.random();
public static final double c= Math.random();
public static void main(String[] args) {
FinalData finalData1 = new FinalData();
FinalData finalData2 = new FinalData();
FinalData finalData3 = new FinalData();
System.out.println(finalData1.a);
System.out.println(finalData2.a);
System.out.println(b);
System.out.println(b);
System.out.println(c);
}
}
例如圖中所示,被static修飾的變量j,雖然創建兩個對象,對值並沒有變化。
final 修飾實例變量 必須在創建對象new 時賦值
系統賦默認值之前就行
我們請看下面的例子:
package com.q._final;
/*
* final :
* 表示最終的,不可變的 */
public class FinalData {
public final String s = "abc";
public void test(){
final Object obj = new FinalData();
}
private final double a= Math.random();
private static double b= Math.random();
private static final double c= Math.random();
public FinalData() {
System.out.println(a);
System.out.println(b);
System.out.println(c);
}
public String getS() {
return s;
}
public double getA() {
return a;
}
public static double getB() {
return b;
}
public static double getC() {
return c;
}
}
class Test {
public static void main(String[] args) {
System.out.println("-------------------");
FinalData finalData1 = new FinalData();
System.out.println("-------------------");
FinalData finalData2 = new FinalData();
System.out.println("-------------------");
FinalData finalData3 = new FinalData();
System.out.println("-------------------");
System.out.println(finalData1.getA());
System.out.println(finalData2.getA());
System.out.println("-------------------");
int i = 100;
final int i0 = i;
System.out.println(i);
System.out.println(i0);
i = 1000;
System.out.println(i);
System.out.println(i0);
}
}