今天剛好有同學問了下Java編譯後産生的.class檔案名的問題,雖然一直都在使用Java做開發,但是之前對編譯後産生的.class檔案名的規範也基本沒做了解過,也真的是忏愧啊!今天無論如何都要總結下。下面是本人今天做的實驗
以及命名規則
實驗結果:
類名.class
觀察産生的.class檔案。目的是測試有實作接口類情況下産生的.class檔案 以及命名規則
實驗結果:
,檔案名為類名.class
觀察産生的.class檔案。目的是測試有繼承父類情況下産生的.class檔案 以及命名規則
實驗結果:
,檔案名為類名.class
對以上3點做個小結:
從以上3個實驗來看,編譯後産生的.class檔案跟它所實作的接口、繼承的父類都沒有關系,在這些情況下,它都隻産生一個.class檔案,而且檔案名就是類名.class
建立類ClassD,定義了一個普通内部類ClassDd, 觀察産生的.class檔案。目的是測試有内部類情況下産生的.class檔案以及命名規則
實驗結果:
從下圖可以看出,産生了2個.class檔案,ClassD.class 和 ClassD$ClassDd.class。
外部類名$内部類名.class,外部類和内部類名使用符号$隔開
建立類ClassD, 定義了一個普通内部類ClassDd,再在 ClassDd定義它的内部類 ClassDdd, 觀察産生的.class檔案。
目的是測試有内部類情況下産生的.class檔案以及命名規則
實驗結果:
、 ClassD$ClassDd.class $ClassDdd.class 。
對第4和第5個實驗做下小結。
以上這兩點都是驗證有普通内部類情況下産生哪些.class檔案以及命名規則如何。最後得出結論如下:
類個數:看定義類的個數,包括外部類和普通的内部類
.class檔案名的命名規則:外部類名 + $ + 内部類名 + .class,即等于當層内部類以及每一層外部類的名字疊加,但是每個類之間使用符号$隔開
建立類ClassE,定義了一個匿名内部類, 觀察産生的.class檔案。目的是測試有匿名内部類情況下産生的.class檔案以及命名規則
實驗結果:
從下圖可以看出,産生了2個.class檔案,ClassE.class 和 ClassE$1.class。
其實這個實驗結果跟第4個實驗的結果相似,不同的是,内部類由于沒有名字,是以采用數字來表示。這數字按照定義的匿名内部類的順序來一次增加的。
, 觀察産生的.class檔案。
目的是同一個.java檔案定義的類所産生的.class檔案情況
實驗結果:
最後總結:
1、編譯後産生的.class檔案個數:有多少個類,産生多少個.class檔案
.class檔案命名規則:
2.1普通内部類
外部類名 + $ + 内部類名 [ + $ + 内部類 名 + ...]+ .class,類名之間使用符号$隔開
例如:ClassD $ClassDd $ClassDdd.class,這裡 ClassDdd是對底層的普通内部類,它的父類 ClassDd,而 ClassDd的父類也是最外層的外部類 ClassD
2.2匿名内部類
外部類名 + $ + 數字 [ + $ + 數字 + ...]+ .class,類名之間使用符号$隔開,數字根據在外部類中定義的順序決定
例如:ClassE$1$1.class
3、同一個.java檔案中定義的其他非public聲明的類,都遵循以上2點規範
3、繼承、或者接口實作,不影響編譯産生的.class檔案個數和命名規則