您好,登錄后才能下訂單哦!
這篇文章主要介紹“如何使用Java并發之inal關鍵字”,在日常操作中,相信很多人在如何使用Java并發之inal關鍵字問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”如何使用Java并發之inal關鍵字”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
一、final使用場景
final可以稀釋變量,方法和類,用于便是修飾的內容一旦賦值之后不會再被改變,比如string類就是一個final類型的類。
二、final修飾變量
在Java中變量可以分為成員變量和局部變量。
成員變量
通常每個類中成員變量可以分為類變量(static修飾的變量)以及實例變量針對這兩種類型的變量賦初始值的時機是不同的。
類變量可以再聲明變量的時候直接賦初始值或者在靜態代碼塊中給類變量賦初始值;而實例變量可以在聲明變量的時候給實例變量賦初始值,在非靜態初始化塊中以及構造器中賦初始值。
類變量有兩個時機賦初始值,而實例變量可以有三個時機賦初始值。當final變量未初始化時系統不會進行隱式初始化,會出現報錯。
將這幾種情況歸納整理一下:
類變量:必須要在靜態初始化塊中指定初始值或者聲明該類變量時指定初始值,而且只能在這兩個地方之一警醒指定;
實例變量:必須要在非靜態初始化塊,聲明該實例變量或者在構造器中指定初始值,而且只能在這三個地方警醒指定。
局部變量
final局部變量有程序員進行顯示初始化,如果final局部變量已經進行了初始化則后面就不能再次進行更改,如果final變量未進行初始化,可以進行賦值,當且僅有一次賦值,一旦賦值之后再次賦值就會出錯。
基本數據類型和引用數據類型
final修飾的基本數據類型和引用類型有區別嗎?
通過上面的例子我們已經看出來,如果final修飾的是一個基本數據類型的數據,一旦賦值后就不能再次更改,那么,如果final修飾的是引用數據類型?這個引用的對象能夠改變嗎?
package passtra; public class FinalExample{ //在聲明final實例成員變量時進行賦值 private final static Person person=new Person(25, 175); public static void main(String[] args) { //對final引用數據類型person進行更改 person.age=22; System.err.println(person.toString()); } static class Person{ private int age; private int height; public Person(int age, int height) { super(); this.age = age; this.height = height; } @Override public String toString() { return "Person [age=" + age + ", height=" + height + "]"; } } }
當我們對final修飾的應用數據類型變量person的屬性改成22,是可以操作成功的。
通過代碼可以看出,當final修飾基本數據類型時,不能對基本數據類型變量重新賦值,因此基本數據類型不能被改變,而對于引用數據類型,它僅僅保存的是一個引用,final只保證引用類型所引用的地址不會發生改變,即一直引用這個對象,但這個對象屬性是可以改變的。
宏變量
利用final變量的不可更改性,在馬祖下面三個條件時,該變量就會成為一個宏變量,即一個常量。
使用final修飾符修飾,在定義該final變量時就指定了初始值,該初始值在編譯時就能夠唯一指定。
注意:
當程序中其他地方使用該宏變量時,編譯器會直接替換該變量的值。
三、final修飾方法
重寫
當父類的方法被final修飾的時候,子類不能重寫父類的該方法。你如在object中getClass()方法就是說final修飾的,我們就不能重寫該方法,但是hasdhCode()不是被final修飾的,我們就可以重寫hashCode()方法。
重載
package passtra; public class FinalExample{ public final void test(){ } //沒有報錯 public final void test(int i){ } }
可以看出被final修飾的方法可以重載。
四、final修飾類
當一個類被final修飾時,表明該類不能被子類繼承。
子類往往可以重寫父類的方法和屬性,會帶來一定的安全隱患,因此當一個類不希望被繼承是就可以用final修飾。
五、final在JDK中有哪些應用
final經常被用作不變類上,利用final的不可更改性。
不變類
不變類的意思是創建該類的實例后,該實例的實例變量時不可改變的。滿足以下條件可以成為不變類:
使用private和final修飾該類的成員變量;
提供帶參數的構造器用于初始化類的成員變量;
僅為該類的成員變量提供getter方法,不提供setter方法,因為普通方法無法修改final修飾的成員變量;
如果有必要就重寫object的hashCode和equals方法應該保證用equals判斷相同的兩個對象其HashCode值也是相等的。
JDK中提供的八個包裝類和String類都是不可變的,可以看看string的實現
private final char value[];
可以看出string的value就是final修飾的,上述其他幾條性質也是吻合的。
到此,關于“如何使用Java并發之inal關鍵字”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。