探究Java中的final關鍵字--------Java的系列學習之路(12)
前言----
國慶回家悠閒了七天,沒帶電腦,今天是軍訓的第一天(大三才入學軍訓,沒誰了),今晚趁教官去本部看匯演免訓一晚上,不過坑還是要補的,就出門奔教室了。歡迎轉載,轉載請註明來處
1.final用來修飾類,方法,變數
a.修飾類
我們用final修飾類,表明這個類不能被再繼承了,一旦某個類打算繼承final類時就會報錯
final class FuJian{
public FuJian() {
}
}
class FuZhou extends FuJian{
}
很明顯,FuZhou這個類要繼承FuJian這個final類時就會報錯。
b.修飾方法
總所周知,一個子類可以擁有一個和父類的同名方法。但是這樣一來,當我們通過子類的引用來呼叫這個方法時,我們呼叫到的版本是子類中的版本,也就是說此時該方法的父類版本在子類中已經被覆蓋掉了。為了把方法鎖定,防止子類去重寫它,就可以用final去修飾這個方法。
大家可以看一下,此時printPosition這個方法沒有被final修飾,子類FuZhou可以定義自己的printPosition版本。我們把FuJian中的printPosition用final修飾後再繼續看下:
這時會提示不能覆蓋父類中的final方法。
2.final修飾變數
final最經常用來修飾變數,因此我這邊獨立抽出來詳細講。
在這個程式碼中,我把area設定為final變數,把myFuJian設定為final引用,但是我在第10行打算改變area的值,在第12行打算改變
myFuJian這個引用的指向,使之指向新的FuJian物件;但是都報錯了,都提示不能改變!
對於一個final變數,如果這個變數是基本的資料型別(int,double 等),則其數值一旦在初始化就不能夠修改;如果這個變數是引用型別的變數(也就是自定義的類的引用),那麼我們在另其指向另外一個物件後就不應該另其指向另外一個物件(打個比喻:結婚了就不應該愛上其他人了呀)
提問:一個final引用被初始化後,不能再指向其他的物件,如果我嚴格遵循這點,但是我可以通過這個final引用去修改它初始化物件(哈哈哈哈,也可以理解成從一而終的那個物件)中的值嗎?
肯定可以。不論我的這個問題大家是否明白,大家看看下面的程式碼自然會明白我在說什麼了。
第11行嘗試讓myFuJian這個final引用另指其他物件會出錯,但是第13行我通過myFuJian.area = 199999卻是可以正常修改area的值,也就是final引用是可以對其指向的物件的內容進行修改的。