2017-09-25 52 views
1

訪問一個枚舉的構造,我想知道枚舉內部是如何在Java中實現,我用下面的例子如何枚舉在內部實現,以及如何在Java

public enum MyEnum { 
    MyEnum(){ 
    System.out.println("HelloWorld"); 
    } 
} 

由於上述不列入嘗試拋出任何編譯錯誤我想知道如何調用MyEnum()構造函數。

+0

構造函數在創建枚舉實例時調用。如果你在你的枚舉中聲明瞭一些實例,每個實例都會調用構造函數。 – khelwood

+1

您不必稱呼它。它在成員初始化時自動調用。由於您目前沒有任何成員,因此永遠不會被召喚。不清楚你在問什麼。 – EJP

回答

4

枚舉類型的構造函數必須是包私有或私有訪問。它會自動創建在枚舉主體開始處定義的常量。你不能自己調用​​一個枚舉構造函數。

您不能從該枚舉之外訪問該構造函數。你可以通過實際定義一個枚舉常量來訪問它。

public enum Planet { 

    MERCURY (3.303e+23, 2.4397e6), 
    VENUS (4.869e+24, 6.0518e6), 
    EARTH (5.976e+24, 6.37814e6), 
    MARS (6.421e+23, 3.3972e6), 
    JUPITER (1.9e+27, 7.1492e7), 
    SATURN (5.688e+26, 6.0268e7), 
    URANUS (8.686e+25, 2.5559e7), 
    NEPTUNE (1.024e+26, 2.4746e7); 

    private final double mass; 
    private final double radius; 

    Planet(double mass, double radius) { 
     this.mass = mass; 
     this.radius = radius; 
    } 
} 

有關枚舉更多例子請參閱: https://docs.oracle.com/javase/tutorial/java/javaOO/enum.html

2

的Java實現enum像延伸java.lang.Enum作爲其基類的類。它的大部分功能都來自Java編譯器的支持,其中包括確保您不能通過運算符new實例化enum類,並且enum值屬性構造。

如果你想看到MyEnum的構造函數調用,至少一個enum值添加到它:

public enum MyEnum { 
    VALUE1; 
    MyEnum(){ 
     System.out.println("HelloWorld"); 
    } 
} 

注:同時您還可以使用反射來創建enum的‘非法’的實例,這不應該在任何生產類設置中完成,因爲它會破壞有關enum成員資格的假設。

0

enum s是特殊的類,它是單例的泛化併爲每個常量提供一個實例。在內部,這些字段被視爲public static final,其類型與其定義的enum相同。而且,枚舉的構造函數被視爲private,因此您不能從enum MyEnum以外調用MyEnum()構造函數。構造函數用於我們希望將某些屬性附加到常量的情況。例如,請考慮以下:

public enum MyEnum { 
    VAL_A("First Value"), 
    VAL_B("Second Value"); 

    private final String fullName; 

    MyEnum(String fullName){ 
     this.fullName = fullName; 
    } 

    public String getFullName() { 
     return fullName; 
    } 
} 

然後,我們可以做這樣MyEnum.VAL_A.getFullName();

0

枚舉的東西是用類概念內部實現。每個枚舉常量都被隱式聲明爲public static final。枚舉常量是靜態的,所以我們可以通過使用枚舉名來訪問它。

例如:

final class Color extends java.lang.Enum { 
    public static final Color Red = new Color(); 
    public static final Color Green= new Color(); 
    public static final Color Blue= new Color(); 
} 

所有枚舉常數將在類加載的自動且因此構造將在枚舉的時間被執行的時間被創建:

enum Color{ 
    Red,Green,Blue; 
} 

在內部作爲實現類加載每個枚舉常量。我們不能顯式創建枚舉對象,因此我們不能直接調用構造函數。