JAVA之private修饰成员方法默认是final型的?
Java之private修飾成員方法默認(rèn)是final型的?
private修飾的成員方法默認(rèn)是final型的?
- 用fianl聲明的成員方法是最終方法,最終方法不能被子類覆蓋(重寫(xiě))
從表面上看這個(gè)命題是錯(cuò)誤的,private訪問(wèn)修飾符修飾的成員方法怎么會(huì)跟final型方法有關(guān)系呢?但從最終方法的定義可以看出,不能被子類覆蓋的成員方法就是最終方法,而private修飾的成員方法就不能被子類覆蓋,證明如下:
//證明private修飾的成員方法不能被子類覆蓋 class Father{int m = 0;private void set() {m += 1;}public Father() {set();} } public class Son extends Father{private void set() {m += 3;}public static void main(String[] args) {Father f = new Son();System.out.println(f.m);} }輸出:3
分析:
如果private修飾的set()方法被子類重寫(xiě)了,當(dāng)執(zhí)行到 Father f = new Son(); 語(yǔ)句,先執(zhí)行Father類的構(gòu)造方法,而構(gòu)造方法的set()方法會(huì)調(diào)用子類的set()方法(多態(tài)的一種表現(xiàn)),輸出結(jié)果為:1
而實(shí)際輸出的結(jié)果為:3,因此private修飾的成員方法沒(méi)有被子類覆蓋,也就是說(shuō)private修飾的成員方法默認(rèn)是final型的。
- 在class文件中,有專門(mén)描述方法的方法表,方法表第一項(xiàng)就是訪問(wèn)標(biāo)志access_flags。其中標(biāo)志值為0x0001的 ACC_PRIVATE代表方法為private;標(biāo)志值為0x0002的 ACC_PUBLIC代表方法為方法為final,可以通過(guò)判斷access_flags的值判斷方法有哪些訪問(wèn)標(biāo)志。
通過(guò)jclasslib bytecode viewer看出,如下圖:
分析:
兩個(gè)方法一個(gè)是只有private修飾,另一個(gè)是有private和final 修飾,如果private修飾的成員方法默認(rèn)是final型的,那兩個(gè)方法的access_flags值應(yīng)該一樣的,可結(jié)果并非如此,由此可以說(shuō)明private修飾的成員方法默認(rèn)是final型的是錯(cuò)誤的。
如何理解 :類中所有的private方法都隱式的指定為是final的 為什么這么說(shuō)?有理論依據(jù)么
正解,這段話來(lái)自《Java編程思想》多態(tài)那一章節(jié),的確不太明白作者為什么要這樣子去說(shuō)。
這種說(shuō)法完全沒(méi)有根據(jù),屬于誤人子弟 private和final沒(méi)關(guān)系,是兩回事 拿屬性來(lái)說(shuō)可能更容易理解一些,雖然private不能訪問(wèn),但通過(guò)反射修改訪問(wèn)權(quán)限還是可以訪問(wèn)修改的,但加了final,即使可以訪問(wèn)了也修改不了值,這就是區(qū)別 自己用反射打印一下結(jié)果就知道了,或者用javap反編譯看一下偽代碼
public class Sample {static class ATest {private void test1() {}private final void test2() {}}public static void main(String[] args) {try {Class<?> c = Sample.ATest.class;Method f1 = c.getDeclaredMethod("test1", null);System.out.printf("%s:%d\n", f1.getName(), f1.getModifiers()); //private修飾Method f2 = c.getDeclaredMethod("test2", null);System.out.printf("%s:%d\n", f2.getName(), f2.getModifiers()); //private final修飾System.out.printf("private:%d\n", Modifier.PRIVATE); //private的修飾值System.out.printf("final:%d\n", Modifier.FINAL); //final的修飾值System.out.printf("private & final:%d\n", Modifier.PRIVATE|Modifier.FINAL); //private和final一起的修飾值} catch (Throwable e) {e.printStackTrace();}} } 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的JAVA之private修饰成员方法默认是final型的?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。