在以下代码中:
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
和类中的main
之间有什么区别?为什么我有两个不同的输出?
枚举常量是static
。它们是在类初始化时初始化的(enum
只是一个类(。这意味着,当您调用引用enum
类型的类的main
时,所有值都是使用构造函数创建的。
如果其他类没有以任何方式引用enum
,则不会打印任何输出,因为没有评估enum
。
您实际上看到了枚举打印的构造函数。
因此在开始时CCD_ 11被创建并且CCD_。
那么CCD_ 13和CCD_;这都是由类加载器完成的,因为秩枚举正由CCD_ 15使用。
由于Rank
中的构造函数使用print
而不是println
,所以它们都显示在一行上。
然后,当EnumCreation
进入主方法时,它会打印一个空格,后面跟着Rank.values().length
和一条换行符。
当XYZ
进入主方法时,它应该做同样的事情;但它会打印一个换行符而不是空格。
不过,从类的角度来看,您有3个类。等级、枚举创建和XYZ。Rank和EnumCreation恰好共享1*.java文件。
希望这有助于澄清问题!
类和枚举之间最显著的区别是enum预定义了实例。在枚举加载时打印该值。它执行枚举的构造函数,以创建列组,进而打印其值。而为普通类执行main没有方法实现,也没有自动创建对象。您必须创建类的实例。希望你明白我的意思。
Enum 的更多详细信息
因此,主方法中没有差异,但差异对您来说是可见的,因为枚举的实例是在VM加载枚举时创建的。:(
根据@Blip的请求,我正在更新我的答案,所以即使你把主方法分开,它也不会改变任何事情。作为仍引用Rank枚举的主要方法,因此enum由运行时加载,并且我们已经知道,enum的实例将在加载类时创建,它仍将执行构造函数,因此您将看到输出为2008 3
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();
}
}
输出为
有人加载了类制作FooFoo构造函数
CCD_ 32将像CCD_ 33中的静态块一样工作。
这是一个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再见什么主要
因为加载Enum
时,所有值都会在类加载阶段初始化,然后运行main
方法。