JAVA之private修饰成员方法默认是final型的?
Java之private修飾成員方法默認是final型的?
private修飾的成員方法默認是final型的?
- 用fianl聲明的成員方法是最終方法,最終方法不能被子類覆蓋(重寫)
從表面上看這個命題是錯誤的,private訪問修飾符修飾的成員方法怎么會跟final型方法有關系呢?但從最終方法的定義可以看出,不能被子類覆蓋的成員方法就是最終方法,而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()方法被子類重寫了,當執行到 Father f = new Son(); 語句,先執行Father類的構造方法,而構造方法的set()方法會調用子類的set()方法(多態的一種表現),輸出結果為:1
而實際輸出的結果為:3,因此private修飾的成員方法沒有被子類覆蓋,也就是說private修飾的成員方法默認是final型的。
- 在class文件中,有專門描述方法的方法表,方法表第一項就是訪問標志access_flags。其中標志值為0x0001的 ACC_PRIVATE代表方法為private;標志值為0x0002的 ACC_PUBLIC代表方法為方法為final,可以通過判斷access_flags的值判斷方法有哪些訪問標志。
通過jclasslib bytecode viewer看出,如下圖:
分析:
兩個方法一個是只有private修飾,另一個是有private和final 修飾,如果private修飾的成員方法默認是final型的,那兩個方法的access_flags值應該一樣的,可結果并非如此,由此可以說明private修飾的成員方法默認是final型的是錯誤的。
如何理解 :類中所有的private方法都隱式的指定為是final的 為什么這么說?有理論依據么
正解,這段話來自《Java編程思想》多態那一章節,的確不太明白作者為什么要這樣子去說。
這種說法完全沒有根據,屬于誤人子弟 private和final沒關系,是兩回事 拿屬性來說可能更容易理解一些,雖然private不能訪問,但通過反射修改訪問權限還是可以訪問修改的,但加了final,即使可以訪問了也修改不了值,這就是區別 自己用反射打印一下結果就知道了,或者用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();}} } 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的JAVA之private修饰成员方法默认是final型的?的全部內容,希望文章能夠幫你解決所遇到的問題。