在以下代码中:
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
有什么区别?为什么我有两个不同的输出?
答案 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.SECOND
和Rank.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
是静态实例。你可以认为它们有点像单身 - 你永远不会new
和Enum
。
所以我想说我有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
方法。