日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JAVA之private修饰成员方法默认是final型的?

發布時間:2025/3/12 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的值判斷方法有哪些訪問標志。
public class Test {private void test(){}private final void test2(){} }

通過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型的?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。