天天看點

Java編譯後産生class檔案的命名規則

今天剛好有同學問了下Java編譯後産生的.class檔案名的問題,雖然一直都在使用Java做開發,但是之前對編譯後産生的.class檔案名的規範也基本沒做了解過,也真的是忏愧啊!今天無論如何都要總結下。下面是本人今天做的實驗

以及命名規則

實驗結果:

類名.class

Java編譯後産生class檔案的命名規則

觀察産生的.class檔案。目的是測試有實作接口類情況下産生的.class檔案 以及命名規則

實驗結果:

,檔案名為類名.class

Java編譯後産生class檔案的命名規則

觀察産生的.class檔案。目的是測試有繼承父類情況下産生的.class檔案 以及命名規則

實驗結果:

,檔案名為類名.class

Java編譯後産生class檔案的命名規則

對以上3點做個小結:

從以上3個實驗來看,編譯後産生的.class檔案跟它所實作的接口、繼承的父類都沒有關系,在這些情況下,它都隻産生一個.class檔案,而且檔案名就是類名.class

建立類ClassD,定義了一個普通内部類ClassDd, 觀察産生的.class檔案。目的是測試有内部類情況下産生的.class檔案以及命名規則

實驗結果:

從下圖可以看出,産生了2個.class檔案,ClassD.class 和 ClassD$ClassDd.class。

外部類名$内部類名.class,外部類和内部類名使用符号$隔開

Java編譯後産生class檔案的命名規則

建立類ClassD, 定義了一個普通内部類ClassDd,再在 ClassDd定義它的内部類 ClassDdd, 觀察産生的.class檔案。

目的是測試有内部類情況下産生的.class檔案以及命名規則

實驗結果:

、 ClassD$ClassDd.class $ClassDdd.class 。

Java編譯後産生class檔案的命名規則

對第4和第5個實驗做下小結。

以上這兩點都是驗證有普通内部類情況下産生哪些.class檔案以及命名規則如何。最後得出結論如下:

類個數:看定義類的個數,包括外部類和普通的内部類

.class檔案名的命名規則:外部類名 + $ + 内部類名 + .class,即等于當層内部類以及每一層外部類的名字疊加,但是每個類之間使用符号$隔開

建立類ClassE,定義了一個匿名内部類, 觀察産生的.class檔案。目的是測試有匿名内部類情況下産生的.class檔案以及命名規則

實驗結果:

從下圖可以看出,産生了2個.class檔案,ClassE.class 和 ClassE$1.class。

其實這個實驗結果跟第4個實驗的結果相似,不同的是,内部類由于沒有名字,是以采用數字來表示。這數字按照定義的匿名内部類的順序來一次增加的。

Java編譯後産生class檔案的命名規則
Java編譯後産生class檔案的命名規則

, 觀察産生的.class檔案。

目的是同一個.java檔案定義的類所産生的.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檔案個數和命名規則