12. final修饰符
一、final修飾符概述
1. final可以修飾類、變量和方法
2. final修飾的類、變量和方法不可改變
?
二、final成員變量
1. 對于final修飾的成員變量而言,一旦有了初始值,就不能被重新賦值
2. 由于成員變量不一定需要顯式初始化,故那些既沒有在定義時指定初始值,也沒有在初始化塊、構(gòu)造器中指定初始值的final成員變量的值將一直是系統(tǒng)默認(rèn)分配的0、'\u0000'、false或null,這些final成員變量也就完全失去了存在的意義,因此Java規(guī)定:final修飾的成員變量必須由程序員顯式地指定初始值
- final類變量:必須在靜態(tài)初始化塊中指定初始值或聲明該類變量時指定初始值,而且只能在兩個地方的其中之一指定
- final實例變量:必須在非靜態(tài)初始化塊、聲明該實例變量或構(gòu)造器中指定初始值,而且只能在三個地方的其中之一指定
?
三、final局部變量
1. 相比于成員變量,系統(tǒng)不會對局部變量進行初始化,局部變量必須由程序員顯式初始化,因此使用final修飾局部變量時,既可以在定義時指定默認(rèn)值,也可以不指定默認(rèn)值
- 如果在定義時指定了默認(rèn)值,則后面代碼中不能再對該變量賦值
- 如果在定義時未指定默認(rèn)值,則可以在后面代碼中對該final變量賦初始值,但只能一次,不能重復(fù)賦值
?
四、final變量→宏變量
1. 當(dāng)某個final變量滿足以下兩個條件時,它就不再是一個變量,而是相當(dāng)于一個直接量(即宏變量)
- 在該final變量定義時指定了初始值
- 該初始值可以在編譯時就被確定下來
2. 除了為final變量賦值時賦直接量的情況外,如果被賦的表達(dá)式只是基本的算術(shù)表達(dá)式或字符串連接運算,沒有訪問普通變量,也沒有調(diào)用方法,Java編譯器同樣會將這種final變量當(dāng)成“宏變量”處理
// ex:下面定義了4個final“宏變量”final int a = 5; final int b = 3 + 2;final double d = 1.2 / 3;final String str = "我愛" + "China";// 下面的ss變量的值因為調(diào)用了方法,所以無法在編譯時被確定下來,ss也就不會被當(dāng)成“宏變量”處理final String ss = "我愛China" + String.valueOf(1314);
五、final方法
1. final修飾的方法不可被重寫,但完全可以被重載
2. 由于子類無法重寫父類的private方法(如果子類中定義一個與父類private方法有相同方法名、相同形參列表、相同返回值類型的方法,也不是方法重寫,只是重新定義了一個新方法),因此即使使用final修飾一個private方法,依然可以在其子類中定義與該方法具有相同方法名、相同形參列表、相同返回值類型的方法
public class PrivateFinalMethodTest {private final void test() {} }class sub extends PrivateFinalMethodTest {// 下面的方法定義不會出現(xiàn)問題public void test() {} }注:雖然子類和父類都包含了同名的void test()方法,但子類并不是重寫父類的方法,因此即使父類的void test()方法使用了final修飾,子類中依然可以定義void test()方法。
?
六、final類
1. final修飾的類不可以有子類,所以若某個類不想被繼承,則可以使用final修飾該類
public final class FinalClass { }// 下面的類定義將出現(xiàn)編譯錯誤 class Sub extends FinalClass { }?
七、不可變類
1. 不可變類是指創(chuàng)建該類的實例后,該實例的實例變量是不可改變的
2. Java提供的8個包裝類和java.lang.String類都是不可變類
3. 如果要創(chuàng)建自定義的不可變類,可遵守如下規(guī)則:
- 使用private和final修飾符來修飾該類的成員變量
- 提供帶參數(shù)構(gòu)造器,用于根據(jù)傳入?yún)?shù)來初始化類里的成員變量
- 僅為該類的成員變量提供getter方法,不要為該類的成員變量提供setter方法
- 如果有必要,重寫Object類的hashCode()和equals()方法
補:對于上面的Address類,當(dāng)程序創(chuàng)建了Address實例后,將無法修改該Address實例的detail和postCode實例變量。
4. 不可變類的實例在整個生命周期中永遠(yuǎn)處于初始化狀態(tài),它的實例變量不可改變,因此對不可變類的實例的控制將更加簡單
- 不可變類的實例狀態(tài)不可改變,可以很方便地被多個對象所共享
?
轉(zhuǎn)載于:https://www.cnblogs.com/xzxl/p/10998741.html
總結(jié)
以上是生活随笔為你收集整理的12. final修饰符的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何将文字转换成语音?文字转语音哪个工具
- 下一篇: 【目录】python全栈工程师自动化+P