問題:枚舉是一種特殊的數據類型,通常用來列舉有限個、同類型的常量。它能保證參數的安全性,如方法聲明傳入的參數,必須是指定枚舉中的常量。但使用枚舉會比使用靜態變量多消耗更多的內存,那爲何枚舉這麼耗內存?java
先看下這段代碼:數組
public class TestEnumClass { public enum MyColor {red, green, blue}; public static void main(String[] args) { MyColor mc = MyColor.red; MyColor mc1 = mc.red.green.blue; System.out.println(mc); System.out.println(mc1); switch(mc) { case red: System.out.println("red"); break; case green: System.out.println("green"); break; case blue: System.out.println("bule"); break; default: System.out.println("default"); } } }
枚舉原理:安全
在上面的代碼中咱們定義了 MyColor 這個枚舉類型:.net
public enum MyColor {red, green, blue};
一、找到此枚舉的 .class 字節碼文件code
二、使用 jad 反編譯 TestEnumClass$MyColor.class 文件,生成 TestEnumClass$MyColor.jad 文件對象
jad 的下載地址:點擊下載blog
jad 的使用方法:點擊瞭解繼承
打開 .jad 文件獲得源碼以下:內存
public static final class TestEnumClass$MyColor extends Enum { public static TestEnumClass$MyColor[] values() { TestEnumClass$MyColor atestenumclass$mycolor[]; int i; TestEnumClass$MyColor atestenumclass$mycolor1[]; System.arraycopy(atestenumclass$mycolor = ENUM$VALUES, 0, atestenumclass$mycolor1 = new TestEnumClass$MyColor[i = atestenumclass$mycolor.length], 0, i); return atestenumclass$mycolor1; } public static TestEnumClass$MyColor valueOf(String s) { return (TestEnumClass$MyColor)Enum.valueOf(TestEnumClass$MyColor, s); } public static final TestEnumClass$MyColor red; public static final TestEnumClass$MyColor green; public static final TestEnumClass$MyColor blue; private static final TestEnumClass$MyColor ENUM$VALUES[]; static { red = new TestEnumClass$MyColor("red", 0); green = new TestEnumClass$MyColor("green", 1); blue = new TestEnumClass$MyColor("blue", 2); ENUM$VALUES = (new TestEnumClass$MyColor[] { red, green, blue }); } private TestEnumClass$MyColor(String s, int i) { super(s, i); } }
從上面代碼來看,編譯器會將咱們定義的枚舉轉換成一個類,這個類繼承自 java.lang.Enum 類,此外,編譯器還會幫咱們生成多個枚舉類的實例,賦值給咱們定義的枚舉類型常量名(static靜態代碼塊裏),而且還聲明瞭一個枚舉對象的數組 ENUM$VALUES ,存放了全部的枚舉對象。諸多對象,對象數組,確實要比靜態變量佔據更多的內存。get