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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

包含内部类的.java文件编译后生成几个.class文件

發布時間:2025/3/12 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 包含内部类的.java文件编译后生成几个.class文件 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

如果一個類有內部類,編譯將生成幾個字節碼文件,規則是怎樣呢?

寫在前,自己動手豐衣足食,結論只有個人實驗支持,沒有官方數據支持,歡迎自行查閱文檔然后來指正,輕噴,謝謝。

1.普通類包含內部類的樣例

public class Test319 {private static class StaticInner{ }//靜態內部類private class Inner{}//成員內部類public void outerFunction1(){class PartInner3{}//局部內部類3}public void outerFunction2(){class PartInner1{}//局部內部類1class PartInner2{}//局部內部類2}public Thread thread1 = new Thread(new Runnable() {//匿名內部類1@Overridepublic void run() {}}, "thread1");public Thread thread2 = new Thread(new Runnable() {//匿名內部類2@Overridepublic void run() {}}, "thread2");public Thread thread3 = new Thread(()->{//匿名內部類(使用lambda表達式)},"thread3"); }

2.編譯后生成的文件目錄

3.小總結

首先,包括外部類在內一共有9個類,而目錄中只有8個class文件,可以看出一套規律:全部內部類編譯后都會生成字節碼文件,但是匿名內部類有個特點
1.成員內部類:外部類名后加一個dollar接內部類名
2.靜態內部類:和成員內部類一樣(畢竟都是外部類的成員,靜態非靜態而已)
3.局部內部類:在dollar后比成員內部類多了個數字
4.匿名內部類:dollar后只有一個數字,如果使用lambda表達式創建匿名內部類將不生成class文件,否則會生成
其次,局部內部類和不使用lambda表達式創建的匿名內部類,他們的class文件名都包含數字,數字究竟是什么含義?(在沒有查資料的情況下,首先猜測,數字順序就是內部類聲明的順序)先用兩個匿名內部類來進行測試,后面再說局部內部類的問題。

4.關于文件名中數字的測試(匿名內部類)

第一步,為了觀察方便給代碼做些調整,加入簡單的方法體。

public Thread thread1 = new Thread(new Runnable() {//匿名內部類1@Overridepublic void run() {System.out.println("Hello World");}}, "thread1");public Thread thread2 = new Thread(new Runnable() {//匿名內部類2@Overridepublic void run() {int i = 10;i += 1;}}, "thread2");

先聲明的進行print操作,后聲明的進行int加法計算。通過javap命令對兩個字節碼進行解釋,結果如下:


由上述過程可看出,小數字的進行了print,大數字的進行了int+1,而定義的順序也就是print操作的在前,int+1操作的在后。
第二步,使用相同手法,在.java文件中調換兩個操作的聲明順序,即先聲明的進行int+1操作,后聲明的進行print操作,得到了相同的結論,具體不再贅述。
通過反復實驗,結果一致。但因為沒有查閱官方文檔,先提出一個我自己的想法:數字順序是內部類的聲明順序,同時作為區分匿名內部類的依據

5.關于局部內部類

再回過頭說局部內部類的問題。匿名內部類沒有名字自然需要數字區分,那么如果其他有名字的內部類名稱重復怎么辦(此情況只能發生于局部內部類)?同樣可以先得出一個結論,數字是區分重名局部內部類的依據
但是我發現數字順序并不是聲明順序……不再贅述實驗過程,簡單來說在外部類的兩個方法里定義名稱相同的局部內部類,調換兩個方法的聲明位置。編譯后文件目錄如下:

這里看出數字不再是聲明順序,定義了兩個局部內部類的方法我是后聲明的,數字反而變成了1而不是2。有種被逗了的感覺。秉持著“死也不去查資料先作作看結果”的精神,實驗繼續……(*其實是我不知道該去看官方的哪個文檔,也懶得去找*)
新定義和新編譯生成的文件目錄如下:

public class Test319 {public void outerFunction1(){class PartInner1{}}public void outerFunction2(){class PartInner1{}class PartInner2{}}public void outerFunction3(){class PartInner1{}class PartInner2{}class PartInner3{}} }


差一點,我就以為數字順序是內部類所在方法定義的逆序了。還好所做了幾組實驗,畢竟自己歸納就已經很不科學了,更不能僅從一組實驗就得出結論。中間步驟不說了,直接來看最后一組實驗:

public class Test319 {public void outerFunction1(){class PartInner1{}}public void outerFunction3(){class PartInner1{}class PartInner2{}class PartInner3{}}public void outerFunction2(){class PartInner1{}class PartInner2{}class PartInner3{}class PartInner4{}class PartInner5{}}public void outerFunction0(){class PartInner1{}class PartInner2{}class PartInner3{}class PartInner4{}} }


具體的自行細品吧,直接說我的結論:定義內部類個數最多的方法,它里面的內部類生成的class文件,名稱里的數字就是最小的。

6.最終總結

大致總結在上面的【3】,再總結一下關于數字的事情。
首先關于為什么會有數字,因為匿名內部類沒名字(廢話。。。),局部內部類名稱可能相同,所以數字用來做不同內部類之間的區分,這也是為什么只有他們兩個編譯出來的字節碼文件,名稱中帶有數字。
其次關于數字順序,匿名內部類,數字順序是聲明順序;局部內部類,定義內部類個數最多的方法,它里面的內部類生成的class文件,名稱里的數字就是最小的。
以上是個人實驗的結果,未查閱文檔,有一定的不可靠性。但是懶得去找和讀文檔了,歡迎指正。

總結

以上是生活随笔為你收集整理的包含内部类的.java文件编译后生成几个.class文件的全部內容,希望文章能夠幫你解決所遇到的問題。

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