final关键字细节
final關鍵字在java中是一個很重要的關鍵字,其實按照其字面意思理解,就可以一窺這個關鍵字端倪,final的本意是最終的。所謂最終的,其最重要的特征就是不能修改,由此衍生出的許多細節均應以這個特征作為基礎。
final可以修飾類、方法、變量。變量包括成員變量和局部變量。
1.修飾類
final修飾過的類不能被繼承,如下的代碼在ide中是會報錯的。
final class Father{} //The type son cannot subclass the final class Father class son extends Father{}
2.修飾方法
final關鍵字修飾過的方法不能被子類重寫。
class Father {public final void father_func() {System.out.println("father function");}} class son extends Father {//Cannot override the final method from Fatherpublic void father_func() {} }
其實不管是final修飾的類不能被繼承,還是final修飾的方法不能被子類重寫,都是要保證這個類,這個方法時最終的,不能再被更改。這也符合final的本意。
3.修飾成員變量
final修飾的成員變量只能被賦值一次,而且必須在聲明的同時或者構造函數中顯式賦值,然后才能使用。否則ide會給出提醒。因為不像普通的成員變量,即便不顯式初始化,系統也會默認初始化。
以下代碼會出錯。
public class FinalDemo {final Father f;//The blank final field f may not have been initializedpublic FinalDemo(){}public static void main(String args[]) {}}class Father {public final void father_func() {System.out.println("father function");}}這樣寫才正確
public class FinalDemo {final Father f;public FinalDemo(){f=new Father();}public static void main(String args[]) {}}4.修飾局部變量
final修飾的局部變量只能被賦值一次。有時候我們方法的形式參數(這也相當于一個局部變量)用final 來聲明,目的就是告訴編程的人,不要再在方法體里面給這個變量去賦值了。
如下代碼是錯誤的。
class Father {public void func(final int y){//The final local variable y cannot be assigned. It must be blank and not using a compound assignmenty=3;System.out.println(y);}}既然y被final修飾,它就不能在方法體中繼續賦值。修改成如下,并調用才是正確的。
public class FinalDemo {public static void main(String args[]) {Father f=new Father();f.func(1);f.func(3);}}class Father {public void func(final int y){System.out.println(y);}}
上述執行的結果是1和3。兩次調用func,分別傳入1和3給final形參y。此處不要認為我修改了y的值,我調用了兩次func方法,兩次的局部變量并不是同一個。所以不存在重復賦值的說法。
如果在方法體中定義一個final類型的局部變量,則只能給他賦值一次,不能重復賦值,這很好理解。當然也不能不賦值,這是最基本的,方法體中不管是不是final修飾的局部變量,都應該先被賦值才能使用。
5.如果一個類中的成員變量,除了用final修飾,還加上了static,那么他就有兩層的屬性,首先是靜態的,可以直接通過類名直接訪問得到。其次它是不可再被修改的。那么這種類型的變量我們可以稱之為靜態常量,它必須在聲明的時候就直接顯式初始化,即便在構造函數中都不能再初始化(可以理解為靜態變量并不需要實例化就可以訪問到,所以有可能不會執行到構造函數里面的代碼,這就無法保證這個final變量一定會被初始化,于是干脆在聲明的時候就初始化,最為保險)。
這種靜態常量可以直接通過類名來訪問,當我們再加上一個訪問權限修飾符,比如public以后,這就成為了一個全局的常量,在整個項目中都能被訪問到。在項目中,我們經常在一個類中寫滿了public static final類型的變量,并且命名為constant.java。然后通過constant.x來獲取這些常量。
轉載于:https://www.cnblogs.com/roy-blog/p/7670327.html
總結
以上是生活随笔為你收集整理的final关键字细节的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++ 用libcurl库进行http
- 下一篇: 面试题27. 二叉树的镜像