final—修飾符(關(guān)鍵字)如果一個(gè)類被聲明為final,意味著它不能再派生出新的子類,不能作為父類被繼承。因此一個(gè)類不能既被聲明為 abstract的,又被聲明為final的。將變量或方法聲明為final,可以保證它們在使用中不被改變。被聲明為final的變量必須在聲明時(shí)給定初值,而在以后的引用中只能讀取,不可修改。被聲明為final的方法也同樣只能使用,不能重載。
final變量定義: 變量一經(jīng)初始化就不能指向其它對象。指向的存儲(chǔ)地址不可修改,但指向的對象本身是可以修改的。
先說final變量初始化:
很多文章都這么說:其初始化可以在兩個(gè)地方,一是其定義處,二是在構(gòu)造函數(shù)中,兩者只能選其一。
胡說八道!
final變量可以在任何可以被始化的地方被始化,但只能被初始化一次.一旦被初始化后就不能再次賦
值(重新指向其它對象),作為成員變量一定要顯式初始化,而作為臨時(shí)變量則可以只定義不初始化(當(dāng)然也不能引用)
即使是作為一個(gè)類中的成員變量,也還可以在初始化塊中初始化,所以"其初始化可以在兩個(gè)地方,一是其定義處,
二是在構(gòu)造函數(shù)中,兩者只能選其一"是錯(cuò)誤的.
作為成員變量時(shí),final字段可以設(shè)計(jì)不變類,是不變類的一個(gè)必要條件但不是一個(gè)充要條件.至少可以保證字段不
會(huì)以setXXX()這樣的方式來改變.但無法保證字段本身不被修改(除非字段本身也是不變類);
對于方法參數(shù)的final變量:
對于方法參數(shù)的變量定義為final,90%以上的文章都說"當(dāng)你在方法中不需要改變作為參數(shù)的對象變量時(shí),明確使
用final進(jìn)行聲明,會(huì)防止你無意的修改而影響到調(diào)用方法外的變量。"
胡說八道!
我不知道這個(gè)修改是說重新賦值還是修改對象本身,但無論是哪種情況,上面的說法都是錯(cuò)誤的.
如果是說重新賦值,那么:
代碼如下public static void test(int[] x){
x = new int[]{1,2,3};
}
int[] out = new int[]{4,5,6};
test(out);
System.out.println(out[0]);
System.out.println(out[1]);
System.out.println(out[2]);
調(diào)用test(out);無論如何也不會(huì)影響到外面變量out.你加不加final根本沒有意義.final只會(huì)強(qiáng)迫方法內(nèi)
多聲明一個(gè)變量名而已,即把x = new int[]{1,2,3};改成int y = new int[]{1,2,3}; 其它沒有任何實(shí)際意義.
如果說是修改對象本身:
代碼如下 public static void test(final int[] x){難道你用final修飾就不可以修改了?所以說對于方法參數(shù)中final是為了不影響調(diào)用方法外的變量那是胡說八道的.
那我們到底為什么要對參數(shù)加上final?其實(shí)對方法參數(shù)加final和方法內(nèi)變量加上final的作用是相同的,即為了將它們
傳給內(nèi)部類回調(diào)方法:
代碼如下
|
新聞熱點(diǎn)
疑難解答
圖片精選