概念
final 具有“不可改變的”的含義,可以修飾 非抽象類、非抽象成員方法和變量。
注:
final 不能用來修飾構造方法,因為“方法覆蓋”這一概念僅適用于類的成員方法,而不適用于類的構造方法,父類的構造方法和子類的構造方法之間不存在覆蓋的關系,因此用final修飾構造方法沒有任何意義。
父類中用 PRivate 修飾的方法不能被子類的方法所覆蓋,因此可以理解為 private 類型的方法默認是 final 類型的。
final 類
把類定義為 final,使這個類不能被繼承。具體使用場景如下:
例如:JDK中的java.lang.String 類被定義為 final 類型。
public final class String{...}
final 方法
在某些情況下,出于安全原因,父類不允許子類覆蓋某個方法,此時可以把這個方法聲明為 final 類型。
例如:JDK中的java.lang.Object 類中,getClass()方法為 final 類型,而 equals() 方法不為 final 類型。
所有 Object 的子類都可以覆蓋 equals() 方法,但不能覆蓋 getClass() 方法。
final 變量
用 final 修飾的變量表示取值不會改變的常量。
例如:JDK中 java.lang.Integer 類中定義了兩個常量。
public static final int MIN_VALUE = 0x80000000;
public static final int MAX_VALUE = 0x7fffffff;
final 變量具有以下特征:
1 public class Demo{2 public static final int MAX_VALUE = 23; //靜態常量3 public static final int MIN_VALUE = 10; //靜態常量4 private final Date birthday = new Date(); //成員常量5 }靜態常量一般以大寫字母命名,單詞之間以“_”符號分開。
1 public class FinalTest { 2 final int a = 1; //成員常量 默認初始化 3 static final int b = 2; //靜態常量 默認初始化 4 final int c; //成員常量 5 static final int d; //靜態常量 6 7 public FinalTest(){ 8 c = 3; //成員常量 未默認初始化,可在構造函數中初始化 9 }10 11 static {12 d = 4; //靜態常量 未默認初始化,可在靜態代碼塊中初始化13 }14 } 1 public class FinalTest { 2 String str = ""; 3 public void print(){ 4 System.out.println(str); 5 } 6 public static void main(String[] args){ 7 final FinalTest finalTest = new FinalTest(); 8 finalTest.str = "xixihaha"; 9 finalTest.print();10 }11 }總結:
實際程序中,通過 final 修飾符來定義常量,目的為:
參考:《Java面向對象編程》
新聞熱點
疑難解答