java中 private final_Java笔记:final与private关键字
記錄一個(gè)有趣的現(xiàn)象,private修飾的方法子類是訪問不了的,且類中所有private修飾的方法都隱式的指定為final(可以對(duì)private方法添加final修飾詞,但是這并不能給該方法增加任何額外的意義),final修飾的方法是不可以被重寫的。但是如果在繼承中我們?cè)噲D"覆蓋"一個(gè)private方法,似乎是奏效的,而且編譯器不會(huì)報(bào)錯(cuò)。例如:
class Foo{
private final void set() {
System.out.println("f");
}
}
public class Son extends Foo{
public final void set() {
System.out.println("s");
}
public static void main(String[] args) {
Son s = new Son();
s.set();
}
}
編譯器沒有報(bào)錯(cuò),并且運(yùn)行后輸出s。
覆蓋只有在某方法是基類的接口(非interface)的一部分時(shí)才會(huì)出現(xiàn)。即必須能將一個(gè)對(duì)象向上轉(zhuǎn)型為它的基本類型并調(diào)用相同的方法。如果某個(gè)方法為private,它就不是基類的接口的一部分。它只是隱藏于類中的程序代碼,只不過名稱相同而已。但如果在子類中以相同的名稱生成一個(gè)public,protected或包訪問權(quán)限方法的話,該方法就不會(huì)產(chǎn)生在基類中出現(xiàn)的“僅具有相同名稱”的情況。此時(shí),你并沒有覆蓋該方法,僅是生成了一個(gè)新方法。
再看一個(gè)例子,只有非private的方法才可以被覆蓋
class Son extends Foo{
public void set() {
System.out.println("s");
}
}
public class Foo{
private void set() {
System.out.println("f");
}
public static void main(String[] args) {
Foo s = new Son();
s.set();
}
}
我們期望的是輸出s,但是結(jié)果輸出的f,由于private的方法默認(rèn)修飾為final方法,而且對(duì)子類是屏蔽的,不能被重載。因此,在這種情況下子類的set方法是個(gè)非覆蓋的新方法。
總結(jié)
以上是生活随笔為你收集整理的java中 private final_Java笔记:final与private关键字的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 自动点击器如何设置第二个点
- 下一篇: 掌握java_如何才算掌握Java,大家