主要方法在枚举和类中的工作方式不同吗?

时间:2015-05-29 11:34:52

标签: java oop enums static main

在以下代码中:

company.getAnnouncements().get(0).cent

这给出了以下输出:

enum Rank {
    FIRST(20), SECOND(0), THIRD(8);
    Rank(int value) {
        System.out.print(value);
    } 

    public static void main (String[] args) {
        System.out.println(" " + Rank.values().length);
    }
}

但是,如果2008 3 方法在其他类中声明如下:

main

输出仅为class XYZ { public static void main (String[] args) { System.out.println("\n" + Rank.values().length); } } 。 枚举中的3和班级中的main有什么区别?为什么我有两个不同的输出?

4 个答案:

答案 0 :(得分:4)

枚举常数为static。它们在类初始化时初始化(enum只是一个类)。这意味着当您调用引用main类型的类的enum时,将使用构造函数创建所有值。

如果另一个类没有以任何方式引用enum,则不会打印任何输出,因为没有评估enum

答案 1 :(得分:2)

类和枚举之间最重要的区别是ENUM具有预定义的实例。当枚举加载它执行Enum的构造函数时,正在打印该值,以便创建排名,而排名又打印其值。对普通类执行main时没有方法实现,也没有自动创建对象。你必须创建该类的实例。希望你明白我的观点。

有关Enum

的更多详情

因此main方法没有区别,但是您可以看到差异,因为在VM加载枚举时会创建枚举实例。 :)

按照@ Blip的要求,我正在更新我的答案,所以即使你把主要方法分开,它也不会改变一件事。由于主要方法仍然引用Rank枚举,因此Enum正在被运行时加载,因为我们已经知道Enums的实例将在加载类时创建,它仍将执行构造函数,因此您将看到输出为2008 3

答案 2 :(得分:2)

您实际上正在查看枚举打印的构造函数。

因此,在开始时Rank.FIRST已创建,System.out.print(value);将被调用20。

然后Rank.SECONDRank.THIRD发生同样的事情;这都是由类加载器完成的,因为{1}}正在使用Rank枚举。

由于EnumCreation中的构造函数使用Rank而不是print,因此它们都显示在一行上。

然后当println进入主方法时,会打印一个空格,后跟EnumCreation和换行符。

Rank.values().length进入主方法时,它应该做同样的事情;但它会打印换行而不是空格。

从课堂观点来看,你有3个班级。 Rank,EnumCreation和XYZ。 Rank和EnumCreation碰巧共享1 * .java文件。

希望有助于澄清事情!

答案 3 :(得分:0)

Class初始化程序与实例(或Object)初始化程序之间存在差异。加载Class时会运行Class初始化程序,这通常在第一次引用时发生。 Object初始值设定项是仅在使用new关键字创建新实例时运行的构造函数(禁止反射)。

Enum是静态实例。你可以认为它们有点像单身 - 你永远不会newEnum

所以我想说我有Class定义

public class Foo {
    static{
        System.out.println("Someone loaded the class");
    }

    public Foo(){
        System.out.print("Foo constructor");
    }

    public static void main(String[] args) {
        System.out.println("Making Foo");
        Foo foo = new Foo();

    }
}

输出

Someone loaded the class
Making Foo
Foo constructor

Enum将像Foo中的静态块一样工作。

这是一个Enum示例

public enum FooValues {
    HELLO,GOODBYE,WHAT;

    private FooValues(){
        System.out.println(this);
    }

    public static void main(String[] args) {
        System.out.println("in main");
    }
}

这给出了

HELLO
GOODBYE
WHAT
in main

因为加载Enum时,所有值在类加载阶段初始化,然后运行main方法。