final可以用在類(lèi)、方法、變量上。 1、final用在類(lèi)上,表明當(dāng)前類(lèi)它不能被繼承,沒(méi)有子類(lèi)。
【資料圖】
public final class 類(lèi)名稱(chēng) { // ... }
注意:一個(gè)類(lèi)如果是final的,那么其中所有的成員方法都無(wú)法進(jìn)行覆蓋重寫(xiě)
2、final用在方法上,表明當(dāng)前方法不能被override,不能被重寫(xiě)。
修飾符 final 返回值類(lèi)型 方法名稱(chēng)(參數(shù)列表) {
// 方法體}
注意:對(duì)于類(lèi)、方法來(lái)說(shuō),abstract關(guān)鍵字和final關(guān)鍵字不能同時(shí)使用,因?yàn)槊?。有抽象方法的abstract類(lèi)被繼承時(shí),其中的方法必須被子類(lèi)Override,而final不能被Override。
3、final用在變量上,表明當(dāng)前變量是一個(gè)終態(tài)的變量,是一個(gè)常量,這個(gè)變量的值一但被賦值后就不能被改變了。對(duì)于final類(lèi)型的成員變量的初始化方式: 1、聲明變量時(shí)直接賦值
final int X=1;
對(duì)于基本類(lèi)型來(lái)說(shuō),不可變說(shuō)的是變量當(dāng)中的數(shù)據(jù)不可改變
對(duì)于引用類(lèi)型來(lái)說(shuō),不可變說(shuō)的是變量當(dāng)中的地址值不可改變
2、在構(gòu)造方法中完成賦值,如果一個(gè)類(lèi)有多個(gè)構(gòu)造方法,就要保證在每個(gè)構(gòu)造方法中都要完成對(duì)該final類(lèi)型變量的初始化工作。
例:
public class FinalOriginalTest {
private final int a;
private String name;
public FinalOriginalTest(){ ?
a = 3;
}
public FinalOriginalTest(String name){ ?
this.name = name;
}
public static void main(String[] args){ ?
FinalOriginalTest ft = new FinalOriginalTest(); ?
FinalOriginalTest ft1 = new FinalOriginalTest("hello");
}}
問(wèn)題:上面的程序能否編譯通過(guò)? 解答:不能編譯通過(guò),可能沒(méi)有初始化變量a。因?yàn)閷?duì)于final類(lèi)型的成員變量的初始化,在構(gòu)造方法中完成賦值,如果一個(gè)類(lèi)有多個(gè)構(gòu)造方法,就要保證在每個(gè)構(gòu)造方法中都要完成對(duì)該final類(lèi)型變量的初始化工作。所以需要在public FinalOriginalTest(String name)構(gòu)造方法中給a賦值。
問(wèn)題:上面的程序中,修正問(wèn)題1之后,將private final int a;改為private static final int a;能否編譯通過(guò)? 解答:不能編譯通過(guò),因?yàn)閍是靜態(tài)變量,在這個(gè)類(lèi)還沒(méi)有實(shí)例化的時(shí)候,它的值就已經(jīng)有了。所以對(duì)于一個(gè)int類(lèi)型的static final類(lèi)型的變量a來(lái)說(shuō),我們只能在聲明的時(shí)候就給它賦值private static final int a = 3;然后把構(gòu)造方法里面的賦值給注釋掉,這樣編譯就能通過(guò)了。 總結(jié):對(duì)于final類(lèi)型的變量,對(duì)于不加static我們可以有兩種方式給它賦值:聲明變量時(shí)直接賦值;在構(gòu)造方法中完成賦值,如果一個(gè)類(lèi)有多個(gè)構(gòu)造方法,就要保證在每個(gè)構(gòu)造方法中都要完成對(duì)該final類(lèi)型變量的初始化工作。對(duì)于一個(gè)變量既是final又是static的,我們必須在聲明變量時(shí)直接賦值。