final关键字细节
final關(guān)鍵字在java中是一個很重要的關(guān)鍵字,其實(shí)按照其字面意思理解,就可以一窺這個關(guān)鍵字端倪,final的本意是最終的。所謂最終的,其最重要的特征就是不能修改,由此衍生出的許多細(xì)節(jié)均應(yīng)以這個特征作為基礎(chǔ)。
final可以修飾類、方法、變量。變量包括成員變量和局部變量。
1.修飾類
final修飾過的類不能被繼承,如下的代碼在ide中是會報錯的。
final class Father{} //The type son cannot subclass the final class Father class son extends Father{}
2.修飾方法
final關(guān)鍵字修飾過的方法不能被子類重寫。
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() {} }
其實(shí)不管是final修飾的類不能被繼承,還是final修飾的方法不能被子類重寫,都是要保證這個類,這個方法時最終的,不能再被更改。這也符合final的本意。
3.修飾成員變量
final修飾的成員變量只能被賦值一次,而且必須在聲明的同時或者構(gòu)造函數(shù)中顯式賦值,然后才能使用。否則ide會給出提醒。因?yàn)椴幌衿胀ǖ某蓡T變量,即便不顯式初始化,系統(tǒng)也會默認(rèn)初始化。
以下代碼會出錯。
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修飾的局部變量只能被賦值一次。有時候我們方法的形式參數(shù)(這也相當(dāng)于一個局部變量)用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修飾,它就不能在方法體中繼續(xù)賦值。修改成如下,并調(diào)用才是正確的。
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);}}
上述執(zhí)行的結(jié)果是1和3。兩次調(diào)用func,分別傳入1和3給final形參y。此處不要認(rèn)為我修改了y的值,我調(diào)用了兩次func方法,兩次的局部變量并不是同一個。所以不存在重復(fù)賦值的說法。
如果在方法體中定義一個final類型的局部變量,則只能給他賦值一次,不能重復(fù)賦值,這很好理解。當(dāng)然也不能不賦值,這是最基本的,方法體中不管是不是final修飾的局部變量,都應(yīng)該先被賦值才能使用。
5.如果一個類中的成員變量,除了用final修飾,還加上了static,那么他就有兩層的屬性,首先是靜態(tài)的,可以直接通過類名直接訪問得到。其次它是不可再被修改的。那么這種類型的變量我們可以稱之為靜態(tài)常量,它必須在聲明的時候就直接顯式初始化,即便在構(gòu)造函數(shù)中都不能再初始化(可以理解為靜態(tài)變量并不需要實(shí)例化就可以訪問到,所以有可能不會執(zhí)行到構(gòu)造函數(shù)里面的代碼,這就無法保證這個final變量一定會被初始化,于是干脆在聲明的時候就初始化,最為保險)。
這種靜態(tài)常量可以直接通過類名來訪問,當(dāng)我們再加上一個訪問權(quán)限修飾符,比如public以后,這就成為了一個全局的常量,在整個項(xiàng)目中都能被訪問到。在項(xiàng)目中,我們經(jīng)常在一個類中寫滿了public static final類型的變量,并且命名為constant.java。然后通過constant.x來獲取這些常量。
轉(zhuǎn)載于:https://www.cnblogs.com/roy-blog/p/7670327.html
總結(jié)
以上是生活随笔為你收集整理的final关键字细节的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++ 用libcurl库进行http
- 下一篇: 面试题27. 二叉树的镜像