final方法是不能被覆蓋的方法,但可以被重載(即方法名相同而參數(shù)不同).
另外有一個(gè)很容易被搞糊涂的地方是當(dāng)方法是private final時(shí).首先要知道的是:當(dāng)一個(gè)方法被聲明為private時(shí),該方法隱式的指定為final!說到這里,也許你就會(huì)有產(chǎn)生一個(gè)疑問,既然private被隱式地指定為fianl,那么為什么它可以被覆蓋?就象下面的程序?yàn)槭裁纯梢赃\(yùn)行?
class Father {
private final void f() { //即使這里你不顯示的加上final,它隱式的就是final
System.out.println("Father.f()");
}
}
public class Son extends Father {
private final void f() { //看上去象不象覆蓋??
System.out.println("Son.f()");
}
void test() {
f();
}
public static void main(String[] a) {
new Son().test();
}
} //本程序的輸出結(jié)果為: Son.f() ???
在闡明這個(gè)問題前,先來了解一下什么叫做覆蓋.
“覆蓋”只有在某方法是基類接口的一部分時(shí)才發(fā)生。即,必須能將一個(gè)對象向上轉(zhuǎn)型為它的基類并調(diào)用相同的方法.如果一個(gè)方法是private的,它就不是基類接口的一部分,它只是隱藏在類里面的一些代碼罷了!
正如我們剛才說的,private默認(rèn)的是final,可見,private方法是不能被覆蓋。但是因?yàn)樗梢砸韵嗤拿执嬖谟谧宇愔校?#8220;看上去”它被“覆蓋”了。從子類來看,它根本不知道父類有這個(gè)方法(因?yàn)閜rivate的權(quán)限是定義它的類本身才能使用它,因此private方法就不能被帶到子類中),而父類也不知道子類有這個(gè)方法,它們是獨(dú)自存在于各自類的內(nèi)部的,與接口無關(guān)。所以,我們并沒有覆蓋private方法,只是創(chuàng)建了一個(gè)新的方法,而碰巧也有那個(gè)名字!