1. 程式人生 > >Java編譯後產生class檔案的命名規則

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

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

%26nbsp; 1、建立類ClassA,觀察產生的.class檔案。目的是測試沒有任何繼承、實現類以及內部類等情況下產生的.class檔案以及命名規則 實驗結果: 從下圖可以看出,只產生了一個.class檔案,檔名為類名.class %26nbsp; 2、建立類ClassB,觀察產生的.class檔案。目的是測試有實現介面類情況下產生的.class檔案以及命名規則 實驗結果: 從下圖可以看出,只產生了一個.class檔案,檔名為類名.class
%26nbsp; 3、建立類ClassC,觀察產生的.class檔案。目的是測試有繼承父類情況下產生的.class檔案以及命名規則 實驗結果: 從下圖可以看出,只產生了一個.class檔案,檔名為類名.class %26nbsp; 對以上3點做個小結: 從以上3個實驗來看,編譯後產生的.class檔案跟它所實現的介面、繼承的父類都沒有關係,在這些情況下,它都只產生一個.class檔案,而且檔名就是類名.class
4、建立類ClassD,定義了一個普通內部類ClassDd,觀察產生的.class檔案。目的是測試有內部類情況下產生的.class檔案以及命名規則 實驗結果: 從下圖可以看出,產生了2個.class檔案,ClassD.class 和 ClassD$ClassDd.class。 這說明產生的.class檔案與內部類有關係。外部類產生的檔案跟上面的3個實驗結果一樣,都是類名.class,而內部類,則採用了外部類名$內部類名.class,外部類和內部類名使用符號$隔開
注意:這裡的外部類都是相對而言 %26nbsp; 5、建立類ClassD,定義了一個普通內部類ClassDd,再在ClassDd定義它的內部類ClassDdd,觀察產生的.class檔案。 目的是測試有內部類情況下產生的.class檔案以及命名規則 實驗結果: 從下圖可以看出,產生了3個.class檔案,ClassD.class 、 ClassD$ClassDd.class、 ClassD$ClassDd.class$ClassDdd.class 這個實驗結果跟上面的第四個實驗是一樣的,只是這次的第2層內部類檔案是在第1層內部類的基礎上增加自己的類名。 注意:這裡的外部類都是相對而言 %26nbsp; %26nbsp;
%26nbsp; %26nbsp; 對第4和第5個實驗做下小結。 以上這兩點都是驗證有普通內部類情況下產生哪些.class檔案以及命名規則如何。最後得出結論如下: 類個數:看定義類的個數,包括外部類和普通的內部類 .class檔名的命名規則:外部類名 + $ + 內部類名 + .class,即等於當層內部類以及每一層外部類的名字疊加,但是每個類之間使用符號$隔開 %26nbsp; %26nbsp; %26nbsp; 6、建立類ClassE,定義了一個匿名內部類,觀察產生的.class檔案。目的是測試有匿名內部類情況下產生的.class檔案以及命名規則 實驗結果: 從下圖可以看出,產生了2個.class檔案,ClassE.class 和 ClassE$1.class。 其實這個實驗結果跟第4個實驗的結果相似,不同的是,內部類由於沒有名字,因此採用數字來表示。這數字按照定義的匿名內部類的順序來一次增加的。 %26nbsp; %26nbsp; %26nbsp; 7、建立類ClassF,並在同一個.java檔案中定義另外一個類ClassFf觀察產生的.class檔案。 目的是同一個.java檔案定義的類所產生的.class檔案情況 實驗結果: 同一個.java檔案定義的類所產生的.class檔案情況,符合上面上面驗證的規範。 %26nbsp; %26nbsp; %26nbsp; %26nbsp; 最後總結: 1、編譯後產生的.class檔案個數:有多少個類,產生多少個.class檔案 %26nbsp; 2、.class檔案命名規則: %26nbsp; %26nbsp; %26nbsp;2.1普通內部類 %26nbsp; %26nbsp; %26nbsp; %26nbsp; %26nbsp; %26nbsp;外部類名 + $ + 內部類名%26nbsp;[+%26nbsp;$ + 內部類%26nbsp;+ ...]+%26nbsp;.class,類名之間使用符號$隔開 %26nbsp; %26nbsp; %26nbsp; %26nbsp; %26nbsp; %26nbsp;例如:ClassD$ClassDd$ClassDdd.class,這裡ClassDdd是對底層的普通內部類,它的父類ClassDd,而ClassDd的父類也是最外層的外部類ClassD %26nbsp; %26nbsp; %26nbsp;2.2匿名內部類 %26nbsp; %26nbsp; %26nbsp; %26nbsp; %26nbsp;%26nbsp;%26nbsp;外部類名 + $ + 數字%26nbsp;[+%26nbsp;$ +%26nbsp;數字%26nbsp;+ ...]+%26nbsp;.class,類名之間使用符號$隔開,數字根據在外部類中定義的順序決定 %26nbsp; %26nbsp; %26nbsp; %26nbsp; %26nbsp; %26nbsp;例如:ClassE$1$1.class %26nbsp; 3、同一個.java檔案中定義的其他非public宣告的類,都遵循以上2點規範 %26nbsp; 3、繼承、或者介面實現,不影響編譯產生的.class檔案個數和命名規則 %26nbsp;