final類
被final關(guān)鍵字修飾的類就是fianl類,final類無(wú)法被繼承。final類的所有方法在默認(rèn)情況下都會(huì)是final級(jí)別,因?yàn)轭惗紵o(wú)法被繼承,方法自然也無(wú)法被繼承。但是fianl類的域可以根據(jù)自己意愿選擇是否為final。
public final class FinalTest {
}
final方法
被final修飾的方法就是final方法,用final修飾方法的原因無(wú)非兩個(gè),第一就是將方法鎖定,讓其無(wú)法被繼承以防止任何繼承類修改它的含義。第二是出于效率的考慮(解釋暫無(wú))
final和private關(guān)鍵字
類中所有的private方法默認(rèn)情況下都是final級(jí)別的,也就是無(wú)法被繼承,因?yàn)閜rivate關(guān)鍵字將方法的權(quán)限限定在了當(dāng)前類中,其他類是無(wú)法直接訪問這個(gè)方法的。
這里有一點(diǎn)容易造成疑惑,那就是即使private方法是fianl級(jí)別的,表示它無(wú)法別繼承,但是如果我們繼承這個(gè)類,我們發(fā)現(xiàn),在子類中似乎仍然可以覆蓋這個(gè)方法,注意這里其實(shí)并不是覆蓋,而只是在子類中創(chuàng)建了一個(gè)和父類有著相同名字和參數(shù)列表的方法。它并不是從父類中繼承而來(lái)的。
覆蓋只有某一個(gè)方法是父類接口的一部分時(shí)才能稱之為覆蓋,也就是說(shuō),如果子類繼承了父類,那么在創(chuàng)建對(duì)象的時(shí)候能夠向上轉(zhuǎn)型并且調(diào)用到父類的原始方法。但是很明顯,在子類中是絕對(duì)無(wú)法調(diào)用到父類中的private方法的
final數(shù)據(jù)
final數(shù)據(jù)有兩種形式
- 以基本數(shù)據(jù)類型修飾的數(shù)據(jù)
- 以引用類型修飾的數(shù)據(jù)
以基本數(shù)據(jù)類型修飾的數(shù)據(jù)用來(lái)表示常量,而且和static關(guān)鍵字聯(lián)合使用,定義時(shí)必須對(duì)其進(jìn)行初始化。
public static final double PAI =3.14;
帶有static和final的編譯時(shí)常量的命名應(yīng)該全部使用大寫,字與字之間使用下劃線分開。
對(duì)于基本數(shù)據(jù)類型的final,它的值在程序中是不能改變的。除非去定義它的地方進(jìn)行修改。
引用數(shù)據(jù)類型的final則表示的是這個(gè)引用的地址不能改變,也就是說(shuō)一旦引用類型的final指向了一個(gè)對(duì)象,就不能改變而指向另外一個(gè)對(duì)象了。但同時(shí)final指向的這個(gè)引用雖然不能改變,但是引用指向的這個(gè)對(duì)象本身里面的內(nèi)容是可以改變的。
注意:我們不能因?yàn)槟硞€(gè)數(shù)據(jù)是final的,就認(rèn)為在編譯期間就能知道它的值。實(shí)際上他的值是可以在運(yùn)行時(shí)給出的。
static Random random = new Random(20);
public static final double PAI = random.nextDouble();
這種情況下,PAI的值只有在運(yùn)行時(shí)才被確定。
但是普遍情況下我們使用定義時(shí)就賦值的常量的情況較多。
一個(gè)即使static又是final的域占用一段不能改變的存儲(chǔ)空間。