2009-09-04 68 views
10

要使用Java的一个人为的例子,下面的代码:在Java中,何时调用枚举常量的构造函数?

enum Commands{ 
    Save("S"); 
    File("F"); 

    private String shortCut; 
    private Commands(String shortCut){ this.shortCut = shortCut; } 
    public String getShortCut(){ return shortCut; } 
} 

我有以下的测试/驱动器代码:

public static void main(String args[]){ 
    System.out.println(Commands.Save.getShortCut()); 
} 

的问题是: 在Java中,对于构造函数时一个枚举常量被调用?在上面的例子中,我只使用了枚举常量Save。这是否意味着构造函数只被调用一次以创建Save?或者无论是Save还是File都可以一起构建?当enum类初始化

回答

11

构造函数被调用。无论实际引用和使用哪些成员,都将按成员声明顺序调用每个构造函数。

+0

是否当'ClassLoader'加载类的意思是,枚举的构造函数被调用?还是访问成员像保存和文件将调用构造函数?如果没有参数构造函数会发生什么? – 2016-11-23 05:13:42

+0

@MuhammadBabar一个类可以被加载而不被初始化。所以,不,这意味着当类被初始化时,每个成员都被构造。而且,正如我所说,成员是否被引用并不重要;它在类被初始化时被构造。你的第二个问题不清楚。如果没有为成员提供参数,则必须定义一个无参数构造函数,否则枚举将不会编译。你是这个意思吗? – erickson 2016-11-23 06:50:17

+0

但在枚举中,我们从来没有做SomeEnum(),即没有明确的初始化!在我的情况下,枚举只有一个变量即* instance *和一个没有参数的私有构造函数。这个构造函数什么时候被调用? – 2016-11-23 09:01:39

3

很像static() {...}方法中,当第一次初始化Enum类构造函数被调用。 Enum的所有实例都可以在使用之前创建。

public static void main(String args[]){ 
    System.out.println(Commands.Save.getShortCut()); 
} 

在此示例中,构造函数两个SaveFile调用Save.getShortCut()前都将完成。

他们依次调用,如在代码中声明。

2

双方将在类的初始化时间,有的说被创建。我想指出,这是在任何静态初始化器之前完成的,因此您可以在静态块中使用这些枚举。